This page was translated by the Cloud Translation API.
Switch to English

এক্সএলএ: মেশিন লার্নিংয়ের জন্য অনুকূলিতকরণ সংকলক

এক্সএলএ (এক্সিলারেটেড লিনিয়ার বীজগণিত) লিনিয়ার বীজগণিতের জন্য একটি ডোমেন-নির্দিষ্ট সংকলক যা সম্ভাব্য কোনও উত্স কোড পরিবর্তন না করে টেনসরফ্লো মডেলগুলিকে ত্বরান্বিত করতে পারে।

ফলাফলগুলি গতি এবং মেমরির ব্যবহারের উন্নতি: এক্সএলএল সক্ষম করার পরে বেশিরভাগ অভ্যন্তরীণ মানদণ্ড ~ 1.15x দ্রুত চালায়। নীচের ডেটাসেটটি একটি একক এনভিডিয়া ভি 100 জিপিইউতে মূল্যায়ন করা হয়েছে:

ভূমিকা

যখন টেনসরফ্লো প্রোগ্রামটি চালানো হয় তখন সমস্ত অপারেশন টেনসরফ্লো এক্সিকিউটারের দ্বারা স্বতন্ত্রভাবে সম্পাদন করা হয়। প্রতিটি টেনসরফ্লো অপারেশনটিতে একটি পূর্বনির্ধারিত জিপিইউ কার্নেল বাস্তবায়ন থাকে যা নির্বাহক প্রেরণ করে।

এক্সএলএ চলমান মডেলগুলির একটি বিকল্প মোড সরবরাহ করে: এটি টেনসরফ্লো গ্রাফকে প্রদত্ত মডেলের জন্য বিশেষত উত্পন্ন গণনা কার্নেলের ক্রমকে সংকলন করে। যেহেতু এই কার্নেলগুলি মডেলের পক্ষে স্বতন্ত্র, তারা অপ্টিমাইজেশনের জন্য মডেল-নির্দিষ্ট তথ্যটি ব্যবহার করতে পারে। উদাহরণস্বরূপ, আসুন একটি অপরিশোধন এক্সএলএ দেখুন একটি সাধারণ টেনসরফ্লো গণনার প্রসঙ্গে:

def model_fn(x, y, z):
  return tf.reduce_sum(x + y * z)

এক্সএলএ ছাড়াই চলুন, গ্রাফটি তিনটি কার্নেল চালু করে: একটি গুণনের জন্য একটি, সংযোজনের জন্য একটি এবং হ্রাসের জন্য একটি। তবে, এক্সএলএ গ্রাফটি অনুকূল করতে পারে যাতে এটি ফলাফলকে একটি একক কার্নেল প্রবর্তনের সাথে গণনা করে। এটি একক জিপিইউ কার্নেলের সাথে সংযোজন, গুণ এবং হ্রাস "ফিউজ" করে এটি করে। তদতিরিক্ত, এই ফিউজড ক্রিয়াকলাপটি y*z এবং x+y*z মেমোরিতে উত্পাদিত মধ্যবর্তী মানগুলি লিখবে না; পরিবর্তে এটি পুরোপুরি জিপিইউ রেজিস্টারে রেখে তাদের ব্যবহারকারীদের কাছে এই অন্তর্বর্তী গণনার ফলাফলগুলি "স্ট্রিম" করে। ফিউশনটি এক্সএলএর একক অতি গুরুত্বপূর্ণ অপটিমাইজেশন। মেমরি ব্যান্ডউইদথ সাধারণত হার্ডওয়্যার এক্সিলিটারগুলির জন্য দুর্লভ সম্পদ, তাই মেমরি অপারেশনগুলি অপসারণ কার্যকারিতা উন্নত করার অন্যতম সেরা উপায়।

টেনসরফ্লো মডেলগুলির জন্য এক্সএলএল সক্ষম করুন

অটো-ক্লাস্টারিং

টেনসরফ্লো মডেলগুলিতে এক্সএলএ ব্যবহার শুরু করার একটি সহজ উপায় হ'ল অটো-ক্লাস্টারিং সক্ষম করা, যা টেনসরফ্লো গ্রাফের মধ্যে স্বয়ংক্রিয়ভাবে ক্লাস্টারগুলি (সংযুক্ত সাবগ্রাফ্ট) সন্ধান করে যা এক্সএলএল ব্যবহার করে সংকলন ও সম্পাদন করা যায়। TF_XLA_FLAGS এনভায়রনমেন্ট ভেরিয়েবল সেট করে GPU এ অটো-ক্লাস্টারিং সক্ষম করা যেতে পারে:

$ TF_XLA_FLAGS=--tf_xla_auto_jit=2 path/to/your/tf/program

অটো-ক্লাস্টারিং বর্তমানে জিপিইউ কাজের চাপের জন্য অনুকূলিত হয়েছে, তবে এটি সিপিইউতে অতিরিক্ত --tf_xla_cpu_global_jit ব্যবহার করে সক্ষম করা --tf_xla_cpu_global_jit :

$ TF_XLA_FLAGS="--tf_xla_auto_jit=2 --tf_xla_cpu_global_jit" path/to/your/program

বিশদ ব্যবহারের উদাহরণের জন্য অটো-ক্লাস্টারিং টিউটোরিয়াল কোলাব দেখুন

Tf.function সহ সুস্পষ্ট সংকলন

কোডে কোনও পরিবর্তন ছাড়াই মডেলটিকে দ্রুত তৈরি করার জন্য অটো-ক্লাস্টারিং একটি দুর্দান্ত সরঞ্জাম, তবে কী পরিবর্তনগুলি সম্পাদন করা হয়েছে তা বোঝা মুশকিল।

