KV 캐싱으로 LLM 추론 최적화
Source: Dev.to
소개
대형 언어 모델(LLM)은 ChatGPT와 같은 도구에 동력을 제공하지만, 추론 속도가 느릴 수 있습니다. 추론을 가속화하는 핵심 기술은 KV(키‑값) 캐싱입니다.
KV 캐싱 작동 원리
LLM이 텍스트를 생성할 때는 토큰을 하나씩 예측합니다. 새로운 토큰이 생성될 때마다 기존에 생성된 모든 토큰을 다시 살펴보게 되는데, 시퀀스가 길어질수록 비용이 급격히 증가합니다.
KV 캐싱은 각 토큰에 대한 **키(Keys, K)**와 **값(Values, V)**을 빠른 접근이 가능한 캐시에 저장함으로써 이러한 “재읽기”를 방지합니다:
- 키는 토큰 간의 관계를 포착합니다.
- 값은 각 토큰의 실제 정보를 담고 있습니다.
생성 과정에서 모델은 처음부터 다시 계산하는 대신 캐시된 K‑V 쌍에만 어텐션하면 됩니다. 자세한 수학적 설명은 KV 캐시 설명 가이드에서 확인할 수 있습니다.
장점
- 중복 계산을 줄입니다.
- 전력 소비를 낮춥니다.
- 양자화와 결합하면 더 긴 컨텍스트 윈도우를 사용할 수 있습니다.
주요 라이브러리에서 KV 캐싱 사용하기
| Library | How to Enable Caching | Notes |
|---|---|---|
| Hugging Face Transformers | generate() 호출 시 use_cache=True 로 설정합니다. | 대부분의 모델에서 바로 사용할 수 있습니다. |
| vLLM | 별도의 플래그가 필요 없습니다; vLLM은 KV 캐시를 효율적으로 관리하는 PagedAttention을 구현합니다. | 고처리량 프로덕션 워크로드에 이상적입니다. |
메모리 관리 전략
양자화
- K‑V 쌍을 낮은 정밀도의 데이터 타입(예:
int8또는float16)으로 저장합니다. - VRAM 사용량을 줄여 메모리 부족 없이 더 긴 대화를 가능하게 합니다.
그룹화 쿼리 어텐션 (GQA)
- Llama 3와 같은 최신 모델은 GQA를 사용하며, 여러 어텐션 헤드가 동일한 query/key/value 프로젝션을 공유합니다.
- 모델 품질을 손상시키지 않으면서 KV 캐시 크기를 줄입니다.
- 구글 연구에서는 GQA가 추론 가속에 효과적인 방법이라고 강조합니다.
추론 단계
- Prefill 단계 – 모델이 초기 프롬프트를 처리하고 KV 캐시를 채웁니다.
- Decoding 단계 – 토큰이 하나씩 생성되며, 최신 토큰의 K‑V 쌍만 계산되어 캐시에 추가됩니다.
Hugging Face의 데이터에 따르면, 디코딩 단계가 효율적인 캐시의 혜택을 가장 많이 받으며, 그렇지 않으면 생성된 토큰마다 지연 시간이 증가합니다.
실용적인 팁
- 생성 코드에서 캐싱을 활성화합니다(
use_cache=True또는 동등한 옵션). - 캐시 오버플로우를 방지하기 위해 VRAM 사용량을 모니터링