বিভাগ: বাফার বরাদ্দ ব্যর্থতা - TPU
ধরণ: রানটাইম
ত্রুটি লগের উদাহরণ
ValueError: RESOURCE_EXHAUSTED: Error allocating device buffer: Attempting to allocate 8.00M. That was not possible. There are 6.43M free.; (0x0x1_HBM0)
এগুলো কেন হয়?
XLA:TPU রানটাইমের মেমোরি অ্যালোকেটর অনুরোধকৃত অপারেশনের জন্য অ্যাক্সিলারেটরের HBM-এ উপযুক্ত মেমোরি ব্লক খুঁজে পায়নি। এই অপারেশনগুলি সাধারণত jax.device_put এর মাধ্যমে ব্যবহারকারীর দ্বারা পরিচালিত বাফার অ্যালোকেশন অথবা প্রোগ্রাম আউটপুটগুলির জন্য অ্যালোকেশন। এই ব্যর্থতাগুলি কয়েকটি কারণে উদ্ভূত হয়: - মেমোরির বাইরে (OOM) - ব্যবহারকারী TPU-এর HBM-এ উপলব্ধ মোট ফ্রি মেমোরির চেয়ে বড় মেমোরির একটি অংশ বরাদ্দ করার চেষ্টা করছেন। - মেমোরি ফ্র্যাগমেন্টেশন - বরাদ্দ ব্যর্থ হয় কারণ মেমোরি স্পেসে কোনও একক কনটিগুয়াস ফ্রি ব্লক অনুরোধকৃত আকার পূরণ করার জন্য যথেষ্ট বড় নয়। ফ্রি মেমোরির মোট পরিমাণ অ্যালোকেশনের জন্য যথেষ্ট, তবে এটি মেমোরি স্পেসে ছোট, নন-কন্টিগুয়াস ব্লকে ছড়িয়ে ছিটিয়ে রয়েছে।
TPU রানটাইমে পুনরায় চেষ্টা করার জন্য বরাদ্দ ব্যর্থতার জন্য বেশ কয়েকটি প্রক্রিয়া রয়েছে যার মধ্যে রয়েছে: - যদি সারিবদ্ধ ডিলোকেশন থাকে, রানটাইম পুনরায় চেষ্টা করে ব্যর্থ বরাদ্দ, - ফ্র্যাগমেন্টেশনের কারণে সৃষ্ট OOM-গুলিতে রানটাইম স্বয়ংক্রিয়ভাবে একটি ডিফ্র্যাগমেন্টেশন এবং পুনরায় চেষ্টা ট্রিগার করতে পারে। - TPU রানটাইম প্রোগ্রাম লোড রাখার চেয়ে বাফার বরাদ্দকে অগ্রাধিকার দেয়। অপর্যাপ্ত HBM-এর কারণে যদি বাফার বরাদ্দ ব্যর্থ হয়, তাহলে সিস্টেম লোড করা TPU প্রোগ্রামগুলিকে সরিয়ে দেবে যতক্ষণ না বাফারের জন্য পর্যাপ্ত মেমরি উপলব্ধ হয়।
তাই উপরের প্রশমনের পরে কোনও ত্রুটির সম্মুখীন হলে সাধারণত ব্যবহারকারীর পদক্ষেপের প্রয়োজন হয়।
যখন কোনও ব্যবহারকারী তার প্রোগ্রামে কোনও সমস্যা হয়, তখন কীভাবে তা ঠিক করতে পারে?
- আপনার মডেলের মেমরি ফুটপ্রিন্ট কমিয়ে দিন:
- ব্যাচের আকার হ্রাস করুন: ব্যাচের আকার হ্রাস করলে মেমোরির ব্যবহার সরাসরি হ্রাস পায়।
- প্যারামিটার শেয়ারিং: খুব বড় মডেলের জন্য, একাধিক TPU কোর বা হোস্টের HBM জুড়ে প্যারামিটার বিতরণের জন্য মডেল প্যারালিজম বা শার্ডিংয়ের মতো কৌশল ব্যবহার করুন।
- সিকোয়েন্স/প্রসঙ্গের দৈর্ঘ্য ছোট করুন: যেসব মডেল সিকোয়েন্সে কাজ করে (যেমন ভাষা মডেল), ইনপুট সিকোয়েন্সের দৈর্ঘ্য কমিয়ে দিলে মেমোরি ফুটপ্রিন্ট উল্লেখযোগ্যভাবে কমে যেতে পারে।
- বাফার দান: XLA-কে সংকেত দিতে ফ্রেমওয়ার্ক বৈশিষ্ট্যগুলি (যেমন:
jax.jit(..., donate_argnums=...)) ব্যবহার করুন যে নির্দিষ্ট ইনপুট বাফারগুলি ওভাররাইট করা যেতে পারে এবং আউটপুটের জন্য পুনরায় ব্যবহার করা যেতে পারে। - চেকপয়েন্ট কৌশল অপ্টিমাইজ করুন: একবারে পুরো মডেল অবস্থা সংরক্ষণ করার পরিবর্তে, শুধুমাত্র মডেল ওজন সংরক্ষণ করা বা একটি তীক্ষ্ণ চেকপয়েন্টিং কৌশল ব্যবহার করার কথা বিবেচনা করুন।
- ঠিকানা মেমরি লেআউট এবং প্যাডিং:
- TPU মেমোরি খণ্ডে ভাগ করা হয়, এবং প্যাডিং টেনসরের প্রকৃত আকার বাড়াতে পারে।
- কোনও মেমরি লিক না হওয়া নিশ্চিত করুন:
- নিশ্চিত করুন যে
jax.Arrayঅবজেক্টের রেফারেন্সগুলি নির্ধারিত সময়ের চেয়ে বেশি সময় ধরে রাখা হচ্ছে না।jax.Arrayঅবজেক্টগুলি ধরে রাখলে প্রোগ্রাম সংকলন সম্পন্ন হওয়ার পরেও স্বয়ংক্রিয়ভাবে বরাদ্দ বাতিল হতে পারে।
- নিশ্চিত করুন যে
একজন ব্যবহারকারী কীভাবে এই ব্যর্থতাগুলি ডিবাগ করতে পারেন?
tpu_log_allocations_on_oom ফ্ল্যাগটি সক্রিয় করুন যার জন্য বরাদ্দকারী OOM ঘটলে সমস্ত বর্তমান বরাদ্দের একটি বিস্তারিত প্রতিবেদন ডাম্প করবে, যা ডিবাগিংয়ের জন্য অমূল্য হতে পারে।