সুস্পষ্ট সংকলন API কোন ফাংশনগুলি সংকলন করা উচিত তা চয়ন করার জন্য আরও সূক্ষ্ম-কন্ট্রোল নিয়ন্ত্রণ সরবরাহ করে। উদাহরণস্বরূপ, নিম্নলিখিত টেনসরফ্লো ফাংশন যা এমএনআইএসটি প্রশিক্ষণ সম্পাদন করে তা এক্সএলএ সহ সংকলিত হয়েছে:

@tf.function(experimental_compile=True)
def train_mnist(images, labels):
    images, labels = cast(images, labels)

    with tf.GradientTape() as tape:
      predicted_labels = layer(images)
      loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
          logits=predicted_labels, labels=labels
      ))
    layer_variables = layer.trainable_variables
    grads = tape.gradient(loss, layer_variables)
    optimizer.apply_gradients(zip(grads, layer_variables))

experimental_compile এপিআই-তে অবশ্যই শব্দার্থ -সংকলন থাকতে হবে : হয় পুরো ফাংশনটি errors.InvalidArgumentError সাথে সংকলিত হয়, অথবা একটি errors.InvalidArgumentError এক্সএলএ বর্তমানে ফাংশনগুলি সংকলন করতে পারে না যেখানে মাত্রা অনুমানযোগ্য নয়: এটি হ'ল সম্পূর্ণ গণনাটি পরিচালনা না করে যদি সমস্ত টেনেন্সরের মাত্রা নির্ধারণ করা সম্ভব না হয়। উদাহরণস্বরূপ, নিম্নলিখিত ফাংশনটি সংকলন করবে না:

17f1e12d7 বি

রানগুলি জুড়ে আকারগুলি বিভিন্ন রকম হতে পারে:

@tf.function(experimental_compile=True)
def recompiled_on_launch(a, b):
  return a + b

recompiled_on_launch(tf.ones([1, 10]), tf.ones([1, 10]))
recompiled_on_launch(tf.ones([1, 100]), tf.ones([1, 100]))

আরও বিস্তারিত ব্যবহারের উদাহরণের জন্য টিউটোরিয়াল কোলাব দেখুন।

tfcompile সহ tfcompile জন্য tfcompile (পূর্বে-সময়ের) সংকলন

আপনি স্ট্যান্ডেলোন tfcompile ব্যবহার করতে পারেন, যা tfcompile গ্রাফকে এক্সিকিউটেবল কোডে রূপান্তরিত করে (কেবল x86-64 সিপিইউ জন্য)।

সংকলিত প্রোগ্রামগুলি পরিদর্শন করুন

এক্সএলএ এনট্রোস্পেকশন সুবিধা সরবরাহ করে যা আপনাকে উত্পন্ন প্রোগ্রামগুলি পরীক্ষা করতে দেয়। উত্পন্ন প্রোগ্রামগুলি ডাম্প করতে, পরিবেশের পরিবর্তনশীল XLA_FLAGS ব্যবহার করুন:

$ XLA_FLAGS="--xla_dump_to=/tmp/generated" TF_XLA_FLAGS="--tf_xla_auto_jit=2" my/tensorflow/program

ডাম্পিং সম্পন্ন হওয়ার পরে, আপনি নিম্নলিখিত ফাইলগুলি /tmp/generated মধ্যে খুঁজে পেতে পারেন:

টেনসরফ্লো গ্রাফের সাথে এক্সএলএল ক্লাস্টারগুলির এম্বেডিং ভিজ্যুয়ালাইজিং গ্রাফটি আপনি এগুলি দিয়ে ফেলতে পারেন:

$ TF_DUMP_GRAPH_PREFIX=/tmp/generated TF_XLA_FLAGS="--tf_xla_clustering_debug"

পুনরুত্পাদনযোগ্য বাগ রিপোর্ট

এতে উত্পন্ন এক্সএলএ প্রোগ্রাম এবং ব্যবহৃত স্বয়ংক্রিয়-ক্লাস্টারিং এম্বেডিংয়ের জন্য ডাম্প অন্তর্ভুক্ত থাকলে একটি বাগ রিপোর্ট পুনরুত্পাদন করা অনেক সহজ। অটো-ক্লাস্টারিং সহ চলমান টেনসরফ্লো প্রোগ্রামের জন্য এগুলি উত্পন্ন করতে, চালু করুন:

$ TF_DUMP_GRAPH_PREFIX=/tmp/generated \
  TF_XLA_FLAGS="--tf_xla_clustering_debug --tf_xla_auto_jit=2" \
  XLA_FLAGS="--xla_dump_hlo_as_text --xla_dump_to=/tmp/generated" \
    my/tensorflow/program"

বাগ ফাইল করার সময়, /tmp/generated ডিরেক্টরি (উপরে উল্লিখিত) এর বিষয়বস্তু সংযুক্ত করুন।

যদি সম্ভব হয় তবে replay_computation ব্যবহার করে এবং এটি উত্পন্ন প্রোগ্রামগুলিতে পুনরাবৃত্তভাবে চালিয়ে একক এক্সএলএ প্রোগ্রামে বাগটি আলাদা করার চেষ্টা করুন।

এক্সএলএ ফ্রন্টএন্ডস

টেনসরফ্লো ব্যতীত এক্সএলএল প্রোগ্রামগুলি এর দ্বারা তৈরি করা যেতে পারে:

  • Jax : পাইথন + + NumPy প্রোগ্রামের Composable রূপান্তরের
  • জুলিয়া : বৈজ্ঞানিক কম্পিউটিংয়ের জুলিয়া ভাষা
  • পাইটর্চ : পাইটর্চ কাঠামো

আরও পড়া