Alterna · учебный материал

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

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

Что в этом материале

Содержание и основные понятия

На предыдущей странице: первый запуск обрабатывает введённую фразу.
Прошлые ключи и значения уже рассчитаны. Для нового токена добавим новые числа и сравним результат с полным повторным расчётом.
Первый запуск обрабатывает префикс. Каждый последующий добавляет одну позицию; K/V прошлых позиций можно сохранять. Выборка и сжатое хранение решают разные задачи.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Не пересчитываем 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:
M
K
V
=
2
L
H
k
v
d
h
T
b
.
M_{KV}=2LH_{kv}d_hTb.
M
K
V
​
=
2
L
H
k
v
​
d
h
​
T
b
.
Множитель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
Академическая база →

Структурная карта учебников