~/ai — inference — kv cache
‹ ai engineering06 / инференс

KV CACHE · НЕ СЧИТАТЬ ДВАЖДЫ

При генерации каждый новый токен смотрит на все прошлые через их K и V. Но прошлые токены не меняются, значит их K и V можно посчитать один раз и сохранить. Это и есть KV-кэш.

01 · генерация greedy
сверка двух способов…
02 · таблица K, слой 1 16 из 32 чисел на токен
без кэшавсё заново
на шаге –
с KV-кэшем+1 строка
на шаге –
Слева на каждом шаге все строки пересчитываются, хотя получаются те же самые числа. Справа старые строки берутся из памяти, считается только новая. То же происходит с V и во втором слое.
03 · умножений на каждом шаге посчитано по факту
без кэша, всего
0
с кэшем, всего
0
Без кэша каждый шаг дороже предыдущего, потому что текст растёт. С кэшем шаг стоит почти одинаково. Чем длиннее ответ, тем больше разрыв.
04 · цена: память K и V × 2 слоя × 32 числа
кэш0
Скорость покупается памятью: кэш растёт с каждым токеном. У нас это килобайты, а у больших моделей на длинном контексте кэш занимает гигабайты видеопамяти. Поэтому придумывают, как его ужать и как делить между запросами, — к этому ведёт continuous batching.
Модель та же, что на странице transformer: настоящие 27 810 весов в странице. Оба способа реально выполняются в браузере, умножения считаются счётчиком внутри кода, а совпадение ответов проверяется на каждом шаге.
session log
~/ai $ generate(use_cache=True)
токенов [0] шаг без кэша [–] с кэшем [–]