KV Cache

KV-cache — оптимизация инференса: при авторегрессивной генерации K и V прошлых токенов в causal attention не меняются, поэтому их кэшируют и не пересчитывают. Ускоряет генерацию в разы, но становится главным узким местом по памяти.

Суть

Без кэша на каждом новом токене сеть пересчитывала бы K/V для всей последовательности заново. С кэшем — считаем K/V только для нового токена, а K/V прошлых берём из памяти.

Зачем это нужно

Генерация авторегрессивна (токен за токеном, см. Sampling Parameters); без KV-cache она была бы квадратично дорогой. Кэш переводит это в линейную работу на шаг — но платой становится память: VRAM при инференсе = веса модели + KV-cache.

Как работает

  • Causal attention (Attention) гарантирует, что токен N зависит только от 0..N → K/V прошлых неизменны → кэшируемы.
  • Память KV-cache растёт линейно с длиной контекста (и с числом слоёв/голов) — поэтому длинный контекст «дорогой» не только по compute, но и по VRAM (см. Context Window).
  • GQA (Grouped Query Attention) уменьшает KV-cache в несколько раз (например, ×4), разделяя K/V-головы между группами Q-голов.
  • На практике это определяет, сколько контекста влезет в локальную карту (см. Local LLM Deployment).

Связано с

  • Attention — кэшируются именно K/V из attention; GQA уменьшает кэш
  • Context Window — длина контекста = линейный рост KV-cache в памяти
  • Local LLM Deployment — VRAM = веса + KV-cache, лимит локального инференса

Открытые вопросы

  • paged attention / vLLM — как управляют KV-cache эффективно
  • квантизация KV-cache — что теряем по качеству