KV 캐시(KV Cache)

•
2026년 11월 08일 발행•2026년 11월 08일 수정
요약

트랜스포머의 자기회귀 디코딩에서 이전 토큰의 키·값 벡터를 저장해 재사용함으로써 생성 속도를 높이는 기법

고급
트랜스포머의 어텐션 연산과 자기회귀 생성 과정, GPU 메모리 계층에 대한 이해가 필요하다.

#개념

KV 캐시(KV Cache)는 트랜스포머 기반 언어 모델이 자기회귀 방식으로 토큰을 생성할 때, 이전 토큰에 대해 계산한 키(Key)와 값(Value) 벡터를 메모리에 저장해 두고 다음 단계에서 재사용하는 기법이다. 매 단계마다 전체 문맥을 다시 계산하지 않아도 되므로 생성 속도가 크게 빨라지며, 오늘날 거의 모든 대규모 언어 모델(Large Language Model, LLM) 추론 엔진이 기본으로 사용한다.
트랜스포머(Transformer)의 디코더는 새 토큰을 하나 만들 때마다 지금까지의 모든 토큰을 대상으로 어텐션 메커니즘(Attention Mechanism)을 수행한다. 어텐션은 $\mathrm{softmax}(QK^\top / \sqrt{d_k})V$로 계산되는데, 인과적 마스크 때문에 과거 토큰의 키와 값은 이후 토큰이 추가되어도 바뀌지 않는다. 따라서 한 번 계산한 키·값을 저장해 두면 다음 단계에서는 새 토큰의 쿼리·키·값만 계산하면 된다.
KV 캐시가 없으면 길이 $n$의 시퀀스를 생성하는 동안 매 단계 앞선 모든 토큰의 투영을 다시 계산해야 하므로 중복 연산이 길이의 제곱에 비례해 늘어난다. KV 캐시를 쓰면 각 단계의 투영 연산은 새 토큰 하나 분량으로 줄어들고, 어텐션 점수 계산만 문맥 길이에 비례해 증가한다. 즉 연산을 메모리로 바꾸는 전형적인 시간-공간 절충이다.
KV 캐시를 사용하는 LLM 추론은 성격이 다른 두 단계로 나뉜다. 두 단계는 병목 자원이 다르기 때문에 서빙 시스템은 이를 구분해 스케줄링하고 지표도 따로 측정한다.
추론의 두 단계
  • 프리필(Prefill): 입력 프롬프트 전체를 한 번에 병렬로 처리해 모든 층의 키·값을 캐시에 채우고 첫 토큰을 만든다. 큰 행렬 곱이 중심이어서 주로 연산량에 묶이는(compute-bound) 단계다.
  • 디코드(Decode): 캐시를 읽어 토큰을 하나씩 생성하고, 새 토큰의 키·값을 캐시에 덧붙인다. 토큰당 연산은 작지만 가중치와 캐시를 매번 읽어야 하므로 메모리 대역폭에 묶이는(memory-bound) 단계다.
