𝗞𝗩 𝗖𝗮𝗰𝗵𝗲 𝗤𝘂𝗮𝗻𝘁𝗶𝘇𝗮𝘁𝗶𝗼𝗻 𝗳𝗼𝗿 𝗢𝗻-𝗗𝗲𝘃𝗶𝗰𝗲 𝗟𝗟𝗠𝘀 کوانتیزاسیون KV Cache برای LLMهای روی دستگاه

اجرای Llama 3.2 3B روی یک دستگاه اندرویدی با ۲ گیگابایت رم دشوار است. اکثر توسعه‌دهندگان روی وزن‌های مدل تمرکز می‌کنند. این یک اشتباه است. قاتل واقعی حافظه، KV cache است.

با ادامه چت، KV cache رشد می‌کند. اگر از دقت استاندارد FP16 استفاده کنید، این کش صدها مگابایت فضا اشغال می‌کند. این امر باعث می‌شود اپلیکیشن شما تنها پس از چند مرحله گفتگو کرش کند.

شما می‌توانید این مشکل را با سه مرحله مشخص حل کنید.

۱. استفاده از کوانتیزاسیون با دقت ترکیبی (Mixed-Precision Quantization) کلیدها (Keys) و مقادیر (Values) به دقت یکسانی نیاز ندارند. کش‌های کلید دقت پایین را به خوبی مدیریت می‌کنند، اما کش‌های مقدار این‌طور نیستند.

این رویکرد اندازه کش شما را تا ۶۲٪ کاهش می‌دهد. برای یک بافت (context) ۲۰۴۸ توکنی، حجم از ۲۲۴ مگابایت به ۸۴ مگابایت کاهش می‌یابد. این اتفاق بدون تغییر در وزن‌های مدل رخ می‌دهد.

۲. پیاده‌سازی حذف با پنجره لغزان (Sliding Window Eviction) شما نمی‌توانید تمام توکن‌ها را در حافظه فعال نگه دارید. از یک پنجره لغزان استفاده کنید تا فقط ۱۵۳۶ توکن اخیر را نگه دارید. ۶۴ توکن اول را به عنوان لنگر (anchor) نگه دارید تا دستورالعمل سیستم (system prompt) حفظ شود.

۳. استفاده از 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