LLM Inference (5) - KV Cache

이도연·2026년 7월 20일

AI 이론 공부해보기

목록 보기
61/76
post-thumbnail

좋은 아침입니다.

Temperature가 토큰 확률 분포의 모양을 조절하는 값이라면, Top-k와 Top-p는 선택 가능한 토큰 후보의 범위를 제한하는 방법이었습니다.

지금까지는 모델이 어떤 토큰을 선택하는지에 집중했습니다.

이번 글에서는 조금 다른 주제를 다뤄보려고 합니다.

바로 LLM의 추론 속도를 빠르게 만들어주는 KV Cache입니다.

LLM은 답변을 한 번에 생성하지 않고 토큰을 하나씩 생성합니다.

이때 매번 이전 토큰들을 모두 다시 계산하면 비효율이 발생합니다.

KV Cache는 이 문제를 줄이기 위해 사용됩니다.


LLM은 토큰을 하나씩 생성한다

먼저 LLM의 답변 생성 방식을 다시 떠올려보겠습니다.
LLM은 문장 전체를 한 번에 생성하지 않습니다.
다음 토큰을 하나 예측하고, 그 토큰을 다시 입력에 붙인 뒤, 다시 다음 토큰을 예측합니다.

예를 들어 모델이 다음 문장을 생성한다고 가정해보겠습니다.

파이썬은 배우기 쉬운 프로그래밍 언어입니다.

모델은 내부적으로 다음과 같은 과정을 반복합니다.

1. 파이썬은

2. 파이썬은 배우기

3. 파이썬은 배우기 쉬운

4. 파이썬은 배우기 쉬운 프로그래밍

5. 파이썬은 배우기 쉬운 프로그래밍 언어입니다.

새로운 토큰을 하나 생성할 때마다 입력 문장이 점점 길어집니다.
문제는 여기서 발생합니다.


매번 모든 토큰을 다시 계산하면 비효율적이다

Transformer 기반 LLM은 Self-Attention을 이용해 각 토큰이 다른 토큰들과의 관계를 계산합니다. (Transformer와 Attention에 관해서는 관련을 작성하였으니 찾아보셔도 좋을 것 같습니다)

예를 들어 다음과 같은 입력이 있다고 해보겠습니다.

파이썬은 배우기 쉬운

모델은 각 토큰이 서로 어떤 관계를 가지는지 계산합니다.
그런데 다음 토큰을 생성하면 입력은 이렇게 바뀝니다.

파이썬은 배우기 쉬운 프로그래밍

여기서 새로 추가된 토큰은 프로그래밍 하나뿐입니다.

하지만 아무런 최적화가 없다면 모델은 앞부분의 토큰들까지 다시 계산해야 합니다.

파이썬은
배우기
쉬운

이 토큰들은 이미 이전 단계에서 계산했던 내용입니다.

새로운 토큰을 생성할 때마다 이전 토큰들의 계산을 계속 반복한다면, 생성 길이가 길어질수록 추론 속도는 점점 느려집니다.

이 문제를 해결하기 위해 등장한 것이 KV Cache입니다.


KV Cache란?

KV Cache는 이전 토큰들에 대해 계산된 Key와 Value 값을 저장해두는 방법입니다.
Transformer의 Attention에서는 Query, Key, Value라는 값이 사용됩니다.
이 중에서 이전 토큰들의 Key와 Value는 다음 토큰을 생성할 때 다시 필요합니다.
그래서 한 번 계산한 Key와 Value를 버리지 않고 메모리에 저장해둡니다.
이후 새로운 토큰이 들어오면, 이전 토큰들은 다시 계산하지 않고 저장된 Key와 Value를 재사용합니다.

흐름을 간단히 그리면 다음과 같습니다.

1. 이전 토큰들

2. Key / Value 계산

3. KV Cache에 저장

4. 다음 토큰 생성 시 재사용

KV Cache 덕분에 모델은 매번 전체 문장을 다시 계산하지 않아도 됩니다.
새로 추가된 토큰에 대한 계산만 수행하고, 이전 토큰들의 정보는 Cache에서 가져와 사용합니다.


왜 Key와 Value를 저장할까?

Self-Attention에서는 각 토큰이 다른 토큰을 참고하기 위해 Query, Key, Value를 사용합니다.

간단하게 보면 역할은 다음과 같습니다.

Query
→ 내가 무엇을 찾고 있는가?

Key
→ 각 토큰이 어떤 정보를 가지고 있는가?

Value
→ 실제로 가져올 정보

새로운 토큰을 생성할 때 모델은 지금까지 생성된 토큰들을 참고해야 합니다.
이때 이전 토큰들의 Key와 Value가 필요합니다.
하지만 이전 토큰들의 Key와 Value는 이미 계산된 값입니다.
다시 계산할 필요가 없습니다.

그래서 이 값을 저장해두고 재사용하는 것입니다.


KV Cache의 유뮤

KV Cache가 없을 때

KV Cache가 없다고 가정해보겠습니다.

모델이 다음과 같이 토큰을 생성하고 있습니다.

1단계: 파이썬은
2단계: 파이썬은 배우기
3단계: 파이썬은 배우기 쉬운
4단계: 파이썬은 배우기 쉬운 프로그래밍

새로운 토큰을 생성할 때마다 전체 입력을 다시 계산해야 합니다.

1단계 계산:
파이썬은

2단계 계산:
파이썬은 배우기