두 단계에 대응하는 대표적인 지연 시간(Latency) 지표는 첫 토큰까지의 시간인 TTFT(Time to First Token)와 출력 토큰당 시간인 TPOT(Time per Output Token)이다. TTFT는 프롬프트 길이와 프리필 성능에, TPOT은 디코드 단계의 메모리 대역폭과 배치 구성에 크게 좌우된다. 대화형 서비스에서는 TTFT가 체감 응답성을, TPOT이 글이 흘러나오는 속도를 결정한다.
KV 캐시의 크기는 모델 구조와 요청 조건으로 정확히 계산할 수 있다. 층 수를 $L$, 키·값 헤드 수를 $H_{kv}$, 헤드 차원을 $d_h$, 시퀀스 길이를 $S$, 배치 크기를 $B$, 원소당 바이트 수를 $b$라 하면 전체 크기는 $2 \times L \times H_{kv} \times d_h \times S \times B \times b$이다. 앞의 2는 키와 값을 각각 저장하기 때문에 붙는 계수다.
예를 들어 32개 층, 32개 헤드, 헤드 차원 128인 70억 파라미터급 모델을 16비트로 운영하면 토큰 하나당 $2 \times 32 \times 32 \times 128 \times 2$ 바이트, 약 0.5MB가 필요하다. 4,096 토큰 문맥이면 시퀀스 하나에 약 2GB이고, 동시에 32개 요청을 처리하면 64GB가 되어 모델 가중치 자체보다 커진다. 이처럼 롱 컨텍스트와 대규모 배치에서는 KV 캐시가 GPU 메모리의 주된 소비원이 된다.
메모리 병목은 처리량과 직결된다. 캐시가 GPU 메모리를 채우면 더 이상 요청을 배치에 넣을 수 없어 동시 처리 수가 제한되고, 디코드 단계에서는 매 토큰마다 캐시 전체를 읽어야 하므로 캐시가 클수록 토큰당 시간도 늘어난다. 그래서 KV 캐시 최적화는 모델 구조, 메모리 관리, 수치 정밀도, 캐시 정책 등 여러 층위에서 연구되어 왔다.
모델 구조 측면의 대표적인 방법은 키·값 헤드 수 $H_{kv}$를 줄이는 것이다. 쿼리 헤드는 그대로 두고 키·값만 공유하면 품질 손실을 작게 유지하면서 캐시를 크게 줄일 수 있다.
어텐션 헤드 구성에 따른 비교
  • 멀티 헤드 어텐션(Multi-Head Attention, MHA): 쿼리 헤드마다 별도의 키·값 헤드를 둔다. 표현력이 가장 높지만 캐시 크기도 가장 크다.
  • 멀티 쿼리 어텐션(Multi-Query Attention, MQA): Shazeer(2019)가 제안한 방식으로, 모든 쿼리 헤드가 하나의 키·값 헤드를 공유한다. 캐시가 헤드 수만큼 줄어 디코딩이 빨라지지만 품질 저하와 학습 불안정이 보고되었다.
  • 그룹 쿼리 어텐션(Grouped-Query Attention, GQA): Ainslie 등(2023)이 제안한 절충안으로, 쿼리 헤드를 여러 그룹으로 나누고 그룹마다 키·값 헤드를 하나씩 둔다. 기존 MHA 체크포인트를 원래 사전 학습 연산의 일부만으로 업트레이닝해 변환할 수 있으며, 최근 공개 LLM에서 널리 채택되었다.
메모리 관리 측면에서는 Kwon 등(2023)이 제안한 페이지드 어텐션(PagedAttention)이 대표적이다. 기존 시스템은 요청마다 최대 길이만큼 연속된 메모리를 미리 잡아 두어 내부·외부 단편화로 많은 메모리를 낭비했다. PagedAttention은 운영체제의 가상 메모리 페이징처럼 캐시를 고정 크기 블록으로 나누고 블록 테이블로 논리 위치와 물리 위치를 매핑해 낭비를 거의 없앴다.
PagedAttention을 구현한 서빙 엔진 vLLM은 블록 단위 관리 덕분에 같은 메모리로 더 많은 요청을 배치할 수 있고, 병렬 샘플링이나 빔 서치에서 공통 프리픽스 블록을 복사하지 않고 공유할 수 있다. 논문은 당시의 대표적인 서빙 시스템 대비 같은 지연 수준에서 처리량을 2~4배 높였다고 보고했다. 이 방식은 이후 여러 추론 엔진의 표준적인 캐시 관리 방식으로 자리 잡았다.
캐시의 정밀도와 보존 범위를 조정하는 방법도 널리 쓰인다. 이들 기법은 메모리를 줄이는 대신 정확도나 재사용 조건에 영향을 줄 수 있어 적용 전 품질 검증이 필요하다.
KV 캐시 압축·재사용 기법
  • KV 캐시 양자화: 키·값을 16비트 대신 8비트나 4비트 정수 등으로 저장해 메모리와 대역폭을 줄인다. 키와 값의 분포 특성이 달라 채널별·토큰별 스케일을 다르게 두는 방식이 연구되었다.
  • 슬라이딩 윈도우: 최근 일정 개수의 토큰만 어텐션 대상으로 삼아 캐시 크기를 상한으로 묶는다. 윈도우 밖의 정보는 층을 거치며 간접적으로만 전달된다.
  • 토큰 축출(Eviction): 어텐션 점수가 낮은 토큰 등 중요도가 낮은 항목을 캐시에서 제거해 예산 안에 맞춘다. 긴 생성에서 메모리를 고정할 수 있지만 필요한 정보를 잃을 위험이 있다.
  • 프리픽스 캐싱(Prefix Caching): 시스템 프롬프트나 공통 문서처럼 여러 요청이 공유하는 앞부분의 캐시를 요청 간에 재사용한다. 해당 구간의 프리필을 건너뛰므로 TTFT와 비용이 함께 줄어든다.
