ত্রুটি কোড: ০১০১

বিভাগ: প্রোগ্রাম বরাদ্দ ব্যর্থতা

ধরণ: রানটাইম

ত্রুটি লগের উদাহরণ

XlaRuntimeError: RESOURCE_EXHAUSTED: Error loading program 'jit_embedding_pipeline_step_fn': Attempting to reserve 29.49G at the bottom of memory. That was not possible. There are 147.64M free, 0B reserved, and 147.64M reservable. Scope: unknown..: while running replica 0 and partition 34 of a replicated computation (other replicas may have failed as well).

এগুলো কেন হয়?

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

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

যখন কোনও ব্যবহারকারী তার প্রোগ্রামে কোনও সমস্যা হয়, তখন কীভাবে তা ঠিক করতে পারে?

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

একজন ব্যবহারকারী কীভাবে এই ব্যর্থতাগুলি ডিবাগ করতে পারেন?

  • tpu_log_allocations_on_oom ফ্ল্যাগটি সক্রিয় করুন যার জন্য বরাদ্দকারী OOM ঘটলে সমস্ত বর্তমান বরাদ্দের একটি বিস্তারিত প্রতিবেদন ডাম্প করবে, যা ডিবাগিংয়ের জন্য অমূল্য হতে পারে।
  • আপনার প্রোগ্রামের প্রোফাইল তৈরি করুন: সময়ের সাথে সাথে আপনার প্রোগ্রামের মেমোরি ব্যবহারের বিস্তারিত ধারণা পেতে JAX মেমোরি প্রোফাইলার বা টেনসরফ্লো প্রোফাইলার ব্যবহার করুন। এটি মেমোরি ব্যবহারের অপ্রত্যাশিত সর্বোচ্চ স্তর সনাক্ত করতে সাহায্য করতে পারে।