প্রচেষ্টার স্তর

XLA কম্পাইলারের প্রচেষ্টার পরিমাণ নিয়ন্ত্রণ করার জন্য বিকল্প প্রদান করে।

  • রানটাইম পারফরম্যান্সের জন্য অপ্টিমাইজ করুন, এবং
  • প্রোগ্রামটিকে "মেমরিতে ফিট করানো" (যার অর্থ প্ল্যাটফর্ম-নির্ভর)

অপ্টিমাইজেশন স্তর

gcc বা clang-এর -O ফ্ল্যাগগুলোর মতোই, এই ফিল্ডটি ব্যবহারকারীকে নির্ধারণ করতে দেয় যে এক্সিকিউশন টাইম অপ্টিমাইজ করার জন্য কম্পাইলার কতটা কাজ করবে। এটি ExecutableBuildOptionsProto মেসেজের optimization_level ফিল্ডের মাধ্যমে, অথবা ExecutionOptions মেসেজের optimization_level ফিল্ডের মাধ্যমে সেট করা যায়।

নিম্নতর অপ্টিমাইজেশন লেভেলের কারণে বিভিন্ন HLO পাস ভিন্নভাবে কাজ করে, সাধারণত কম কাজ করে, অথবা নির্দিষ্ট কিছু HLO পাস সম্পূর্ণরূপে নিষ্ক্রিয় করে দিতে পারে। অপ্টিমাইজেশন লেভেল কম্পাইলার ব্যাকএন্ডকেও প্রভাবিত করতে পারে, ফলে এই ফিল্ডটির সঠিক প্রভাব টার্গেট প্ল্যাটফর্মের উপর নির্ভরশীল। তবে, একটি সাধারণ নির্দেশিকা হিসেবে, নিম্নলিখিত সারণিতে প্রতিটি মানের প্রত্যাশিত সামগ্রিক প্রভাব বর্ণনা করা হলো:

স্তর ব্যবহারের ক্ষেত্র
EFFORT_O0 দ্রুততম কম্পাইলেশন, ধীরতম রানটাইম
EFFORT_O1 যুক্তিসঙ্গত রানটাইম সহ দ্রুততর কম্পাইলেশন
EFFORT_O2 রানটাইমকে জোরালোভাবে অগ্রাধিকার দিন (প্রোডাকশন ওয়ার্কলোডের জন্য উপযুক্ত ডিফল্ট)
EFFORT_O3 ব্যয়বহুল বা পরীক্ষামূলক অপ্টিমাইজেশন

XLA:GPU-তে ব্যবহার করুন

অল-গ্যাদার, অল-রিডিউস এবং রিডিউস-স্ক্যাটারের জন্য পাইপলাইনিং আলাদাভাবে কনফিগার করা যায়। xla_gpu_pipeline_all_gather , xla_gpu_pipeline_all_reduce , এবং xla_gpu_pipeline_reduce_scatter ফ্ল্যাগগুলো default , off , on , বা explicit গ্রহণ করে। default মোড অপটিমাইজেশন এফোর্ট অনুসরণ করে: এটি O1 বা তার বেশি হলে, অথবা যখন এক্সিকিউশন-টাইম অপটিমাইজেশন এফোর্ট কমপক্ষে 0.2 হয়, তখন on নির্বাচন করে; অন্যথায়, এটি off নির্বাচন করে। অন্য যেকোনো মোড অপটিমাইজেশন এফোর্টকে ওভাররাইড করে। অল-গ্যাদার এবং অল-রিডিউসের ডিফল্ট মোড default , যেখানে রিডিউস-স্ক্যাটারের ডিফল্ট মোড on । মোডের অর্থ বোঝার জন্য GPU XLA ফ্ল্যাগগুলো দেখুন।

