XLA-তে GPU-এর অনির্দিষ্টতা দুটি স্বতন্ত্র উৎস থেকে উদ্ভূত হয়:
- কম্পাইলেশন-টাইম নন-ডিটারমিনিজম (অটোটিউনিং)
- নির্বাহ-সময়ের অনির্দিষ্টতা (অনির্দিষ্ট অপারেশন)
উৎস ১: কম্পাইলেশন-সময়ের অনির্দিষ্টতা (অটোটিউনিং)
কারণ
কম্পাইলেশনের সময়, XLA-এর অটোটিউনার GEMM এবং কনভোলিউশনের মতো নির্দেশাবলীর জন্য দ্রুততম অ্যালগরিদম খুঁজে বের করতে হোস্টের GPU-তে সরাসরি থাকা একাধিক সম্ভাব্য কার্নেল ইমপ্লিমেন্টেশনের (যেমন, cuBLAS, cuDNN, Triton, নেটিভ এমিটার) প্রোফাইল তৈরি করে।
যেহেতু লাইভ প্রোফাইলিং মাইক্রোসেকেন্ড-স্তরের টাইমিং পরিমাপের উপর নির্ভর করে, তাই পারিপার্শ্বিক হার্ডওয়্যারের সূক্ষ্ম ওঠানামা (যেমন GPU থার্মাল থ্রটলিং, ডায়নামিক ক্লক ফ্রিকোয়েন্সি স্কেলিং, হোস্ট OS শিডিউলিং) বিভিন্ন কম্পাইলেশন রানে ভিন্ন ভিন্ন কার্নেল বাইনারিকে বিজয়ী হিসেবে নির্বাচিত বা তৈরি করতে পারে।
যেহেতু বিভিন্ন কার্নেল অ্যালগরিদম স্বতন্ত্র টাইল সাইজ, মেমরি অ্যাক্সেস প্যাটার্ন এবং রিডাকশন ট্রি স্ট্রাকচার ব্যবহার করে, তাই তারা ফ্লোটিং-পয়েন্ট সংখ্যাগুলোকে ভিন্ন ভিন্ন ক্রমে সঞ্চয় করে। ফ্লোটিং-পয়েন্টের নন-অ্যাসোসিয়েটিভিটির কারণে, একই HLO গ্রাফ দুইবার কম্পাইল করলে এমন বাইনারি তৈরি হতে পারে, যেগুলোর সাংখ্যিক গণনার ফলাফল সামান্য ভিন্ন হয়।
কম্পাইলেশন-টাইম ডিটারমিনিজম কীভাবে অর্জন করা যায়
- অটোটিউনিং সিদ্ধান্তসমূহ স্থায়ী করা ও ক্যাশে সংরক্ষণ করা : অটোটিউনিং একবার চালান এবং পছন্দগুলো একটি স্থায়ী ক্যাশে সংরক্ষণ করুন (দেখুন স্থায়ী অটোটিউনিং )।
--xla_gpu_require_complete_aot_autotune_resultsফ্ল্যাগটি ব্যবহার করলে XLA কঠোরভাবে ক্যাশে করা সিদ্ধান্তগুলো পুনঃব্যবহার করে এবং কোনো এন্ট্রি অনুপস্থিত থাকলে সাথে সাথে একটিNotFoundত্রুটি দেখিয়ে কম্পাইলেশন ব্যর্থ করে দেয়, যা লাইভ হার্ডওয়্যার বেঞ্চমার্কিং সম্পূর্ণরূপে এড়িয়ে চলে। - অটোটিউনিং নিষ্ক্রিয় করা :
--xla_gpu_autotune_level=0সেট করলে কম্পাইল করার সময় অটোটিউনিং বেঞ্চমার্ক সম্পূর্ণরূপে নিষ্ক্রিয় হয়ে যায় এবং ডিফল্ট / প্রথম বৈধ কনফিগারেশনগুলি সুনির্দিষ্টভাবে নির্বাচিত হয়।
উৎস ২: কার্য সম্পাদনকালীন অনির্দিষ্টতা (অনির্দিষ্ট অপারেশন)
কারণ
এমনকি সংকলিত বাইনারিটি বিভিন্ন রানে ১০০% অভিন্ন হলেও, হুবহু একই এক্সিকিউটেবল একাধিকবার চালালে স্বাভাবিকভাবেই ভিন্ন ভিন্ন সাংখ্যিক আউটপুট আসতে পারে।
জিপিইউ-তে হাজার হাজার থ্রেড সমান্তরালভাবে চলে। scatter এর মতো অপারেশনগুলো অসংগঠিত থ্রেড জুড়ে অ্যাটমিক অপারেশন ব্যবহার করে মেমরি বাফারে মান জমা করে। যেহেতু প্রতিটি রানের সাথে থ্রেড শিডিউলিং-এর ক্রম স্বাভাবিকভাবেই পরিবর্তিত হয়, তাই ফ্লোটিং-পয়েন্ট যোগফল একটি অনির্দিষ্ট ক্রমে ঘটে। যেহেতু ফ্লোটিং-পয়েন্ট যোগফল নন-অ্যাসোসিয়েটিভ ( (a + b) + c != a + (b + c) ), তাই প্রতিটি রানের এক্সিকিউশন আউটপুট ভিন্ন হয়।
নিয়তিবাদ কীভাবে অর্জন করা যায়
-
--xla_gpu_exclude_nondeterministic_ops: XLA-কে নিম্নলিখিত নির্দেশ দিয়ে কার্য সম্পাদনের নির্দিষ্টতা বলবৎ করে:- কনফিগারেশন নির্বাচনের সময় অনির্দিষ্ট অ্যালগরিদম/কার্নেল/ব্যাকএন্ড ভ্যারিয়েন্টগুলো ফিল্টার করে বাদ দিন এবং নির্দিষ্ট লোয়ারিং প্রয়োগ করুন (স্ক্যাটার, জিইএমএম, কনভোলিউশনের জন্য)।
- অনির্ধারিত অ্যাটমিক স্ক্যাটার অপারেশনগুলো দূর করার জন্য
select-and-scatterমতো অপারেশনগুলোকে একগুচ্ছ নির্ধারিত অপারেশনে পুনর্লিখন করুন। - লাইভ অটোটিউনিং বেঞ্চমার্ক নিষ্ক্রিয় করুন (প্রথম বৈধ ডিটারমিনিস্টিক কনফিগারেশনটি বেছে নিয়ে)।
পার্শ্ব প্রতিক্রিয়া এবং সুবিধা-অসুবিধা
GPU-তে ডিটারমিনিজম প্রয়োগ করার ক্ষেত্রে উল্লেখযোগ্য কিছু সুবিধা-অসুবিধা জড়িত রয়েছে:
- রানটাইম পারফরম্যান্সের অবনতি (ধীরগতি) :
-
scatter(এবং এক্সপান্ডেডselect-and-scatter)-এর মতো অপারেশনগুলির ডিটারমিনিস্টিক ইমপ্লিমেন্টেশনগুলি অসংগঠিত অ্যাটমিক আপডেটগুলিকে অতিরিক্ত ইনডেক্স সর্টিং পাস বা ডিটারমিনিস্টিক রিডাকশন স্টেপ দ্বারা প্রতিস্থাপন করে, যা নন-ডিটারমিনিস্টিক অ্যাটমিক ফাস্ট পাথের তুলনায় রানটাইম থ্রুপুটে উল্লেখযোগ্য ক্ষতি করতে পারে। - লাইভ অটোটিউনিং বাইপাস করলে (
--xla_gpu_autotune_level=0) XLA নির্দিষ্ট GPU আর্কিটেকচারের জন্য দ্রুততম কার্নেলটি খুঁজে বের করতে পারে না, যার ফলে সর্বোত্তম নয় এমন কার্নেল নির্বাচন করা হয়।
-
- কম্পাইলেশন হার্ড-ফেলিউর :
- যদি কোনো HLO গ্রাফে এমন নির্দেশাবলী থাকে যার কোনো ডিটারমিনিস্টিক ইমপ্লিমেন্টেশন নেই, তাহলে
--xla_gpu_exclude_nondeterministic_opsসক্রিয় করলে একটি ত্রুটি সহ কম্পাইলেশন থেমে যায়। -
--xla_gpu_require_complete_aot_autotune_resultsব্যবহার করার সময়, আগে থেকে পূরণ করা অটোটিউন ক্যাশে কোনো ইন্সট্রাকশনের এন্ট্রি না থাকলে কম্পাইলেশন সাথে সাথে একটিNotFoundএরর দিয়ে ব্যর্থ হবে।
- যদি কোনো HLO গ্রাফে এমন নির্দেশাবলী থাকে যার কোনো ডিটারমিনিস্টিক ইমপ্লিমেন্টেশন নেই, তাহলে
- নিষ্ক্রিয় অপ্টিমাইজেশন এবং এমিটার :
- যখন নিয়তিবাদের প্রয়োজন হয়, তখন নির্দিষ্ট কিছু উচ্চ-ক্ষমতাসম্পন্ন কার্নেল এমিটার এবং ফিউশন রূপান্তর (যেমন ট্রাইটন ফিউশন অটোটিউনিং) স্বয়ংক্রিয়ভাবে বিবেচনার বাইরে রাখা হয়।