alterna ai
ALTERNA AI / ГЛАВА 17 · 02

17.2 Следующий запуск использует сохранённое

На предыдущей странице: первый запуск обрабатывает введённую фразу.

Прошлые ключи и значения уже рассчитаны. Для нового токена добавим новые числа и сравним результат с полным повторным расчётом.

Первый запуск обрабатывает префикс. Каждый последующий добавляет одну позицию; K/V прошлых позиций можно сохранять. Выборка и сжатое хранение решают разные задачи.

Не пересчитываем keys и values прошлого

После prefill на каждом layer сохраняются key/value tensors прошлых tokens. Для нового token вычисляются только новые Q/K/V; query сопоставляется со всеми cached keys, а новый K/V дописывается. Без cache decoder повторял бы projections прошлого prefix на каждом шаге. Cache — activations конкретного request, не model parameters.

Для L layers, H_kv KV-heads, head width d_h, T cached tokens и b bytes на scalar грубый payload:

MKV=2LHkvdhTb.M_{KV}=2LH_{kv}d_hTb.

Множитель2 соответствует K и V. Batch requests, beam copies, allocator blocks, alignment и runtime workspace добавляются сверху. Multi-query/grouped-query attention уменьшает число KV-heads, но queries всё равно могут иметь больше heads. F08, F09.

Что показывает модель. Визуальная модель показывает append-only logical sequence и отдельно physical blocks. PagedAttention мотивирован переменной длиной requests и фрагментацией: logical соседство не требует одного большого непрерывного allocation. Sharing prefix допустим только при идентичных model inputs и корректном управлении lifetime.

Граница применимости. Формула payload не является обещанием фактической VRAM. Quantized cache может уменьшить bytes, но добавляет scales/kernels и ошибку. Eviction или sliding window меняют доступный context. Нельзя переиспользовать cache после изменения weights, adapter, positions или части prefix только потому, что shape совпадает.

layers_17b,kv_heads_17b,head_dim_17b,tokens_17b,bytes_17b=2,1,4,3,2
cache_bytes_17b=2*layers_17b*kv_heads_17b*head_dim_17b*tokens_17b*bytes_17b
assert cache_bytes_17b==96

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

Cache переиспользует causal K/V и растёт при каждом обработанном token.

Как выбирается один вариант. Как этот вопрос продолжает полученный результат?

Python-примеры главы 17 Академическая база →