সমস্যার কোড: E2001

বিভাগ: কম্পাইল টাইম: হার্ডওয়্যারে কাজ করে না এমন RHS DataType

ম্যাট্রিক্স মাল্টিপ্লিকেশন (যেমন, jax.lax.dot_general, jax.lax.conv, jax.numpy.matmul, অথবা @ অপারেটর)-এ ব্যবহৃত ডানদিকের (RHS) অপারেন্ডের ডেটা টাইপ নির্দিষ্ট TPU জেনারেশন দ্বারা নেটিভভাবে কাজ না করলে এই সমস্যা হয়।

সমস্যার মেসেজের নমুনা:

INTERNAL: Mosaic failed to compile TPU kernel: Unsupported matmul RHS type on target: 'vector<256x256xi8>'
...

The MLIR operation involved:
%13440 = "tpu.matmul"(%13435, %13437, %13439) <dimension_numbers = #tpu.dot_dimension_numbers<...>

XLA ব্যাকএন্ড: TPU

এক নজরে

TPU-এর ম্যাট্রিক্স মাল্টিপ্লাই ইউনিট (MXU) নেটিভভাবে Float32 অপারেশনকে সব হার্ডওয়্যার জেনারেশনে সাপোর্ট করে।

তবে, BFloat16 এবং অন্যান্য কোয়ান্টাইজড ডেটা টাইপের (যেমন, Int4, Int8 বা Float8) জন্য নেটিভ সাপোর্ট হার্ডওয়্যার জেনারেশন অনুযায়ী আলাদা আলাদা হয়। আপনার কার্নেল যখন MXU-তে ম্যাট্রিক্স মাল্টিপ্লিকেশন ম্যাপ করার চেষ্টা করে তখন এই সমস্যাটি ট্রিগার হয়। এটি এমন ডেটা টাইপ ব্যবহার করে যা আপনার নির্দিষ্ট TPU জেনারেশনের কাছে এক্সিকিউট করার জন্য ফিজিক্যাল সার্কিটরি নেই।

এই সমস্যা সাধারণত ইঙ্গিত করে যে কম্পাইলারের ক্যানোনিকালাইজেশন পাস— যা অটোমেটিক কাজ করে না এমন ধরনকে কাজ করে এমন ধরনে কনভার্ট করার চেষ্টা করে (যেমন, সফ্টওয়্যার ইমুলেশনের মাধ্যমে)—একটি সঠিক কনভার্সন নিয়ম খুঁজে পায়নি অথবা কম্প্যাটিবিলিটি মোড বন্ধ করা থাকার কারণে এটি করতে পারেনি।

ডিবাগিং

এই সমস্যার সমাধান করতে, আপনার হার্ডওয়্যারের ক্ষমতার সাথে ডেটা টাইপকে মানানসই করতে হবে। আপনার কাছে এইসব বিকল্প রয়েছে:

১. নেটিভ ধরনের ডেটায় কাস্ট করা

সবচেয়ে নির্ভরযোগ্য সমাধান হল, matmul অপারেশনের আগে আপনার কার্নেলের মধ্যে হার্ডওয়্যার-সাপোর্ট করা ডেটাটাইপে (যেমন TPU v4+-এ Float32 বা BFloat16) আপনার অপার‍্যান্ডকে ম্যানুয়ালি কাস্ট করা।

  • কেন: Float32 হল এমন একটি সর্বজনীন ডেটার ধরন যা সব TPU জেনারেশনে MXU-এর মাধ্যমে নেটিভভাবে কাজ করে।
  • ট্রেড-অফ: এর সাথে VPU (ভেক্টর প্রসেসিং ইউনিট) সংক্রান্ত খরচ যুক্ত থাকে - কাস্ট পারফর্ম করার জন্য প্রয়োজনীয় সাইকেল, তবে এটি গ্যারান্টি দেয় যে আপনার কার্নেল বর্তমান হার্ডওয়্যারে রান করবে।

২. কম্প্যাটিবিলিটি মোড চেক করা

সাধারণত, কম্পাইলার কম্প্যাটিবিলিটি মোডে এই ধরনের টাইপ না মেলা সংক্রান্ত সমস্যা অটোমেটিক ম্যানেজ করতে পারে, যা ডিফল্ট হিসেবে চালু থাকে। XLA কনফিগারেশন ডবল-চেক করুন যাতে --xla_mosaic_compat_mode false হিসেবে সেট করা না থাকে।

এটি "পলিফিল" হিসেবে কাজ করে, আপনার হার্ডওয়্যার নেটিভভাবে সাপোর্ট করে না এমন অপারেশনের জন্য সফ্টওয়্যার এমুলেশন সিকোয়েন্স ইনজেক্ট করে।

কম্প্যাটিবিলিটি মোড কী কী চালু করে:

  • মিক্সড-প্রিসিশন MatMuls: অটোমেটিক কাস্ট অপারেশন (যেমন, matmul-এর আগে Float32-এ পূর্ণসংখ্যা এক্সটেন্ড করা) ইনসার্ট করার মাধ্যমে Float অ্যাকুমুলেটর সহ পূর্ণসংখ্যা অপারেন্ড মিক্স করার অনুমতি দেয়।
  • কম-প্রিসিশন এমুলেশন: নির্দিষ্ট কিছু হার্ডওয়্যার জেনারেশনে, এমুলেট করে 4-bit ফ্লোটিং পয়েন্ট (4E2M1FN) বা 8-bit ফ্লোটিং পয়েন্ট (8E4M3FN)-এর মতো কাজ করে না এমন ধরনকে এক্সিকিউশনের আগে BFloat16 বা Float32-এর মতো কাজ করে এমন ধরনের সাথে এক্সটেন্ড করে।

মনে রাখবেন, এই মোডটি সেরা পারফর্ম্যান্সের পরিবর্তে কম্প্যাটিবিলিটিকে অগ্রাধিকার দেয় কারণ এমুলেশন MXU-তে কাজ করার আগে ডেটা ফর্ম্যাট কনভার্ট করার জন্য অতিরিক্ত নির্দেশাবলী প্রয়োজন।

৩. হার্ডওয়্যার আপগ্রেড করা বা সহায়তা চাওয়া

আপনার অ্যালগরিদমের যদি Int4 বা Float8-এর মতো ধরনের জন্য কাস্টিং বা ইমুলেশন ওভারহেড ছাড়াই কঠোরভাবে নেটিভ পারফর্ম্যান্সের প্রয়োজন হয়, তাহলে আপনাকে নেটিভ সাপোর্ট সহ আরও নতুন TPU জেনারেশনে রান করতে হবে।

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