KV cache
При генерации новый токен смотрит на весь префикс. Ключи и значения старых токенов уже известны, но без кэша модель вычисляет их снова на каждом шаге. KV cache (кэш ключей и значений) сохраняет это прошлое и дописывает только новую пару
Прошлое вычисляется снова
Пусть префикс уже содержит несколько токенов. Чтобы добавить следующий, нужен новый запрос
Зафиксируйте длину префикса и сравните вычисление с кэшем и без него. Затем увеличьте префикс: какая работа повторяется, а какая сохраняется? Отдельно проверьте самый короткий префикс.
Переключайте режимы на одном и том же шаге генерации. С KV cache старые блоки читаются, но не пересчитываются; вычисляется только пара для нового токена.
Дописывать вместо пересчитывать
После каждого шага новые ключ и значение добавляются к уже сохранённым:
На следующем шаге attention читает весь cache, но вычисляет только новые
Сколько копий прошлого хранить
Cache растёт с длиной контекста, числом слоёв и числом KV-heads. При длинной генерации узкое место смещается: вместо повторного расчёта модель всё чаще ждёт, пока сохранённые
- Без cacheмало постоянной памяти; много повторных проекций.
- KV cacheкаждый токен занимает память; старые проекции не повторяются.
В обычном MHA у каждой query-head собственная KV-head. MQA (multi-query attention) оставляет одну общую KV-head, а GQA (grouped-query attention) делит запросы на несколько групп. Число query-heads при этом не меняется.
Начните с MHA и сосчитайте группы ключей и значений. Перейдите к GQA, затем к MQA: что должно произойти с памятью, если число голов запросов сохраняется? Проверьте это по схеме связей.