ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

تحسين الرسم البياني TensorFlow مع Grappler

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تنزيل دفتر الملاحظات

نظرة عامة

يستخدم TensorFlow كلاً من عمليات التنفيذ بالرسم البياني والتوق إلى تنفيذ العمليات الحسابية. A tf.Graph يحتوي على مجموعة من tf.Operation الكائنات (التقاط) التي تمثل وحدة الحساب و tf.Tensor الأشياء التي تمثل وحدة من البيانات التي تتدفق بين مكتب خدمات المشاريع.

Grappler هو نظام تحسين الرسم البياني الافتراضي في وقت تشغيل TensorFlow. يقوم Grappler بتطبيق التحسينات في وضع الرسم البياني (ضمن tf.function ) لتحسين أداء حسابات TensorFlow الخاصة بك من خلال تبسيط الرسم البياني وتحسينات أخرى عالية المستوى مثل تضمين وظائف الوظائف لتمكين التحسينات بين الإجراءات. يؤدي تحسين tf.Graph أيضًا إلى تقليل ذروة استخدام الجهاز للجهاز وتحسين استخدام الأجهزة من خلال تحسين تعيين عقد الرسم البياني لحساب الموارد.

استخدم tf.config.optimizer.set_experimental_options() للتحكم بشكل tf.Graph تحسينات tf.Graph .

محسنات الرسم البياني المتاحة

يقوم Grappler بإجراء تحسينات على الرسم البياني من خلال برنامج تشغيل عالي المستوى يسمى MetaOptimizer . تتوفر محسنات الرسم البياني التالية مع TensorFlow:

  • مُحسِّن قابل للطي المستمر - يُدخل بشكل ثابت قيمة الموتر عند الإمكان عن طريق طي العقد الثابتة في الرسم البياني ويجسد النتيجة باستخدام الثوابت.
  • محسِّن الحساب - يبسط العمليات الحسابية عن طريق التخلص من التعبيرات الفرعية الشائعة وتبسيط البيانات الحسابية.
  • مُحسِّن التخطيط - يُحسِّن تخطيطات الموتر لتنفيذ العمليات التي تعتمد على تنسيق البيانات مثل الالتفافات بكفاءة أكبر.
  • محسن Remapper - يعيد رسم الرسوم البيانية الفرعية على عمليات التنفيذ الأكثر كفاءة عن طريق استبدال الرسومات الفرعية التي تحدث بشكل شائع مع نواة متجانسة مدمجة محسنة .
  • محسن الذاكرة - يحلل الرسم البياني لفحص ذروة استخدام الذاكرة لكل عملية ويدرج عمليات نسخ ذاكرة CPU-GPU لتبديل ذاكرة GPU إلى CPU لتقليل استخدام الذروة للذاكرة.
  • مُحسِّن التبعية - يزيل أو يعيد ترتيب تبعيات التحكم لتقصير المسار الحرج لخطوة نموذج أو تمكين تحسينات أخرى. يزيل أيضًا العقد التي لا توجد عمليات فعالة مثل الهوية.
  • محسن التقليم - عقد البرقوق التي ليس لها تأثير على الإخراج من الرسم البياني. عادةً ما يتم تشغيله أولاً لتقليل حجم الرسم البياني وتسريع المعالجة في تصاريح Grappler الأخرى.
  • محسِّن الوظائف - يحسن مكتبة الوظائف لبرنامج TensorFlow ويضمن أجسام الوظائف لتمكين تحسينات بين الإجراءات الأخرى.
  • محسن الشكل - يحسن الرسومات الفرعية التي تعمل على الشكل والمعلومات ذات الصلة بالشكل.
  • محسّن ذاتي التوازي - موازاة الرسوم البيانية تلقائيًا من خلال التقسيم على طول البُعد. يتم إيقاف تشغيل هذا المُحسن بشكل افتراضي.
  • Loop Optimizer - يحسن تدفق التحكم في الرسم البياني عن طريق رفع المخططات الفرعية الثابتة للحلقة خارج الحلقات وإزالة عمليات التكديس الزائدة في الحلقات. يحسن أيضًا الحلقات ذات عدد الرحلات المعروفة بشكل ثابت ويزيل الفروع الميتة المعروفة بشكل ثابت في الشروط.
  • محسن مخصص النطاق - يقدم مخصصات نطاق لتقليل حركة البيانات ودمج بعض العمليات.
  • تثبيت على محسن المضيف - مبادلة العمليات الصغيرة على وحدة المعالجة المركزية. يتم إيقاف تشغيل هذا المُحسن بشكل افتراضي.
  • محسن الدقة المختلط تلقائيًا - يحول أنواع البيانات إلى تعويم 16 حيثما ينطبق ذلك لتحسين الأداء. ينطبق حاليًا فقط على وحدات معالجة الرسومات.
  • متجرد التصحيح - عقد العقد المتعلقة بعمليات التصحيح مثل tf.debugging.Assert و tf.debugging.check_numerics و tf.print من الرسم البياني. يتم إيقاف تشغيل هذا المُحسن بشكل افتراضي.

