این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

بهینه سازی نمودار TensorFlow با گراپلر

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub بارگیری نوت بوک

بررسی اجمالی

TensorFlow برای اجرای محاسبات از نمودارهای اجرایی و مشتاق استفاده می کند. یک tf.Graph شامل مجموعه ای از اشیاء tf.Operation (ops) است که واحدهای محاسبات و اشیاء tf.Tensor را نشان می دهد که واحدهای داده ای را که بین گزینه ها جریان دارند ، نشان می دهد.

Grappler سیستم بهینه سازی نمودار پیش فرض در زمان اجرا TensorFlow است. گراپلر برای بهینه سازی عملکرد محاسبات TensorFlow از طریق ساده سازی نمودار و سایر بهینه سازی های سطح بالا مانند اجزای عملکرد تابع ، بهینه سازی های موجود در حالت گراف را انجام می دهد (در tf.function ). بهینه سازی tf.Graph همچنین بهینه سازی حافظه اوج دستگاه را کاهش می دهد و با بهینه سازی نقشه برداری از گره های گراف برای محاسبه منابع ، استفاده از سخت افزار را بهبود می بخشد.

برای کنترل دقیق تر در بهینه سازی های tf.Graph از tf.config.optimizer.set_experimental_options() استفاده کنید.

بهینه سازهای نمودار موجود

Grappler بهینه سازی نمودار را از طریق درایور سطح بالا به نام MetaOptimizer . بهینه سازهای نمودار زیر با TensorFlow در دسترس هستند:

  • بهینه ساز تاشو ثابت - در صورت امکان با خم کردن گره های ثابت در نمودار ، مقدار تنش را استنباط می کند و نتیجه را با استفاده از ثابت تحریک می کند.
  • بهینه ساز حسابی - با از بین بردن زیرعبارهای رایج و ساده کردن عبارات حسابی ، عملیات ریاضی را ساده می کند.
  • بهینه ساز چیدمان - برای اجرای عملیات وابسته به فرمت داده از قبیل حلق آویزها ، طرح بندی های تانسور را بهینه می کند.
  • Remapper optimizer - با جایگزین کردن زیرگرافهای معمولاً با هسته های یکپارچه ذوب شده بهینه سازی ، زیرگرافها را بر روی پیاده سازی های کارآمدتر باز می کنید.
  • بهینه ساز حافظه - نمودار را برای بررسی حداکثر استفاده از حافظه اوج برای هر عملیات تجزیه و تحلیل می کند و عملیات کپی حافظه CPU-GPU را برای تعویض حافظه GPU به CPU درج می کند تا از حداکثر استفاده از حافظه استفاده کند.
  • بهینه ساز وابستگی - وابستگی های کنترل را حذف کرده یا از نو تنظیم مجدد می کند تا مسیر حساس را برای یک مرحله مدل کوتاه کند یا بهینه سازی های دیگر را فعال می کند. همچنین گره هایی را که به طور موثر هیچ گزینه ای مانند Identity نیستند حذف می کند.
  • بهینه ساز هرس - گره های هرس که هیچ تاثیری در خروجی از نمودار ندارند. معمولاً ابتدا برای کاهش اندازه نمودار و سرعت بخشیدن به پردازش در سایر پاس های گراپلر اجرا می شود.
  • عملکرد بهینه ساز - کتابخانه عملکرد یک برنامه TensorFlow را بهینه می کند و اجساد عملکرد را شامل می شود تا سایر بهینه سازی های بین رویه ای را فعال کند.
  • بهینه ساز شکل - زیرگراف هایی را که بر روی شکل و اطلاعات مربوط به شکل کار می کنند بهینه می کند.
  • بهینه ساز خودکار - نمودارها را با تقسیم در بعد دسته ای بطور خودکار موازی می کند. این بهینه ساز به طور پیش فرض خاموش است.
  • حلقه بهینه ساز - با بلند کردن زیرگرافهای حلقوی ثابت از حلقه ها و با از بین بردن عملیات پشته اضافی در حلقه ها ، جریان کنترل گراف را بهینه می کند. همچنین حلقه هایی را با تعداد سفرهای شناخته شده سفر بهینه می کند و شاخه های مرده استاتیک شناخته شده را نیز در شرط بندی حذف می کند.
  • بهینه ساز تخصیص دهنده Scoped - به منظور کاهش حرکت داده ها و تثبیت برخی از عملیات ، توزیع کننده های Scoped را معرفی می کند.
  • پین برای بهینه سازنده میزبان - عملیات کوچک را بر روی CPU عوض کنید. این بهینه ساز به طور پیش فرض خاموش است.
  • بهینه ساز دقت دقیق مختلط - انواع داده ها را در صورت امکان برای بهبود عملکرد به float16 تبدیل می کند. در حال حاضر فقط مربوط به GPU است.
  • Debug stripper - گره های نوار مربوط به عملیات اشکال زدایی مانند 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 برای تغییر حالت پیش فرض به حالت Graph استفاده کنید. 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 از tf.config.optimizer.set_experimental_options استفاده کنید.

برای اطلاعات بیشتر در مورد Grappler ، به بهینه‌سازی نمودار TensorFlow مراجعه کنید.