𝗞𝗩 𝗖𝗮𝗰𝗵𝗲 𝗤𝘂𝗮𝗻𝘁𝗶𝘇𝗮𝘁𝗶𝗼𝗻 𝗳𝗼𝗿 𝗢𝗻-𝗗𝗲𝘃𝗶𝗰𝗲 𝗟𝗟𝗠𝘀 کوانتیزاسیون KV Cache برای LLMهای روی دستگاه
اجرای Llama 3.2 3B روی یک دستگاه اندرویدی با ۲ گیگابایت رم دشوار است. اکثر توسعهدهندگان روی وزنهای مدل تمرکز میکنند. این یک اشتباه است. قاتل واقعی حافظه، KV cache است.
با ادامه چت، KV cache رشد میکند. اگر از دقت استاندارد FP16 استفاده کنید، این کش صدها مگابایت فضا اشغال میکند. این امر باعث میشود اپلیکیشن شما تنها پس از چند مرحله گفتگو کرش کند.
شما میتوانید این مشکل را با سه مرحله مشخص حل کنید.
۱. استفاده از کوانتیزاسیون با دقت ترکیبی (Mixed-Precision Quantization) کلیدها (Keys) و مقادیر (Values) به دقت یکسانی نیاز ندارند. کشهای کلید دقت پایین را به خوبی مدیریت میکنند، اما کشهای مقدار اینطور نیستند.
- از INT4 برای کلیدها استفاده کنید.
- از INT8 برای مقادیر استفاده کنید.
این رویکرد اندازه کش شما را تا ۶۲٪ کاهش میدهد. برای یک بافت (context) ۲۰۴۸ توکنی، حجم از ۲۲۴ مگابایت به ۸۴ مگابایت کاهش مییابد. این اتفاق بدون تغییر در وزنهای مدل رخ میدهد.
۲. پیادهسازی حذف با پنجره لغزان (Sliding Window Eviction) شما نمیتوانید تمام توکنها را در حافظه فعال نگه دارید. از یک پنجره لغزان استفاده کنید تا فقط ۱۵۳۶ توکن اخیر را نگه دارید. ۶۴ توکن اول را به عنوان لنگر (anchor) نگه دارید تا دستورالعمل سیستم (system prompt) حفظ شود.
۳. استفاده از Flash Spilling وقتی توکنها از پنجره لغزان خارج میشوند، آنها را به حافظه فلش منتقل کنید. در اندروید از فایلهای نگاشتشده در حافظه (memory-mapped files) استفاده کنید. حافظههای مدرن UFS 4.0 به اندازه کافی سریع هستند که این دادهها را بدون تأخیر دوباره به حافظه برگردانند.
نتایج قابل توجه است. روی یک Snapdragon 8 Gen 3:
- اوج مصرف حافظه به زیر محدودیت ۲ گیگابایتی میرسد.
- حداکثر مراحل گفتگو از ۴ به بیش از ۱۲ افزایش مییابد.
- سرعت تولید توکن افزایش مییابد زیرا کشهای کوچکتر از پهنای باند حافظه بهتر استفاده میکنند.
- کیفیت مدل تقریباً بدون تغییر باقی میماند.
از این اشتباهات دوری کنید:
- کلیدها و مقادیر را با سطح یکسانی کوانتیزه نکنید؛ در غیر این صورت کیفیت را از دست خواهید داد.
- محدودیت حرارتی (thermal throttling) را نادیده نگیرید. استنتاج مداوم باعث داغ شدن دستگاه میشود. برای مدیریت عملکرد، Android Thermal HAL را بررسی کنید.
- چرخه حیات کش را فراموش نکنید. همیشه بافرهای نگاشتشده را به یک محدوده (scope) مناسب متصل کنید تا از نشت حافظه (memory leak) جلوگیری شود.
پیش از ساختن قابلیتها، بودجه حافظه خود را تعیین کنید.
منبع: https://dev.to/software_mvp-factory/kv-cache-quantization-for-on-device-llms-kf