روز جامعه ML 9 نوامبر است! برای به روز رسانی از TensorFlow، JAX به ما بپیوندید، و بیشتر بیشتر بدانید

بهینه سازی نمودار TensorFlow با Grappler

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

بررسی اجمالی

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

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

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

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

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

  • بهینه ساز تاشو ثابت - آماری استنتاج ارزش تانسورها در صورت امکان توسط تاشو گره ثابت در نمودار و نتایج با ثابت تحقق.
  • بهینه ساز حسابی - ساده عملیات محاسباتی با حذف عبارات همگی مشترک و ساده اظهارات حساب.
  • چیدمان بهینه ساز - بهینه سازی طرح بندی تانسور به اجرای عملیات وابسته فرمت داده ها مانند پیچش موثر تر است.
  • بهینه ساز Remapper - Remaps زیرگرافهای بر روی پیاده سازی کارآمد تر با جایگزین زیرگرافهای معمول بوجود آمده با بهینه سازی سرورها فضای ذوب شده.
  • بهینه سازی حافظه - تجزیه و تحلیل نمودار به بازرسی استفاده از حافظه اوج برای هر عمل و درج CPU-GPU عملیات کپی حافظه برای انتقال حافظه GPU به CPU به منظور کاهش استفاده از حافظه اوج.
  • وابستگی بهینه ساز - حذف و یا کنترل را rearranges وابستگی به کوتاه شدن مسیر بحرانی برای یک گام مدل یا قادر می سازد بهینه سازی های دیگر. همچنین گره هایی را که به طور م noثر عملی نیستند مانند هویت حذف می کند.
  • هرس بهینه ساز - آلو گره های که هیچ تاثیری در خروجی از نمودار. معمولاً ابتدا برای کاهش اندازه نمودار و سرعت بخشیدن به پردازش در سایر پاسهای Grappler اجرا می شود.
  • عملکرد بهینه ساز - بهینه سازی کتابخانه تابع یک برنامه TensorFlow و inlines عمل بدن برای فعال دیگر بهینه سازی بین رویه.
  • شکل بهینه ساز - بهینه زیرگرافهای که در شکل عمل و شکل دادن به اطلاعات مرتبط.
  • Autoparallel بهینه ساز - به صورت خودکار parallelizes نمودار با تقسیم همراه بعد دسته ای. این بهینه ساز به طور پیش فرض خاموش است.
  • حلقه بهینه ساز - بهینه سازی کنترل جریان نمودار های عمل بالا بردن زیرگرافهای حلقه ثابت از حلقه ها و از بین بردن عملیات پشته کار برکنار شده در حلقه. همچنین حلقه ها را با تعداد سفرهای شناخته شده ثابت بهینه می کند و شاخه های مرده ثابت را که در حالت شرطی شناخته شده اند حذف می کند.
  • مورد نظر بهینه ساز تخصیص - معرفی تخصیص مورد نظر به منظور کاهش حرکت داده و به تحکیم برخی از عملیات.
  • پین به بهینه ساز میزبان - معاوضه عملیات کوچک بر روی CPU است. این بهینه ساز به طور پیش فرض خاموش است.
  • خودرو مخلوط بهینه ساز دقیق - انواع داده تبدیل به float16 در آن قابل اجرا به منظور بهبود عملکرد. در حال حاضر فقط برای پردازنده های گرافیکی کاربرد دارد.
  • اشکال زدایی پوست کن - نوارها گره مربوط به عملیات اشکال زدایی مانند 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.0018392090000816097 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.0006749789999958011 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)
2021-09-22 20:34:55.871238: E tensorflow/core/kernels/check_numerics_op.cc:292] abnormal_detected_host @0x7f4878e00100 = {0, 1} Bad!
Traceback (most recent call last):
  File "/tmp/ipykernel_22954/3616845043.py", line 4, in <module>
    test_func(p1)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py", line 885, in __call__
    result = self._call(*args, **kwds)
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at tmp/ipykernel_22954/2241890286.py:5) ]] [Op:__inference_simple_func_131]

Errors may have originated from an input operation.
Input Source operations connected to node CheckNumerics:
 input_arg (defined at tmp/ipykernel_22954/3616845043.py:4)

Function call stack:
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 گره از گراف و تابع بدون بالا بردن هر گونه خطا و اجرا می کند.

خلاصه

زمان اجرا TensorFlow از Grappler برای بهینه سازی خودکار نمودارها قبل از اجرا استفاده می کند. استفاده از tf.config.optimizer.set_experimental_options برای فعال یا غیر فعال کردن بهینه مختلف نمودار.

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