Grappler এর সাথে TensorFlow গ্রাফ অপটিমাইজেশন

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

ওভারভিউ

টেনসরফ্লো কম্পিউটেশন চালানোর জন্য গ্রাফ এবং উদগ্রীব এক্সিকিউশন উভয়ই ব্যবহার করে। একটি tf.Graphtf.Operation অবজেক্ট (ops) এর একটি সেট থাকে যা গণনার একক এবং tf.Tensor অবজেক্টগুলিকে প্রতিনিধিত্ব করে যা অপ্সের মধ্যে প্রবাহিত ডেটার একককে প্রতিনিধিত্ব করে।

গ্র্যাপলার হল টেনসরফ্লো রানটাইমে ডিফল্ট গ্রাফ অপ্টিমাইজেশান সিস্টেম। Grappler গ্রাফ সরলীকরণ এবং অন্যান্য উচ্চ-স্তরের অপ্টিমাইজেশানগুলির মাধ্যমে আপনার টেনসরফ্লো কম্পিউটেশনের কর্মক্ষমতা উন্নত করতে গ্রাফ মোডে ( tf.function এর মধ্যে) অপ্টিমাইজেশান প্রয়োগ করে যেমন আন্তঃপ্রক্রিয়াগত অপ্টিমাইজেশন সক্ষম করতে ফাংশন বডি ইনলাইন করা। tf.Graph অপ্টিমাইজ করা ডিভাইসের পিক মেমরির ব্যবহারকেও কমিয়ে দেয় এবং রিসোর্স গণনার জন্য গ্রাফ নোডের ম্যাপিং অপ্টিমাইজ করে হার্ডওয়্যার ব্যবহার উন্নত করে।

আপনার tf. tf.Graph অপ্টিমাইজেশনের উপর সূক্ষ্ম নিয়ন্ত্রণের জন্য tf.config.optimizer.set_experimental_options() ব্যবহার করুন।

উপলব্ধ গ্রাফ অপ্টিমাইজার

