ত্রুটি কোড: E0100

বিভাগ: রানটাইম: বাফার বরাদ্দ ব্যর্থতা

এই ত্রুটিটি ইঙ্গিত করে যে XLA:TPU রানটাইমের মেমরি অ্যালোকেটর অনুরোধকৃত বরাদ্দের জন্য অ্যাক্সিলারেটরের HBM-এ উপযুক্ত মেমরি ব্লক খুঁজে পায়নি।

নমুনা ত্রুটি বার্তা:

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

সংক্ষিপ্ত বিবরণ

এই ত্রুটিটি এতে নিক্ষেপ করা হয়েছে:

  • jax.device_put এর মাধ্যমে ব্যবহারকারী-প্রবর্তিত বাফার বরাদ্দের ব্যর্থতা

অথবা

  • ব্যবহারকারী-নির্ধারিত প্রোগ্রামের আউটপুট বরাদ্দের ব্যর্থতা।

এই ব্যর্থতাগুলি সাধারণত কয়েকটি কারণে ঘটে:

  • মেমোরি শেষ (OOM): ব্যবহারকারী TPU-এর HBM-এ উপলব্ধ মোট ফ্রি মেমোরির চেয়ে বেশি মেমোরি বরাদ্দ করার চেষ্টা করছেন।
  • মেমোরি ফ্র্যাগমেন্টেশন: বরাদ্দ ব্যর্থ হয় কারণ মেমোরি স্পেসে কোনও একক সংলগ্ন মুক্ত ব্লক অনুরোধকৃত আকার পূরণ করার জন্য যথেষ্ট বড় নয়। মোট মুক্ত মেমোরি বরাদ্দের জন্য যথেষ্ট, তবে এটি ছোট, অ-সংলগ্ন ব্লকগুলিতে মেমোরি স্পেসে ছড়িয়ে ছিটিয়ে থাকে।

TPU রানটাইমে বরাদ্দ ব্যর্থতার পুনরায় চেষ্টা করার জন্য বেশ কয়েকটি প্রক্রিয়া রয়েছে যার মধ্যে রয়েছে:

  • যদি সারিবদ্ধ ডিলোকেশন থাকে, তাহলে রানটাইম পুনরায় চেষ্টা করে বরাদ্দ ব্যর্থ হয়েছে।
  • ফ্র্যাগমেন্টেশনের কারণে সৃষ্ট OOM-গুলিতে, রানটাইম স্বয়ংক্রিয়ভাবে একটি ডিফ্র্যাগমেন্টেশন এবং পুনরায় চেষ্টা শুরু করতে পারে।
  • TPU রানটাইম প্রোগ্রাম লোড রাখার চেয়ে বাফার বরাদ্দকে অগ্রাধিকার দেয়। অপর্যাপ্ত HBM এর কারণে যদি বাফার বরাদ্দ ব্যর্থ হয়, তাহলে বাফারের জন্য পর্যাপ্ত মেমরি না পাওয়া পর্যন্ত সিস্টেম লোড করা TPU প্রোগ্রামগুলিকে সরিয়ে দেবে।

তাই উপরের প্রশমনের পরে কোনও ত্রুটির সম্মুখীন হলে সাধারণত ব্যবহারকারীর পদক্ষেপের প্রয়োজন হয়।

ডিবাগিং

  • আপনার মডেলের মেমরি ফুটপ্রিন্ট কমিয়ে দিন
    • ব্যাচের আকার হ্রাস করুন: ব্যাচের আকার হ্রাস করলে মেমোরির ব্যবহার সরাসরি হ্রাস পায়।
    • প্যারামিটার শারডিং: খুব বড় মডেলের জন্য, একাধিক TPU কোর বা হোস্টের HBM জুড়ে প্যারামিটার বিতরণের জন্য মডেল প্যারালিজম বা শারডিংয়ের মতো কৌশল ব্যবহার করুন।
    • সিকোয়েন্স/প্রসঙ্গের দৈর্ঘ্য ছোট করুন: যেসব মডেল সিকোয়েন্সে কাজ করে (যেমন ল্যাঙ্গুয়েজ মডেল), তাদের ইনপুট সিকোয়েন্সের দৈর্ঘ্য কমিয়ে দিলে মেমোরি ফুটপ্রিন্ট উল্লেখযোগ্যভাবে কমে যেতে পারে।
    • বাফার ডোনেশন: ফ্রেমওয়ার্ক বৈশিষ্ট্যগুলি (যেমন: jax.jit(..., donate_argnums=...) ) ব্যবহার করে XLA-কে সিগন্যাল দিন যে নির্দিষ্ট ইনপুট বাফারগুলি ওভাররাইট করা যেতে পারে এবং আউটপুটের জন্য পুনরায় ব্যবহার করা যেতে পারে। আরও বিস্তারিত জানার জন্য বাফার ডোনেশন পড়ুন।
    • চেকপয়েন্ট কৌশলটি অপ্টিমাইজ করুন: একবারে পুরো মডেল অবস্থা সংরক্ষণ করার পরিবর্তে, শুধুমাত্র মডেল ওজন সংরক্ষণ করার কথা বিবেচনা করুন অথবা একটি খণ্ডিত চেকপয়েন্টিং কৌশল ব্যবহার করুন।
  • ঠিকানা মেমরি লেআউট এবং প্যাডিং
    • TPU মেমোরি খণ্ডে ভাগ করা হয়, এবং প্যাডিং টেনসরের প্রকৃত আকার বাড়াতে পারে।
  • নিশ্চিত করুন যে কোনও মেমরি লিক না হয়
    • নিশ্চিত করুন যে jax.Array অবজেক্টের রেফারেন্সগুলি নির্ধারিত সময়ের চেয়ে বেশি সময় ধরে রাখা হচ্ছে না। jax.Array অবজেক্টগুলি ধরে রাখলে প্রোগ্রাম সংকলন সম্পন্ন হওয়ার পরেও স্বয়ংক্রিয়ভাবে বরাদ্দ বাতিল হতে পারে।

প্রতিটি প্রোগ্রামের ব্যবহৃত মেমোরির পরিমাণ কমাতে আপনি যে অন্যান্য কৌশলগুলি ব্যবহার করতে পারেন তার জন্য ত্রুটি কোড: E1000 দেখুন।

টুলিং

tpu_log_allocations_on_oom ফ্ল্যাগটি সক্রিয় করুন যার জন্য বরাদ্দকারী OOM ঘটলে সমস্ত বর্তমান বরাদ্দের একটি বিস্তারিত প্রতিবেদন ডাম্প করবে, যা ডিবাগিংয়ের জন্য অমূল্য হতে পারে।