3단계 계산:
파이썬은 배우기 쉬운

4단계 계산:
파이썬은 배우기 쉬운 프로그래밍

이 방식은 생성 길이가 짧을 때는 큰 문제가 없어 보일 수 있습니다.

하지만 수백 개, 수천 개의 토큰을 생성해야 한다면 계산량이 크게 증가합니다.

KV Cache가 있을 때

KV Cache를 사용하면 이전 토큰들의 Key와 Value를 저장해둡니다.

새로운 토큰이 들어오면 새 토큰에 대해서만 필요한 계산을 수행하고, 이전 토큰들의 정보는 Cache에서 가져옵니다.

1단계:
파이썬은 계산
→ KV Cache 저장

2단계:
새 토큰 "배우기" 계산
→ 이전 KV Cache 재사용

3단계:
새 토큰 "쉬운" 계산
→ 이전 KV Cache 재사용

4단계:
새 토큰 "프로그래밍" 계산
→ 이전 KV Cache 재사용

이렇게 하면 중복 계산을 줄일 수 있습니다.

그래서 KV Cache는 LLM Inference 속도를 높이는 데 매우 중요한 역할을 합니다.


KV Cache의 장단점

KV Cache의 장점

KV Cache의 가장 큰 장점은 추론 속도를 빠르게 만든다는 점입니다.
LLM은 토큰을 하나씩 생성하기 때문에 이전 계산을 재사용할 수 있다면 큰 이득을 얻을 수 있습니다.

특히 답변이 길어질수록 KV Cache의 효과가 커집니다.

장점을 정리하면 다음과 같습니다.

  • 이전 토큰의 계산 결과를 재사용할 수 있습니다.
  • 중복 계산을 줄일 수 있습니다.
  • 긴 답변을 생성할 때 속도 향상 효과가 큽니다.
  • 실시간 챗봇 서비스에서 응답 속도를 개선할 수 있습니다.

ChatGPT와 같은 대화형 서비스에서 답변이 빠르게 이어지는 데에도 이러한 최적화가 중요한 역할을 합니다.

KV Cache의 단점

KV Cache가 항상 장점만 있는 것은 아닙니다.

이전 토큰들의 Key와 Value를 저장해야 하기 때문에 메모리를 사용합니다.
생성되는 토큰이 많아질수록 Cache에 저장해야 할 값도 늘어납니다.

특히 Context Length가 길어질수록 KV Cache의 메모리 사용량이 커집니다.

짧은 문장
→ 저장할 KV Cache가 적음

긴 문장
→ 저장할 KV Cache가 많음

그래서 긴 문서를 처리하거나 긴 대화를 이어갈 때는 KV Cache 메모리 관리가 중요해집니다.

LLM Serving에서 vLLM의 PagedAttention 같은 기술이 등장한 이유도 이 문제와 관련이 있습니다.


KV Cache와 Context Length

LLM은 한 번에 처리할 수 있는 토큰 길이가 정해져 있습니다.
이를 Context Length라고 부릅니다.
Context Length가 길어지면 모델은 더 긴 문맥을 참고할 수 있습니다.

하지만 그만큼 KV Cache에 저장해야 하는 정보도 많아집니다.

예를 들어 4K context를 사용하는 모델보다 32K context를 사용하는 모델은 더 긴 문맥을 처리할 수 있습니다.

대신 KV Cache 메모리 사용량도 더 커집니다.

그래서 긴 문맥을 지원하는 모델을 실제 서비스에서 운영하려면 단순히 모델 성능뿐만 아니라 메모리 관리도 중요합니다.


정리해보면

KV Cache는 LLM이 토큰을 하나씩 생성한다는 특성에서 나온 최적화 방법입니다.

이전 토큰들의 Key와 Value를 저장해두고, 다음 토큰을 생성할 때 재사용합니다.
덕분에 매번 전체 문장을 다시 계산하지 않아도 됩니다.

하지만 Cache를 저장하기 위한 메모리가 필요하기 때문에, 긴 문맥을 처리할수록 메모리 사용량이 증가합니다.

결국 KV Cache는 속도와 메모리 사이의 균형을 다루는 개념이라고 볼 수 있습니다.


요약

이번 글에서는 KV Cache에 대해 알아보았습니다.

핵심 내용을 정리하면 다음과 같습니다.

  • LLM은 답변을 한 번에 생성하지 않고 토큰을 하나씩 생성합니다.
  • 토큰을 생성할 때마다 이전 토큰들을 모두 다시 계산하면 비효율이 발생합니다.
  • KV Cache는 이전 토큰들의 Key와 Value를 저장해두고 재사용하는 방법입니다.
  • KV Cache를 사용하면 중복 계산을 줄여 추론 속도를 높일 수 있습니다.
  • 대신 저장해야 할 Cache가 늘어나기 때문에 메모리 사용량이 증가합니다.
  • Context Length가 길어질수록 KV Cache 메모리 관리가 중요해집니다.

다음 글에서는 LLM을 더 가볍게 실행하기 위한 방법인 Quantization에 대해 알아보겠습니다.

Quantization은 모델의 가중치를 더 낮은 비트로 표현하여 메모리 사용량과 추론 비용을 줄이는 방법입니다.

부족한 글 읽어주셔서 감사합니다.

틀린 내용이나 피드백은 댓글로 남겨주시면 감사하겠습니다.

감사합니다.

profile
저희.서이.하실래요?

0개의 댓글