اقامة

 import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf
 

قم بإنشاء مدير سياق لتبديل حالات المُحسِّن بسهولة.

 @contextlib.contextmanager
def options(options):
  old_opts = tf.config.optimizer.get_experimental_options()
  tf.config.optimizer.set_experimental_options(options)
  try:
    yield
  finally:
    tf.config.optimizer.set_experimental_options(old_opts)
 

قارن أداء التنفيذ مع Grappler وبدونه

يتم تنفيذ TensorFlow 2 وما بعده بشغف افتراضي. استخدم tf.function لتبديل التنفيذ الافتراضي إلى وضع الرسم البياني. يعمل Grappler تلقائيًا في الخلفية لتطبيق تحسينات الرسم البياني أعلاه وتحسين أداء التنفيذ.

محسن للطي المستمر

كمثال أولي ، ضع في اعتبارك دالة تؤدي عمليات على الثوابت وترجع مخرجات.

 def test_function_1():
  @tf.function
  def simple_function(input_arg):
    print('Tracing!')
    a = tf.constant(np.random.randn(2000,2000), dtype = tf.float32)
    c = a
    for n in range(50):
      c = c@a
    return tf.reduce_mean(c+input_arg)

  return simple_function
 

قم بإيقاف تشغيل محسن الطي المستمر وقم بتنفيذ الوظيفة:

 with options({'constant_folding': False}):
  print(tf.config.optimizer.get_experimental_options())
  simple_function = test_function_1()
  # Trace once
  x = tf.constant(2.2)
  simple_function(x)
  print("Vanilla execution:", timeit.timeit(lambda: simple_function(x), number = 1), "s")
 
{'constant_folding': False, 'disable_model_pruning': False, 'disable_meta_optimizer': False}
Tracing!
Vanilla execution: 0.004905937999865273 s

قم بتمكين محسن الطي المستمر وقم بتنفيذ الوظيفة مرة أخرى لمراقبة التسريع في تنفيذ الوظيفة.

 with options({'constant_folding': True}):
  print(tf.config.optimizer.get_experimental_options())
  simple_function = test_function_1()
  # Trace once
  x = tf.constant(2.2)
  simple_function(x)
  print("Constant folded execution:", timeit.timeit(lambda: simple_function(x), number = 1), "s")
 
{'constant_folding': True, 'disable_model_pruning': False, 'disable_meta_optimizer': False}
Tracing!
Constant folded execution: 0.0005699149999145448 s

متجرد التصحيح محسن

خذ بعين الاعتبار وظيفة بسيطة تتحقق من القيمة العددية لوسيطة الإدخال الخاصة بها وتعيدها.

 def test_function_2():
  @tf.function
  def simple_func(input_arg):
    output = input_arg
    tf.debugging.check_numerics(output, "Bad!")
    return output
  return simple_func
 

أولاً ، قم بتنفيذ الوظيفة مع إيقاف تشغيل مُحسِّن متجرد التصحيح.

 test_func = test_function_2()
p1 = tf.constant(float('inf'))
try:
  test_func(p1)
except tf.errors.InvalidArgumentError as e:
  traceback.print_exc(limit=2)
 
Traceback (most recent call last):
  File "<ipython-input-8-1ac473fdfbab>", line 4, in <module>
    test_func(p1)
  File "/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 580, in __call__
    result = self._call(*args, **kwds)
tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at <ipython-input-7-cbee1561c83e>:5) ]]
     [[Identity/_4]]
  (1) Invalid argument:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at <ipython-input-7-cbee1561c83e>:5) ]]
0 successful operations.
0 derived errors ignored. [Op:__inference_simple_func_131]

Errors may have originated from an input operation.
Input Source operations connected to node CheckNumerics:
 input_arg (defined at <ipython-input-8-1ac473fdfbab>:4)

Input Source operations connected to node CheckNumerics:
 input_arg (defined at <ipython-input-8-1ac473fdfbab>:4)

Function call stack:
simple_func -> simple_func


يثير tf.debugging.check_numerics خطأ وسيطة غير صالحة بسبب الوسيطة Inf إلى test_func .

تمكين محسن متجرد التصحيح وتنفيذ الوظيفة مرة أخرى.

 with options({'debug_stripper': True}):
  test_func2 = test_function_2()
  p1 = tf.constant(float('inf'))
  try:
    test_func2(p1)
  except tf.errors.InvalidArgumentError as e:
    traceback.print_exc(limit=2)
 

يقوم مُحسِّن متجرد التصحيح tf.debug.check_numerics العقدة tf.debug.check_numerics من الرسم البياني وينفذ الوظيفة دون إثارة أي أخطاء.

ملخص

يستخدم وقت تشغيل TensorFlow Grappler لتحسين الرسوم البيانية تلقائيًا قبل التنفيذ. استخدم tf.config.optimizer.set_experimental_options لتمكين أو تعطيل محسنات الرسم البياني المختلفة.

لمزيد من المعلومات حول Grappler ، راجع تحسينات الرسم البياني TensorFlow .