MetaOptimizer নামক একটি শীর্ষ-স্তরের ড্রাইভারের মাধ্যমে গ্রাফ অপ্টিমাইজেশন সম্পাদন করে। নিম্নলিখিত গ্রাফ অপ্টিমাইজারগুলি TensorFlow-এর সাথে উপলব্ধ:

  • ধ্রুবক ভাঁজ অপ্টিমাইজার - গ্রাফে ধ্রুবক নোডগুলি ভাঁজ করার মাধ্যমে স্থিতিশীলভাবে টেনসরের মান অনুমান করে এবং ধ্রুবক ব্যবহার করে ফলাফলকে বাস্তবায়িত করে।
  • পাটিগণিত অপ্টিমাইজার - সাধারণ সাব এক্সপ্রেশন বাদ দিয়ে এবং গাণিতিক বিবৃতি সরলীকরণ করে গাণিতিক ক্রিয়াকলাপকে সহজ করে।
  • লেআউট অপ্টিমাইজার - আরও দক্ষতার সাথে কনভল্যুশনের মতো ডেটা ফরম্যাট নির্ভর ক্রিয়াকলাপ চালানোর জন্য টেনসর লেআউটগুলিকে অপ্টিমাইজ করে।
  • রিম্যাপার অপ্টিমাইজার - অপ্টিমাইজড ফিউজড মনোলিথিক কার্নেলগুলির সাথে সাধারণত ঘটতে থাকা সাবগ্রাফগুলিকে প্রতিস্থাপন করে আরও দক্ষ বাস্তবায়নে সাবগ্রাফগুলিকে রিম্যাপ করে৷
  • মেমরি অপ্টিমাইজার - প্রতিটি অপারেশনের জন্য পিক মেমরি ব্যবহার পরিদর্শন করার জন্য গ্রাফ বিশ্লেষণ করে এবং পিক মেমরি ব্যবহার কমাতে জিপিইউ মেমরিকে সিপিইউতে অদলবদল করার জন্য CPU-GPU মেমরি কপি অপারেশন সন্নিবেশ করায়।
  • নির্ভরতা অপ্টিমাইজার - একটি মডেল পদক্ষেপের জন্য গুরুত্বপূর্ণ পথকে ছোট করতে নিয়ন্ত্রণ নির্ভরতাগুলিকে সরিয়ে দেয় বা পুনর্বিন্যাস করে বা অন্যান্য অপ্টিমাইজেশন সক্ষম করে৷ এছাড়াও নোডগুলিকে সরিয়ে দেয় যা কার্যকরভাবে নো-অপস যেমন আইডেন্টিটি।
  • ছাঁটাই অপ্টিমাইজার - ছাঁটাই নোড যা গ্রাফ থেকে আউটপুটে কোন প্রভাব ফেলে না। এটি সাধারণত গ্রাফের আকার কমাতে এবং অন্যান্য গ্র্যাপলার পাসে প্রক্রিয়াকরণের গতি বাড়াতে প্রথমে চালানো হয়।
  • ফাংশন অপ্টিমাইজার - একটি টেনসরফ্লো প্রোগ্রামের ফাংশন লাইব্রেরি অপ্টিমাইজ করে এবং অন্যান্য আন্তঃপ্রক্রিয়াগত অপ্টিমাইজেশন সক্ষম করতে ফাংশন বডিগুলিকে ইনলাইন করে৷
  • আকৃতি অপ্টিমাইজার - সাবগ্রাফ অপ্টিমাইজ করে যা আকৃতি এবং আকৃতি সম্পর্কিত তথ্যের উপর কাজ করে।
  • স্বয়ংক্রিয় সমান্তরাল অপ্টিমাইজার - ব্যাচের মাত্রা বরাবর বিভক্ত করে স্বয়ংক্রিয়ভাবে গ্রাফগুলিকে সমান্তরাল করে। এই অপ্টিমাইজার ডিফল্টরূপে বন্ধ করা হয়.
  • লুপ অপ্টিমাইজার - লুপ থেকে লুপ-ইনভেরিয়েন্ট সাবগ্রাফ উত্তোলন করে এবং লুপগুলিতে অপ্রয়োজনীয় স্ট্যাক অপারেশনগুলি সরিয়ে গ্রাফ নিয়ন্ত্রণ প্রবাহকে অপ্টিমাইজ করে৷ এছাড়াও স্ট্যাটিকভাবে পরিচিত ট্রিপ গণনা সহ লুপগুলিকে অপ্টিমাইজ করে এবং শর্তসাপেক্ষে স্ট্যাটিকভাবে পরিচিত মৃত শাখাগুলি সরিয়ে দেয়।
  • স্কোপড অ্যালোকেটর অপ্টিমাইজার - ডেটা মুভমেন্ট কমাতে এবং কিছু ক্রিয়াকলাপ একত্রিত করতে স্কোপড অ্যালোকেটর প্রবর্তন করে।
  • হোস্ট অপটিমাইজারে পিন করুন - CPU-তে ছোট অপারেশন অদলবদল করুন। এই অপ্টিমাইজার ডিফল্টরূপে বন্ধ করা হয়.
  • স্বয়ংক্রিয় মিশ্র নির্ভুলতা অপ্টিমাইজার - কর্মক্ষমতা উন্নত করতে প্রযোজ্য যেখানে ডেটা প্রকারগুলিকে float16 তে রূপান্তর করে৷ বর্তমানে শুধুমাত্র GPU-তে প্রযোজ্য।
  • ডিবাগ স্ট্রিপার - গ্রাফ থেকে 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 ব্যবহার করুন। উপরে গ্রাফ অপ্টিমাইজেশান প্রয়োগ করতে এবং এক্সিকিউশন পারফরম্যান্স উন্নত করতে গ্র্যাপলার ব্যাকগ্রাউন্ডে স্বয়ংক্রিয়ভাবে চলে।

ধ্রুবক ভাঁজ অপ্টিমাইজার

একটি প্রাথমিক উদাহরণ হিসাবে, একটি ফাংশন বিবেচনা করুন যা ধ্রুবকগুলিতে ক্রিয়াকলাপ সম্পাদন করে এবং একটি আউটপুট প্রদান করে।

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 সম্পর্কে আরও তথ্যের জন্য, টেনসরফ্লো গ্রাফ অপ্টিমাইজেশান দেখুন।