Prefill과 Decoding은 언어 모델이 텍스트를 생성하는 과정의 두 단계입니다.
Prefill (Prompt Processing)
입력 프롬프트를 한 번에 처리하는 단계입니다.
특징:
- 병렬 처리 가능: 입력 토큰들을 동시에 처리할 수 있습니다
- 컴퓨트 집약적(Compute-bound): GPU의 연산 능력을 최대한 활용
- KV 캐시 생성: 입력 토큰들의 Key-Value 쌍을 계산하고 캐시에 저장
- 빠른 처리: 병렬화 덕분에 상대적으로 빠릅니다
예시:
입력: "AI의 미래에 대해 설명해줘"
→ 모든 토큰을 한 번에 처리하여 KV 캐시 구축
Decoding/Generation
응답을 한 토큰씩 순차적으로 생성하는 단계입니다.
특징:
- 순차 처리: Autoregressive 방식으로 한 번에 하나씩 생성
- 메모리 집약적(Memory-bound): KV 캐시를 읽고 쓰는 작업이 병목
- 반복적: 각 토큰마다 모델 전체를 실행
- 느린 처리: 순차적이라 병렬화가 제한적
예시:
생성: "AI" → "의" → "미래" → "는" → ...
각 토큰을 생성할 때마다 이전 토큰들을 참조
비교표
| 구분 | Prefill | Decoding |
|---|
| 처리 방식 | 병렬 (parallel) | 순차 (sequential) |
| 병목 | Compute-bound | Memory-bound |
| 속도 | 빠름 | 상대적으로 느림 |
| 배치 효율 | 높음 | 낮음 |
| GPU 활용 | 높은 활용률 | 낮은 활용률 |
최적화 전략
Prefill 최적화:
Decoding 최적화:
- KV 캐시 압축 (quantization)
- Speculative decoding (추측 디코딩)
- Continuous batching (연속 배칭)
실제 체감
사용자 관점에서:
- Prefill: 긴 문서를 업로드하면 처음 응답이 시작되기까지의 대기 시간
- Decoding: 텍스트가 한 글자씩 나타나는 속도
서비스 설계 시 두 단계의 특성을 고려하여 최적화하는 것이 중요합니다!