অন-ডিভাইস LLM-এর জন্য KV ক্যাশ কোয়ান্টাইজেশন

২ জিবি র‍্যাম (RAM) বিশিষ্ট একটি অ্যান্ড্রয়েড ডিভাইসে Llama 3.2 3B চালানো বেশ কঠিন। বেশিরভাগ ডেভেলপার মডেল ওয়েইট (model weights)-এর দিকে মনোযোগ দেন। এটি একটি ভুল। আসল মেমরি দখলকারী হলো KV ক্যাশ।

চ্যাট করার সাথে সাথে KV ক্যাশ বাড়তে থাকে। আপনি যদি স্ট্যান্ডার্ড FP16 প্রিসিশন ব্যবহার করেন, তবে ক্যাশটি শত শত মেগাবাইট দখল করে নেয়। এর ফলে মাত্র কয়েকবার চ্যাট করার পরেই আপনার অ্যাপ ক্র্যাশ করতে পারে।

আপনি তিনটি নির্দিষ্ট পদক্ষেপের মাধ্যমে এটি সমাধান করতে পারেন।

১. মিক্সড-প্রিসিশন কোয়ান্টাইজেশন (Mixed-Precision Quantization) ব্যবহার করুন কী (Key) এবং ভ্যালু (Value)-এর জন্য একই প্রিসিশনের প্রয়োজন নেই। কী ক্যাশ কম প্রিসিশন ভালোভাবে সামলাতে পারে। ভ্যালু ক্যাশ পারে না।

এই পদ্ধতিটি আপনার ক্যাশ সাইজ ৬২% কমিয়ে দেয়। ২০৪৮ টোকেন কনটেক্সটের জন্য, এটি ২২৪ এমবি থেকে কমে ৮৪ এমবি-তে নেমে আসে। এটি মডেল ওয়েইট পরিবর্তন না করেই সম্ভব।

২. স্লাইডিং উইন্ডো ইভিকশন (Sliding Window Eviction) প্রয়োগ করুন আপনি প্রতিটি টোকেন অ্যাক্টিভ মেমরিতে রাখতে পারবেন না। শুধুমাত্র সাম্প্রতিক ১৫৩৬টি টোকেন রাখার জন্য একটি স্লাইডিং উইন্ডো ব্যবহার করুন। সিস্টেম প্রম্পট বজায় রাখার জন্য প্রথম ৬৪টি টোকেনকে অ্যাঙ্কর (anchor) হিসেবে রাখুন।

৩. ফ্ল্যাশ স্পিলিং (Flash Spilling) ব্যবহার করুন যখন টোকেনগুলো স্লাইডিং উইন্ডো থেকে বেরিয়ে যায়, তখন সেগুলোকে ফ্ল্যাশ স্টোরেজে সরিয়ে নিন। অ্যান্ড্রয়েডে মেমরি-ম্যাপড ফাইল (memory-mapped files) ব্যবহার করুন। আধুনিক UFS 4.0 স্টোরেজ কোনো ল্যাগ ছাড়াই এই ডেটা পুনরায় মেমরিতে ফিরিয়ে আনার জন্য যথেষ্ট দ্রুত।

ফলাফলগুলো উল্লেখযোগ্য। একটি Snapdragon 8 Gen 3-এ:

এই ভুলগুলো এড়িয়ে চলুন:

ফিচার তৈরির আগে আপনার মেমরি বাজেট তৈরি করুন।

উৎস: https://dev.to/software_mvp-factory/kv-cache-quantization-for-on-device-llms-kf