XLA:GPU-তে এমন কয়েকটি পাস রয়েছে যা আমরা ডিফল্টরূপে নিষ্ক্রিয় করে রাখি, কারণ এগুলি HLO সাইজ বাড়িয়ে কম্পাইলেশনের সময় উল্লেখযোগ্যভাবে বৃদ্ধি করে। সুবিধার জন্য, আমরা সেগুলিকে অপটিমাইজেশন লেভেল অপশনের অধীনে একত্রিত করেছি, যার ফলে optimization_level-কে O1 বা তার উপরে সেট করলে নিম্নলিখিত আচরণটি পরিলক্ষিত হবে:

  • ডেটা-প্যারালাল কমিউনিকেশনের জন্য সচরাচর ব্যবহৃত অপারেশনগুলোর ক্ষেত্রে কালেক্টিভ পাইপলাইনিং ডিফল্টরূপে on থাকে। তবে off এবং explicit মোডগুলো এই ডিফল্ট সেটিংকে ওভাররাইড করে।
    • xla_gpu_pipeline_all_gather
    • xla_gpu_pipeline_all_reduce
    • xla_gpu_pipeline_reduce_scatter
  • while লুপকে দ্বিগুণ পরিমাণে প্রসারিত করা। এটি লুপ-বাধা দূর করে, যার ফলে সম্ভাব্যভাবে আরও ভালো কম্পিউট-কমিউনিকেশন ওভারল্যাপ এবং কম কপি তৈরি হয়।
    • xla_gpu_enable_while_loop_double_buffering
  • লেটেন্সি হাইডিং শিডিউলার কমিউনিকেশন লেটেন্সি গোপন করার বেশিরভাগ কাজ করবে।
    • xla_gpu_enable_latency_hiding_scheduler
  • নেটওয়ার্কিং ব্যান্ডউইথ সর্বাধিক করার জন্য, কম্বাইনার পাসগুলো পাইপলাইনড কালেক্টিভগুলোকে সর্বোচ্চ উপলব্ধ মেমরিতে একত্রিত করবে। যদি লুপটি ইনপুট HLO-তে ইতিমধ্যেই আনরোল করা থাকে, তাহলে এই অপ্টিমাইজেশনটি কার্যকর হয় না।

মেমরি ফিটিং লেভেল

আরেকটি এফোর্ট লেভেল অপশন নিয়ন্ত্রণ করে যে কম্পাইলার চূড়ান্ত প্রোগ্রামটিকে "মেমরিতে ফিট" করার জন্য কতটা চেষ্টা করবে, যেখানে "ফিট" এবং "মেমরি" শব্দ দুটির অর্থ ব্যাকএন্ড-নির্ভর (উদাহরণস্বরূপ, XLA:TPU-তে, এই অপশনটি নিয়ন্ত্রণ করে যে কম্পাইলার TPU-এর হাই-ব্যান্ডউইথ মেমরি (HBM) ব্যবহারকে HBM ক্ষমতার নিচে রাখার জন্য কতটা কাজ করবে)। এটি ExecutableBuildOptionsProto মেসেজের memory_fitting_level ফিল্ডের মাধ্যমে, অথবা ExecutionOptions মেসেজের memory_fitting_level ফিল্ডের মাধ্যমে সেট করা যেতে পারে।

অপ্টিমাইজেশন লেভেলের মতোই, প্রতিটি এফোর্ট লেভেল ভ্যালুর সঠিক অর্থ ব্যাকএন্ড-নির্ভর, কিন্তু নিম্নলিখিত সারণিটি একটি সাধারণ নির্দেশিকা হিসাবে প্রত্যাশিত প্রভাব বর্ণনা করে:

স্তর ব্যবহারের ক্ষেত্র
EFFORT_O0 ফিট করার জন্য ন্যূনতম প্রচেষ্টা (এর পরিবর্তে যত দ্রুত সম্ভব কম্পাইলেশন ব্যর্থ করুন)
EFFORT_O1 ফিট করার জন্য কম প্রচেষ্টা লাগে
EFFORT_O2 মানিয়ে নিতে যথেষ্ট প্রচেষ্টা প্রয়োজন (প্রোডাকশন ওয়ার্কলোডের জন্য উপযুক্ত ডিফল্ট)
EFFORT_O3 মেমরি ব্যবহার কমাতে ব্যয়বহুল বা পরীক্ষামূলক অ্যালগরিদম