KV Cache, Prefill chunk
Speculative decoding과 비슷한 “가속을 위한 아이디어”라는 점!
1. KV Cache란?
Transformer/LLM에서 과거 token들의 Key/Value를 저장해 두는 cache
\(\rightarrow\) 한 번 계산해 두면 다음 token 생성 때 다시 계산할 필요 없음
→ 이것 때문에 LLM의 decoding 속도가 빨라짐
2. KV Cache Prefill
Prefill = Prompt 전체에 대한 KV Cache를 한 번에 (or 큰 덩어리로) 계산해 저장해두는 단계
한 줄 요약: LLM 실행의 초기 비용을 한 번에 치르는 단계
Ex) Prompt가 4000 token이라면…
- Prefill = 4000 token 전부를 먼저 처리해서 KV cache에 넣는 과정
- 이후 생성 단계는 1token씩 처리하면서 cache만 lookup하면 됨
3. Prefill chunk란?
필요성
- 대형 모델에서는 Prompt가 너무 긴 경우 전체 prefill을 한 번에 처리하면 너무 느리거나 GPU 메모리가 부족해짐.
해결책
- Prompt를 여러 chunk(조각)로 나누어
- 각 chunk마다 KV Cache를 부분적으로 채워 넣는 방식
예시
-
Prompt = 10,000 token
-
chunk size = 2,000 token
Chunk 1 (0~1999 token) → KV Cache 저장
Chunk 2 (2000~3999 token) → KV Cache 추가 저장
Chunk 3 (4000~5999 token)
Chunk 4 (6000~7999 token)
Chunk 5 (8000~9999 token)
이렇게 하면:
- GPU RAM 최적화
- Latency도 더 일정하게
- Streaming 입력 (실시간 입력)도 쉽게 처리됨
4. Prefill chunk의 중요성
-
긴 문서 prompt가 많아짐
- 100k–1M token context 모델 시대
-
전체 prefill을 한 번에 하면 메모리 터짐
-
chunk 단위 prefill은
-
메모리 안전
-
GPU 활용도 증가
-
대기 시간 감소
-
파이프라이닝이 가능
이런 이점이 있음.
-
5. 실제 예시 (초간단 흐름)
for chunk in split(prompt, chunk_size):
hidden, kv = model.forward(chunk, kv_cache)
kv_cache.append(kv)
이렇게 chunk 단위로 prefill → KV Cache 누적 과정을 수행
마지막 chunk까지 끝나면 LLM은 이제 full prompt에 대한 KV Cache를 보유!
그 다음부터는:
decode next token → KV 추가
decode next token → KV 추가
6. System Prompt & User Prompt
System Prompt와 Prefill Chunk의 실제 연관성?
-
LLM 실행에서 system prompt와 user prompt는 역할이 다르기 때문에, KV Cache prefill chunk의 필요성도 두 가지 관점!
-
(1) System Prompt는 길이가 고정되어 있으므로, 미리 KV Cache를 만들어둘 수 있음
-
System prompt는 모델 서비스 배포 시 이미 확정된 텍스트
-
길이를 정확히 알고 있으므로,
- 미리 KV Cache를 prefill → 저장해 놓을 수 있고
- Serving 시에는 즉시 decode 단계로 진입 가능
-
즉, system prompt는 static prompt → prefill 완전 가능
→ 이것만으로도 초기 응답 속도(latency)가 크게 단축됨
-
-
(2) User Prompt는 길이를 예측할 수 없으므로, 전체 prefill을 미리 할 수 없음
- User prompt의 길이는 요청마다 달라짐
- 10 token일 수도
- 10,000 token일 수도
-
그래서 “전체 user prompt에 대해 prefill을 한 번에 계산”하는 방식은
- GPU 메모리 예측 불가능
- 최악의 경우 OOM 발생!!
→ 이 문제를 해결하는 것이 prefill chunk
- User prompt의 길이는 요청마다 달라짐
User prompt를 chunk 단위로 쪼개어
- GPU 메모리 사용을 일정하게 유지
- 긴 입력도 안전하게 처리
- 스트리밍 입력도 지원
6. Summary
-
Prefill = KV Cache 미리 채워두기
-
Prefill chunk = Chunk 단위로 계산해서 계산량 상한 걸어두기
-
System prompt:
고정 길이 → KV Cache를 사전에 prefill하여 저장 가능 → latency 감소
-
User prompt:
길이 예측 불가 → 전체 prefill 불가능 → prefill chunk로 GPU memory를 안전하게 유지