프리픽스 캐싱은 캐싱(Caching)의 일반 원리를 추론에 적용한 것으로, 캐시 적중을 높이려면 프롬프트의 고정된 부분을 앞에 두고 변하는 부분을 뒤에 두는 설계가 중요하다. 토큰 하나라도 앞부분이 달라지면 그 뒤의 키·값은 모두 달라지므로 재사용할 수 없다. 여러 상용 LLM API도 이 원리를 이용해 반복되는 프롬프트 앞부분에 대해 비용을 할인하는 기능을 제공한다.
KV 캐시는 롱 컨텍스트 경쟁과 밀접하게 연결되어 있다. 문맥 창이 수십만 토큰으로 늘어나면 캐시 크기가 길이에 정비례해 커지므로, 긴 문맥을 지원하는 모델일수록 GQA, 캐시 양자화, 저랭크 잠재 벡터로 키·값을 압축하는 방식 등 캐시 절감 구조를 함께 채택하는 경향이 있다. 캐시를 CPU 메모리나 SSD로 내려보내는 오프로딩도 긴 문맥 처리에 활용된다.
서빙 시스템에서 KV 캐시는 스케줄링의 핵심 자원이기도 하다. 연속 배칭(continuous batching)은 생성이 끝난 요청을 즉시 빼고 새 요청을 넣어 GPU 활용도를 높이는데, 이때 남은 캐시 공간이 새 요청의 수용 여부를 결정한다. 프리필과 디코드를 서로 다른 GPU에 나누어 처리하는 분리형 서빙에서는 프리필에서 만든 캐시를 디코드 노드로 전송하는 비용도 고려해야 한다.
실무에서 KV 캐시를 다룰 때 고려할 사항은 다음과 같다.
실무 고려 사항
  • 용량 계획: 위 계산식으로 최대 문맥 길이와 동시 요청 수에 필요한 캐시 크기를 먼저 추정하고, 가중치와 활성값을 뺀 남은 메모리와 비교한다.
  • 지표 분리: TTFT와 TPOT을 따로 측정해 병목이 프리필인지 디코드인지 구분한다. 처리량만 보면 지연 악화를 놓치기 쉽다.
  • 정확도 검증: 캐시 양자화나 축출을 적용할 때는 긴 문맥 검색, 다단계 추론 등 캐시 손실에 민감한 과제로 품질을 확인한다.
KV 캐시는 단순한 구현 최적화처럼 보이지만, LLM 추론의 비용 구조와 지연 특성을 결정하는 핵심 요소다. 모델 아키텍처 선택, 서빙 엔진 설정, 프롬프트 설계가 모두 캐시 크기와 재사용률에 영향을 주므로, 모델 서빙(Model Serving)을 설계하는 엔지니어와 모델을 설계하는 연구자 모두 그 동작 원리를 이해해야 한다.

#관련 용어

어텐션 메커니즘
쿼리와 키의 유사도로 값 벡터를 가중 합산해 문맥 정보를 반영하는 연산
프리필
입력 프롬프트 전체를 병렬로 처리해 KV 캐시를 채우고 첫 토큰을 만드는 추론 단계
그룹 쿼리 어텐션(GQA)
쿼리 헤드 그룹마다 키·값 헤드를 공유해 KV 캐시 크기를 줄이는 어텐션 구조
페이지드 어텐션
KV 캐시를 고정 크기 블록으로 나누어 관리해 메모리 단편화를 줄이는 기법
양자화
가중치나 캐시 값을 낮은 비트 수로 표현해 메모리와 연산량을 줄이는 기법
첫 토큰까지의 시간(TTFT)
요청 시점부터 첫 출력 토큰이 생성될 때까지 걸리는 지연 시간

#직무 연관도

DA
Data Analyst
낮음
LLM API 비용 구조와 프롬프트 캐싱 할인 효과를 이해하는 데 필요한 배경 지식
DS
Data Scientist
높음
GQA, 캐시 압축 등 메모리 효율적인 어텐션 구조를 설계하고 품질 영향을 평가
DE
Data Engineer
밀접
LLM 서빙 엔진의 메모리 용량 계획, 배칭, 프리픽스 캐싱 설정으로 처리량과 지연을 최적화

#사용 사례

인터넷 서비스전자상거래금융통신미디어
개요
KV 캐시는 LLM을 서비스하는 모든 산업에서 추론 비용과 응답 속도를 결정하는 핵심 요소다. 챗봇, 검색 요약, 문서 분석처럼 긴 문맥과 높은 동시성을 요구하는 서비스에서 캐시 메모리 관리와 재사용 전략이 처리량을 좌우한다.
사례
고객 상담 챗봇에서 모든 요청이 공유하는 긴 시스템 프롬프트를 프리픽스 캐싱으로 재사용하고, PagedAttention 기반 서빙 엔진으로 동시 처리 요청 수를 늘려 응답 지연과 GPU 비용을 함께 절감

#참고 자료

#추천 포스트

© 2024 diki All rights reserved.