KV 캐시
본 서비스가 제공하는 내용 및 자료가 사실임을 보증하지 않습니다. 시스템은 언제나 실수를 할 수 있습니다. 중요한 의사결정 및 법리적 해석, 금전적 의사결정에 사용하지 마십시오.
KV 캐시(Key-Value Cache)는 트랜스포머(Transformer) 아키텍처를 사용하는 대규모 언어 모델(LLM)의 추론 과정에서 연산 효율을 극대화하기 위해 도입된 기술이다. 텍스트 생성 시 각 단계에서 계산되는 어텐션(Attention) 메커니즘의 Key와 Value 행렬을 메모리에 저장해 두었다가, 다음 토큰 생성 시 이를 재계산하지 않고 즉시 활용한다. 이를 통해 중복 연산을 제거하여 생성 속도를 수 배 이상 향상시키지만, 컨텍스트 길이에 비례하여 메모리 점유율이 급격히 증가하는 특성이 있다.
개요
KV 캐시는 대규모 언어 모델(LLM)이 텍스트를 생성할 때 발생하는 중복 연산을 줄이기 위한 핵심적인 최적화 기법이다. 트랜스포머 모델은 이전의 모든 토큰 정보를 참조하여 다음 토큰을 예측하는 자기회귀(Autoregressive) 방식을 사용한다. 이 과정에서 매번 동일한 이전 토큰들에 대해 어텐션 연산을 반복하는 비효율이 발생하는데, KV 캐시는 이러한 중간 계산 결과인 Key와 Value 텐서를 저장함으로써 추론 복잡도를 낮춘다. 실제 운영 환경에서 이 기술은 처리량을 약 2배에서 최대 24배까지 향상시키는 것으로 알려져 있다.
동작 원리
LLM의 추론 과정은 크게 두 단계로 나뉘며, KV 캐시는 각 단계에서 다르게 작용한다.
- 프리필(Prefill) 단계: 입력된 프롬프트 전체를 한꺼번에 처리하여 첫 번째 출력 토큰을 생성한다. 이때 입력 토큰들에 대한 모든 Key와 Value 행렬을 계산하여 캐시에 저장한다.
- 디코드(Decode) 단계: 이후 토큰을 하나씩 순차적으로 생성한다. 번째 토큰을 생성할 때 부터 까지의 토큰 정보가 필요하지만, 이미 캐시에 저장된 값을 불러와 사용하므로 현재 토큰에 대한 Key와 Value만 새로 계산하면 된다.
이러한 구조 덕분에 모델은 매 단계마다 전체 문맥을 다시 계산할 필요 없이 새로운 정보만 업데이트하며 빠르게 텍스트를 생성할 수 있다.
수학적 배경
트랜스포머의 스케일드 닷-프로덕트 어텐션(Scaled Dot-Product Attention)은 다음과 같이 계산된다.
여기서 는 쿼리(Query), 는 키(Key), 는 값(Value)을 의미한다. 새로운 토큰을 생성할 때마다 는 현재 토큰의 정보만을 담고 있지만, 와 는 이전의 모든 토큰 정보를 포함해야 한다. KV 캐시를 사용하면 이전 단계에서 계산된 와 를 메모리에서 즉시 불러올 수 있어 행렬 곱 연산량을 획기적으로 줄일 수 있다.
메모리 사용량과 병목 현상
KV 캐시는 추론 속도를 높이는 대신 상당한 양의 GPU 메모리를 소모한다. 메모리 요구량은 모델의 크기, 배치 크기(Batch Size), 그리고 컨텍스트 길이에 비례하여 선형적으로 증가한다.
- 메모리 점유: 70B 매개변수 모델이 128K 컨텍스트를 처리할 경우, 캐시 데이터만으로도 약 40GB 이상의 메모리가 필요할 수 있다. 이는 때로 모델 가중치 자체보다 더 많은 공간을 차지한다.
- 메모리 단편화: 기존의 연속적 메모리 할당 방식은 실제 사용량보다 더 많은 공간을 예약하게 되어 메모리의 상당 부분이 낭비되는 단편화 문제를 야기한다.
- 성능 저하: 컨텍스트가 길어질수록 캐시가 차지하는 비중이 커지며, 이는 고성능 GPU에서도 메모리 부족(OOM)이나 처리 속도 저하의 원인이 된다.
최적화 기법
KV 캐시의 효율을 높이기 위해 다음과 같은 기술적 시도가 이루어지고 있다.
| 기법 | 설명 |
|---|---|
| PagedAttention | 가상 메모리 관리 기법을 응용하여 KV 캐시를 고정 크기 블록으로 나누어 관리한다. 메모리 낭비를 4% 미만으로 줄인다. |
| KVzip | 중요도가 낮은 KV 쌍을 식별하여 제거하거나 압축함으로써 메모리 사용량을 줄인다. |
| 양자화(Quantization) | KV 텐서의 정밀도를 FP16에서 INT8 또는 INT4로 낮추어 메모리 점유 공간을 절반 이하로 줄인다. |
| 공유 메모리 | 동일한 프롬프트를 사용하는 여러 요청 간에 캐시된 데이터를 공유하여 중복 저장을 방지한다. |
장점과 한계
KV 캐시의 가장 큰 장점은 실시간 서비스에서 사용자에게 응답을 전달하는 지연 시간(Latency)을 획기적으로 줄이고 운영 비용을 절감한다는 점이다. 특히 첫 토큰 이후의 생성 속도를 2~5배가량 향상시킨다.
그러나 구현 복잡도가 높고, 훈련(Training) 단계에서는 사용할 수 없다는 제약이 있다. 또한 긴 문맥을 처리할 때 발생하는 메모리 압박은 여전히 해결해야 할 과제로 남아 있으며, 이를 극복하기 위해 학계와 산업계에서는 효율적인 압축 알고리즘 연구를 지속하고 있다.