Контекст LLM и KV-кеш: почему кончается память
При росте контекста движок хранит или резервирует больше данных внимания. Чтобы вернуть запас памяти, проверьте длину окна, число одновременных запросов и тип кеша.
Обновлено Редакция GAW
При генерации нового токена модель снова обращается к предыдущим токенам. KV-кеш сохраняет уже вычисленные ключи и значения внимания, чтобы движок мог использовать их повторно. Веса модели при этом занимают свою часть бюджета.
Коротко
- Размер окна ограничивает суммарное число токенов, доступных модели.
- Движок может выделить кеш сразу на всю ёмкость окна или управлять им блоками.
- Параллельные независимые запросы могут требовать отдельных слотов.
- Схема внимания и формат кеша влияют на расход памяти на токен.
Во сколько обходится контекст
Возьмём учебную GQA-модель с 32 слоями, 8 KV-головами, размером головы 128 и одинаковыми FP16 K и V. При полном внимании один токен требует 2 × 32 × 8 × 128 × 2 = 131072 байта, или 128 KiB. Для независимых слотов с полным резервом получаются следующие значения.
| Ёмкость окна на слот | Слотов | KV-кеш |
|---|---|---|
| 4096 токенов | 1 | 0,5 GiB |
| 8192 токена | 1 | 1 GiB |
| 8192 токена | 4 | 4 GiB |
| 32768 токенов | 1 | 4 GiB |
Здесь учтены только K и V, без весов, буферов, выравнивания и разделяемого префикса. Если 8192 токена выделены под ввод и ответ вместе, то при входе на 7000 токенов на продолжение и дополнительные служебные токены остаётся около 1192. Клиент может обрезать историю, а сервер может отклонить запрос или применить своё правило обработки переполнения.
Где меняется расчёт
| Архитектура или способ хранения | Что меняется |
|---|---|
| MHA и GQA с полным вниманием | Для MHA число KV-голов совпадает с числом голов запроса. В GQA несколько голов запроса делят одну KV-голову |
| Оконное и гибридное внимание | Оконные слои могут хранить только нужное окно, полные слои сохраняют более длинную историю. Проверьте реализацию кеша в движке |
| MLA | Некоторые модели используют сжатое латентное представление. Размер выводится из архитектуры и реализации MLA |
| Выделение блоками и кеш префикса | Реальный расход зависит от занятых блоков и возможного повторного использования общего начала запроса |
Проверка в Ollama
- Установите размер явно, например
/set parameter num_ctx 4096в интерактивном чате илиoptions.num_ctxв API. Сверьте настройки клиента, поскольку он может задать собственный размер. Фактическое значение по умолчанию зависит от конфигурации и версии. - Для контрольного запуска оставьте один запрос. Проверьте
ollama psи логи после загрузки. Затем повторите с увеличенным окном или настройкойOLLAMA_NUM_PARALLELсервера. Меняйте по одному параметру. - Если модель частично ушла на CPU или перестала загружаться, уменьшите окно или параллельность. При поддержке движком проверьте меньший формат кеша на одинаковых запросах. Сравните качество и скорость отдельно для промпта и генерации.
Для оценки всей загрузки прибавьте веса и буферы по разбору RAM и VRAM.
Частые вопросы
Входит ли ответ модели в контекстное окно?
Да. Выделите место под системную инструкцию, историю, текущий запрос, служебные токены и продолжение ответа.
Четыре сообщения подряд увеличивают память в четыре раза?
Последовательные сообщения удлиняют историю. Четыре одновременно обрабатываемых независимых запроса занимают несколько слотов, и движок может резервировать память под каждый.
Вес модели в Q4 означает, что кеш тоже Q4?
Формат весов и формат кеша настраиваются отдельно. Проверьте конфигурацию и логи своего движка.
Источники
- Ollama. Context length и FAQ — Зависимость контекста от настроек и проверка размещения
- Ollama. FAQ — num_ctx, параллельность и форматы KV-кеша
- vLLM. Hybrid KV Cache Manager — Блоки кеша, полное и оконное внимание
- DeepSeek-AI. DeepSeek-V2, arXiv:2405.04434 v5 — Multi-head Latent Attention и сжатое представление кеша
Нашли ошибку? ·