অ্যাহেড-অফ-টাইম (AOT) কম্পাইলেশন একটি XLA কম্পিউটেশনকে একই পরিবেশে কম্পাইল ও সিরিয়ালাইজ করে, যার ফলে প্রাপ্ত বাইনারি আর্টিফ্যাক্টটি পরবর্তীতে আলাদাভাবে ডেপ্লয় করা একটি রানটাইম দ্বারা লোড ও এক্সিকিউট করা যায়।
জাস্ট-ইন-টাইম (JIT) কম্পাইলেশনের বিপরীতে, যা প্রথমবার চালু হওয়ার সময় চলমান প্রসেসে কম্পিউটেশনগুলো কম্পাইল করে, AOT কম্পাইলেশনকে সার্ভিং পাথ থেকে সরিয়ে দেয়, যা স্টার্টআপ ল্যাটেন্সি কমায় এবং কম্পাইলেশনকে একটি ডেডিকেটেড বিল্ড এনভায়রনমেন্টে চলতে দেয়।
ওয়ার্কফ্লো এবং এপিআই
আদর্শ AOT পাইপলাইনটি কম্পাইল, সিরিয়ালাইজ এবং লোড/ডিসেরিয়ালাইজ পর্যায়গুলো নিয়ে গঠিত:
- PjRt এন্ট্রি পয়েন্ট: C++ PjRt ইন্টারফেসে (
xla/pjrt/pjrt_client.h),PjRtClient::Compile(বাCompileAndLoad) এর মাধ্যমে কম্পাইলেশন শুরু করা হয়। ফলস্বরূপ এক্সিকিউটেবলটিPjRtExecutable::SerializeExecutableএর মাধ্যমে একটি স্ট্রিং-এ সিরিয়ালাইজ করা হয়। সার্ভিং হোস্টে, রানটাইমPjRtClient::DeserializeExecutableব্যবহার করে এক্সিকিউটেবলটি পুনর্গঠন করে অথবাPjRtClient::LoadSerializedExecutableদিয়ে সরাসরি এক্সিকিউশনের জন্য লোড করে। - কম্পাইলার-স্তরের উপাদানসমূহ: কম্পাইলার স্তরে, অ্যাহেড-অফ-টাইম কম্পাইলেশন একটি
GpuAotCompilationResult(একটিCompiledModule;AotCompilationResultএকটি অপ্রচলিত বিকল্প নাম) তৈরি করে। এই অবজেক্টটি সিরিয়ালাইজডGpuExecutableProtoএনক্যাপসুলেট করে এবংSerializeAsString()ওLoadExecutable()দুটিকে উন্মুক্ত করে। কমান্ড-লাইন টুলিং:
xla_compileটুলটি HLO বা StableHLO মডিউলগুলোকে কম্পাইল করে সিরিয়ালাইজড এক্সিকিউটেবলে পরিণত করে:xla_compile --module_file=module.hlo --output_file=output.bin \ --platform=gpu --gpu_target_config=gpu_target_config.pbtxtটার্গেট ডিভাইস কনফিগারেশন প্রদান করে জিপিইউ ছাড়াই হোস্টে কম্পাইলেশন চালানো যায় (
xla/backends/gpu/target_configREADME দেখুন)।
সিরিয়ালাইজড কী
সিরিয়ালাইজড GPU প্রোগ্রামগুলির শীর্ষ-স্তরের কন্টেইনার হল GpuExecutableProto :
-
thunks: এক্সিকিউশন থাঙ্কগুলোর ক্রম। কার্নেল থাঙ্কস (উদাহরণস্বরূপCustomKernelThunk) তাদের নিজস্ব কম্পাইল করা কার্নেল বাইনারি (NVIDIA-এর জন্যcubin, ROCm-এর জন্যhsaco) এমবেড করে, তাই বেশিরভাগ ডিভাইস কোড এখানেই থাকে। -
binary: একটি মডিউল-স্তরের ডিভাইস বাইনারি। বর্তমানে এটি কেবল মডিউলের ধ্রুবক বাফারগুলো ধারণ করে; এখানে আর কার্নেল সংরক্ষণ করা হয় না। -
buffer_allocations: বাফারের আকার এবং বরাদ্দের অংশ। -
gpu_compute_capability: কম্পাইল টার্গেটের হার্ডওয়্যার আর্কিটেকচার সক্ষমতা। -
executable_abi_version: টুলচেইন এবং রানটাইম ABI সংস্করণ। -
hlo_module_with_config: এমবেডেড সিরিয়ালাইজডHloModuleProtoএবং ডিবাগ মেটাডেটা।
GpuExecutableProto থেকে পরোক্ষভাবে পৌঁছানো যায় এমন প্রতিটি প্রোটো মেসেজ এবং ফিল্ড , GPU AOT কম্প্যাটিবিলিটি গাইডে বর্ণিত কম্প্যাটিবিলিটি কন্ট্রাক্টের অংশ।
কীভাবে একটি আর্টিফ্যাক্ট লোড এবং এক্সিকিউট করা হয়
- থাঙ্ক গ্রাফটি পুনর্গঠন করুন:
ThunkProtoএন্ট্রিগুলোকে ইন-মেমরি থাঙ্ক সিকোয়েন্সে ডিসিরিয়ালাইজ করুন এবং এই প্রক্রিয়ায় কাস্টম কল, এফএফআই, ও কার্নেল সিম্বলগুলো রিজলভ করুন। এমবেডেড এইচএলও মডিউলটিও পার্স করা হয়, তাই লোডিং বাইনারির কাছে অজানা কোনো এইচএলও অপকোড লোড প্রক্রিয়াকে ব্যর্থ করে দেয়। - থাঙ্ক গ্রাফ রূপান্তর ধাপসমূহ চালান: ইন-মেমরি থাঙ্কগুলোর উপর লোড-টাইম অপ্টিমাইজেশন এবং রূপান্তর ধাপসমূহ সম্পাদন করুন (উদাহরণস্বরূপ, CUDA গ্রাফের মাধ্যমে কাজ জমা দেওয়ার জন্য রানটাইম
CommandBufferThunkতৈরি করা)।CommandBufferThunkলোড হওয়ার সময় ডায়নামিকভাবে পুনর্গঠিত হয় এবং এটি কখনোই সরাসরি সিরিয়ালাইজ করা হয় না। - বাফার বরাদ্দ করুন: ক্রমিক বাফার অ্যাসাইনমেন্ট স্লাইস অনুযায়ী মেমরি স্পেস এবং বাফার বরাদ্দ শুরু করুন।
- কার্যকর করুন: ডিভাইস স্ট্রিমগুলিতে প্রস্তুত থাঙ্ক সিকোয়েন্সটি প্রেরণ করুন।
পাস, ফিউশন, কোডজেন এবং অটোটিউনিং-এর এমন পরিবর্তনসমূহ, যা সিরিয়ালাইজড স্কিমা ও রানটাইম সিম্যান্টিকস অক্ষুণ্ণ রাখে, তা AOT কম্প্যাটিবিলিটিকে প্রভাবিত করে না।
সমস্যা সমাধান: লোড ব্যর্থতা যা ভার্সনিং বাগ নয়
সব এক্সিকিউটেবল লোড ব্যর্থতার কারণ সিরিয়ালাইজেশন রিগ্রেশন নয়। দুটি সাধারণ পরিবেশগত অমিল লোড-টাইম ত্রুটি তৈরি করে:
- কম্পিউট ক্যাপাবিলিটি অমিল:
GpuExecutable::FromProtoযাচাই করে যে সিরিয়ালাইজডgpu_compute_capabilityটার্গেট ডিভাইসের সাথে মেলে কিনা। NVIDIA Hopper-এর জন্য কম্পাইল করা একটি এক্সিকিউটেবল NVIDIA Ampere-এ চলতে পারে না। - CUDA টুলচেইন ABI অমিল:
CudaRuntimeAbiVersion::IsCompatibleWithপরীক্ষা করে দেখে যে রানটাইম হোস্টের CUDA টুলকিট, cuDNN, এবং CUB সংস্করণগুলিExecutableAbiVersionProtoতে নথিভুক্ত ন্যূনতম সংস্করণগুলিকে পূরণ করে বা অতিক্রম করে কিনা। যদি হোস্ট ড্রাইভার বা লাইব্রেরি পরিবেশ কম্পাইল টার্গেটের চেয়ে পুরোনো হয়, তাহলেFailedPreconditionErrorসাথে লোডিং ব্যর্থ হয়।