Summary
KV Cache는 Transformer 모델의 추론 과정에서 이전에 계산한 Key와 Value 벡터를 저장하여 중복 연산을 제거하는 최적화 기법이다. 자동 회귀(autoregressive) 생성에서 추론 속도를 극적으로 향상시킨다.
Why It Matters
LLM은 토큰을 하나씩 순차적으로 생성한다. 새 토큰을 생성할 때마다 이전 모든 토큰에 대한 Attention을 다시 계산하면 O(n²) 비용이 매 스텝 발생한다. KV Cache는 이를 O(n)으로 줄여 실시간 서비스를 가능하게 한다.
Core Diagram
Step 1: "Hello" → K₁,V₁ 계산 & 캐싱 → "World" 생성
Step 2: "Hello World" → K₁,V₁ 재사용 + K₂,V₂ 캐싱 → "!" 생성
Step 3: "Hello World!" → K₁,V₁,K₂,V₂ 재사용 + K₃,V₃ 캐싱 → ...
Without KV Cache: 매 스텝마다 전체 재계산 (느림)
With KV Cache: 새 토큰만 계산, 나머지 재사용 (빠름)
Concept Explanation
자동 회귀 생성의 구조
LLM은 텍스트를 한 토큰씩 생성한다:
- 입력 시퀀스로 첫 번째 토큰 생성
- 생성된 토큰을 입력에 추가
- 확장된 입력으로 다음 토큰 생성
- 반복...
KV Cache의 동작
Attention 연산에서 Q(Query), K(Key), V(Value)를 계산할 때:
- Query: 새로 생성할 토큰 위치에서만 필요
- Key, Value: 이전 모든 위치에서 필요하지만, 이전 토큰의 K,V는 변하지 않음
따라서 이전 토큰의 K,V를 메모리에 캐싱해두면 매 스텝마다 새 토큰의 K,V만 계산하면 된다.
메모리 사용량
KV Cache 크기 = 2 × 레이어 수 × 헤드 수 × 시퀀스 길이 × 헤드 차원 × 데이터 크기
예: LLaMA-7B (32 레이어, 32 헤드, 128 차원)
= 2 × 32 × 32 × 4096 × 128 × 2 bytes (FP16)
≈ 2 GB (4096 토큰 시퀀스)
System Perspective
프로덕션 환경에서 KV Cache는 GPU 메모리 관리의 핵심 과제다:
- 메모리 제약: KV Cache가 GPU VRAM의 상당 부분을 차지
- 배치 처리: 여러 요청을 동시 처리할 때 KV Cache가 배치 크기를 제한
- PagedAttention: vLLM이 도입한 기법으로, KV Cache를 페이지 단위로 관리하여 메모리 낭비 감소
- Context Length: 컨텍스트가 길수록 KV Cache가 커지므로 long-context 모델에서 특히 중요
Practical Insight
- KV Cache 크기는 배치 처리 가능한 동시 요청 수를 결정한다
- 긴 시스템 프롬프트가 있으면 KV Cache를 미리 계산해두는 "Prompt Caching" 기법이 유용하다
- Quantization으로 KV Cache 크기를 줄일 수 있다 (FP16 → INT8)
- vLLM, TGI 같은 서빙 프레임워크가 KV Cache를 자동으로 관리해준다
Common Misunderstandings
- KV Cache는 학습이 아닌 추론 시에만 사용되는 최적화다
- KV Cache가 있어도 첫 번째 토큰 생성(prefill)은 전체 입력을 처리해야 하므로 빠르지 않다
- 모든 레이어, 모든 Attention 헤드마다 별도의 KV Cache가 필요하다
- KV Cache를 사용해도 출력 품질은 동일하다 — 순수한 연산 최적화
Connected Topics
- 이전: Transformer, Attention
- 관련: 추론 최적화, Quantization