Квантование KV-кэша для локальных LLM

Запуск Llama 3.2 3B на Android-устройстве с 2 ГБ оперативной памяти — задача непростая. Большинство разработчиков сосредотачиваются на весах модели. Это ошибка. Настоящий «убийца» памяти — это KV-кэш.

KV-кэш растет по мере общения. Если использовать стандартную точность FP16, кэш поглощает сотни мегабайт. Это приводит к вылету приложения всего через несколько реплик.

Это можно исправить с помощью трех конкретных шагов.

  1. Используйте смешанное квантование (Mixed-Precision Quantization) Ключам (Keys) и значениям (Values) не требуется одинаковая точность. Кэши ключей хорошо справляются с низкой точностью. Кэши значений — нет.

Такой подход уменьшает размер кэша на 62%. Для контекста в 2048 токенов объем памяти снижается с 224 МБ до 84 МБ. Это происходит без изменения весов модели.

  1. Внедрите вытеснение скользящим окном (Sliding Window Eviction) Невозможно держать каждый токен в активной памяти. Используйте скользящее окно, чтобы хранить только последние 1536 токенов. Оставьте первые 64 токена в качестве «якорей» для сохранения системного промпта.

  2. Используйте сброс в Flash-память (Flash Spilling) Когда токены выходят за пределы скользящего окна, перемещайте их во Flash-память. Используйте memory-mapped файлы в Android. Современная память UFS 4.0 достаточно быстрая, чтобы подгружать эти данные обратно в память без задержек.

Результаты значительны. На Snapdragon 8 Gen 3:

Избегайте этих ошибок:

Сначала планируйте бюджет памяти, а затем — функционал.

Источник: https://dev.to/software_mvp-factory/kv-cache-quantization-for-on-device-llms-kf