AI바라기의 인공지능

개념 정리(심화) : KV Cache (Key-Value 캐시) 원리 및 존재 이유 본문

인공지능

개념 정리(심화) : KV Cache (Key-Value 캐시) 원리 및 존재 이유

AI바라기 2026. 3. 11. 20:10

[LLM 추론] KV Cache (Key-Value 캐시) 원리 및 존재 이유

1. 들어가며: LLM의 순차적 토큰 생성과 Self-Attention

LLM은 텍스트를 생성할 때 토큰을 하나씩 순차적으로 만들어냅니다. 이때 새롭게 들어온 토큰이 '주인공(Query)'이 되고, 이전에 등장했던 토큰들이 '레퍼런스(Key, Value)'가 되어 주인공 자신을 업데이트하는 Self-Attention 과정을 거칩니다.

 

2. 문제 제기: 매번 처음부터 다시 계산해야 한다고?

여기서 치명적인 병목이 발생합니다. 다음 토큰을 생성할 때마다 이전 토큰들의 $K$$V$를 계산하고, 그다음 토큰을 생성할 때 또다시 앞선 모든 토큰의 $K$$V$를 처음부터 계산해야 합니다.

각 토큰을 변환하는 가중치 행렬($W_q, W_k, W_v, W_o$)은 모델 내에서 공유되어 값이 변하지도 않는데 말이죠.

이 무식한 재계산 과정 때문에 문장이 길어질수록 시간 복잡도가 폭발적으로 증가하게 됩니다.

$$\text{Total Time} \approx (1^2 + 2^2 + 3^2 + \dots + N^2) \cdot d = O(N^3 \cdot d)$$
 

3. 아이디어: "어차피 안 변하는데, 그냥 K랑 V를 저장하면 안 될까?"

생각해 보면, 언어 모델은 미래의 정보를 미리 보지 못합니다(Masking). 따라서 현재 새롭게 들어온 토큰이 과거 토큰들의 업데이트를 방해하거나 값을 바꾸지 않습니다.

그렇다면 $K$$V$를 매번 새로 계산할 게 아니라, 그냥 한 번 계산했을 때 저장해 두면 어떨까요? 이미 저장된 앞선 $K$$V$를 알고 있다면, 주인공 토큰의 $Q$만 계산해서 자기 자신을 즉시 업데이트할 수 있습니다.

 

4. 핵심 인사이트: 다중 레이어(Multi-Layer)와 Z+X의 마법

트랜스포머는 층(Layer)이 여러 개입니다. 층마다 K와 V를 저장을 한다면, 새로운 토큰을 포함한 이전 토큰들도 각 층에 저장된 앞선 $KV$를 통해 자신을 업데이트하면서 층을 통과할 수 있게 됩니다.

하지만 여기서 아주 중요한 포인트가 있습니다.

현재 들어온 토큰이 과거를 방해하지 않으므로, 이전 토큰들이 층을 지나가면서 남겨둔 $K, V$ 값은 **이미 해당 층에서 (Residual Connection에 의해) $Z+X$ 형태로 업데이트가 완료된 결과물의 $K, V$**인 셈입니다.

따라서 이전 토큰들을 굳이 층 위로 끌고 올라가며 다시 계산(업데이트)할 필요가 전혀 없습니다!

즉, 오직 현재 새로 들어온 토큰 하나에 대해서만, 각 층마다 미리 대기하고 있는 과거의 $KV$ 캐시를 뽑아와 자신을 업데이트해 나가면 끝납니다.

 

5. 결론: 시간(Time)과 공간(VRAM)의 교환

이러한 'KV 캐시' 방식을 도입하면 낭비되던 연산을 획기적으로 줄일 수 있습니다.

$$\text{Total Time} = (1 + 2 + 3 + \dots + N) \cdot d = O(N^2 \cdot d)$$
  • 장점 (시간 복잡도 이득): 과거 $KV$ 재계산이 생략되어 추론(Inference) 속도가 비약적으로 상승합니다.
  • 단점 (공간 복잡도 손해): 속도를 얻은 대신 VRAM(GPU 메모리)을 엄청나게 소모합니다. 문장이 길어질수록 수많은 과거 토큰의 $K$$V$를 '모든 층(Layer)'마다 차곡차곡 들고 있어야 하기 때문입니다.