[AI 서빙 3편] KV Cache의 비밀 — LLM 추론 속도를 10배 높이는 캐시 압축 및 재사용 전략
사용자가 LLM과 대화를 나눌 때, 문장이 길어질수록(Context Window가 채워질수록) 첫 토큰이 나오기까지의 시간(TTFT)과 토큰 생성 속도가 눈에 띄게 느려지는 것을 경험해 보았을 것이다. 이는 LLM이 이전의 모든 대화 맥락을 '기억'하기 위해 수행하는 Attention 연산의 복잡도가 시퀀스 길이에 비례하여 기하급수적으로 증가하기 때문이다.
이 연산 지옥을 탈출하기 위한 엔지니어링적 해답이 바로 KV(Key-Value) Cache다. 본 글에서는 KV Cache의 내부 구조를 파헤치고, 프로덕션 환경에서 추론 속도를 비약적으로 높이기 위해 사용하는 Prefix Caching과 Cache Eviction 전략의 기술적 실체를 분석한다.
1. KV Cache란 무엇인가: 중복 연산의 제거
트랜스포머(Transformer) 모델의 핵심은 현재 토큰이 이전 토큰들과 어떤 상관관계가 있는지 계산하는 Self-Attention 메커니즘이다.
- 문제: 100번째 토큰을 생성할 때, 1~99번 토큰에 대한 계산을 처음부터 다시 한다면 연산량은 매 단계마다 늘어난다.
- 해결: 1~99번 토큰의 Key와 Value 벡터는 한 번 계산되면 바뀌지 않는다. 따라서 이를 메모리에 '캐싱'해두고, 100번째 토큰의 계산에는 캐싱된 데이터를 재사용한다. 이것이 KV Cache의 본질이다.
2. Prefix Caching: 겹치는 맥락의 재사용
실제 서비스 시나리오에서 많은 사용자의 요청은 상당 부분 겹친다.
- 예: 동일한 시스템 프롬프트("너는 친절한 어시스턴트야..."), 동일한 RAG 문서 컨텍스트.
Prefix Caching은 이 겹치는 앞부분(Prefix)에 대한 KV Cache를 메모리에 영구적으로 혹은 장기적으로 보관하고, 여러 요청이 이를 공유하게 만든다. vLLM과 같은 최신 엔진은 해시 맵(Hash Map)을 통해 프롬프트의 접두사를 식별하고, 캐시 히트(Cache Hit) 시 해당 연산 과정을 통째로 건너뛴다. 이는 특히 시스템 프롬프트가 매우 긴 기업용 에이전트 서비스에서 TTFT를 초 단위에서 밀리초 단위로 단축시킨다.
3. KV Cache 압축 기술: Eviction과 Quantization
KV Cache는 GPU 메모리(VRAM)를 가장 많이 점유하는 요소다. 문맥이 길어지면 메모리가 부족해져 동시 처리량(Batch Size)이 줄어든다. 이를 방지하기 위한 두 가지 고도화 전략이 존재한다.
3-1. KV Cache Eviction (가비지 컬렉션)
모든 과거 토큰이 현재 토큰 생성에 동일하게 중요한 것은 아니다.
- 중요도 산출: Attention Score를 분석하여 현재 문맥과 관련성이 낮은 과거 토큰의 KV Cache를 메모리에서 과감히 삭제한다.
- 전략: 최근 토큰(Recency)과 중요한 팩트가 담긴 토큰(High Attention) 위주로 'Sparse'하게 캐시를 유지하여, 메모리 사용량은 줄이면서도 모델의 지능 하락은 최소화한다.
3-2. KV Cache Quantization
모델 가중치뿐만 아니라 캐시 데이터 자체를 압축한다.
- 16비트 실수(FP16)로 저장되던 캐시를 8비트(INT8) 혹은 4비트(INT4)로 양자화하여 저장한다.
- 메모리 점유율이 절반 이하로 줄어들며, 이는 곧 한 장의 GPU에 2배 이상의 사용자를 태울 수 있음을 의미한다.
4. 실전 이슈: 가용 메모리와의 줄타기
캐싱은 양날의 검이다.
- 캐시를 너무 많이 유지하면 새로운 요청을 받을 메모리가 부족해지고,
- 캐시를 너무 자주 삭제하면 연산량이 늘어나 지연 시간이 길어진다.
플랫폼 엔지니어는 LRU(Least Recently Used) 알고리즘 기반의 캐시 교체 정책을 세심하게 튜닝해야 하며, 특히 멀티 GPU 환경에서는 캐시 데이터를 GPU 간에 어떻게 복사(Migration)하고 동기화할지에 대한 통신 오버헤드까지 계산에 넣어야 한다.
결론: 캐싱은 추론 엔진의 핵심 저장소다
현대 AI 서빙에서 KV Cache는 단순히 보조적인 기능을 넘어, 전체 아키텍처의 처리량과 비용 효율을 결정짓는 가장 중요한 '데이터 저장소'로 진화했다.
연산을 데이터의 문제로 치환하여 해결하는 것. PagedAttention으로 공간을 나누고, Prefix Caching으로 시간을 아끼며, Eviction으로 효율을 찾는 일련의 과정은 컴퓨터 공학의 고전적인 최적화 원리가 AI 시대에 어떻게 변주되는지를 극명하게 보여준다.
다음 편 예고
[AI 서빙 4편] Triton Inference Server — 다이나믹 배칭(Dynamic Batching)을 통한 GPU 효율 극대화
GPU는 1개의 요청을 처리할 때보다 100개의 요청을 한꺼번에(Batch) 처리할 때 진가를 발휘한다. 하지만 실시간 서비스에서 100명이 모일 때까지 기다릴 수는 없다. 사용자별로 들어오는 제각각의 요청을 찰나의 순간에 하나로 묶어 GPU 연산 유닛(CUDA Core)을 100% 가동시키는 Dynamic Batching의 내부 스케줄링 메커니즘을 상세히 해부한다.
KVCache, LLM최적화, PrefixCaching, CacheEviction, 추론속도개선, AI인프라, 트랜스포머, 메모리양자화