주제: IO-3 Speculative Decoding (Draft / Verify 가속 구조)
문제 설정
LLM 추론에서 가장 큰 병목은 autoregressive decoding입니다.
언어 모델 목표:
즉 토큰을 하나씩 순차적으로 생성해야 합니다.
x1 → x2 → x3 → x4 → x5
이 때문에 GPU 병렬화가 제한됩니다.
이를 해결하기 위해 제안된 방법이 Speculative Decoding입니다.
직관 비유
- 작은 모델 -> 빠르게 초안 작성
- 큰 모델 -> 초안 검증
즉 draft model + verify model 구조입니다.
1. 기본 아이디어
두 개의 모델을 사용합니다.
- Draft model (작고 빠른 모델)
- Target model (원래 LLM)
draft 모델이 여러 토큰을 한 번에 생성합니다.
draft: x1 x2 x3 x4
target 모델이 이를 검증합니다.
2. Draft 단계
작은 모델이 k개의 토큰을 생성합니다.
기호 의미
- P_draft : draft model 분포
- y_i : draft 토큰
- k : speculative length
왜 필요한가
빠른 모델로 후보 토큰을 미리 생성합니다.
주의점
draft 모델은 target 모델보다 작습니다.
3. Verify 단계
target 모델이 draft 토큰을 검증합니다.
확률:
accept 조건:
직관 설명
draft 모델이 맞게 예측했다면 그대로 사용합니다.
주의점
불일치 시 target 모델 출력으로 교체합니다.
4. Acceptance 과정
검증 과정:
draft: x3 x4 x5 x6
target: x3 x4 x7 ...
결과:
- x3 -> accept
- x4 -> accept
- x5 -> reject
reject 시 target 모델 토큰 사용
수식
기호 의미
- α : acceptance probability
왜 필요한가
확률적으로 동일한 분포를 유지합니다.
5. 속도 향상
Speculative decoding은 여러 토큰을 한 번에 검증합니다.
속도 향상:
기호 의미
- k : draft length
- acceptance_rate : 토큰 수용 비율
주의점
acceptance rate가 낮으면 효과가 감소합니다.
6. 정확도 유지
Speculative decoding의 중요한 특징:
출력 분포가 원래 모델과 동일합니다.
즉:
왜 중요한가
가속화하면서도 모델 정확도를 유지합니다.
7. 실제 시스템 적용
| 구성 | 역할 |
|---|---|
| Draft model | 빠른 후보 생성 |
| Target model | 검증 |
| KV Cache | attention 재사용 |
8. Tradeoff
| 요소 | 영향 |
|---|---|
| draft model 크기 | acceptance rate 증가 |
| draft length k | 속도 증가 가능 |
| verify cost | 추론 비용 증가 |
코드-수식 연결
| 개념 | 코드 | 설명 |
|---|---|---|
| draft model | small_model.generate() |
초안 토큰 생성 |
| verify | large_model.forward() |
확률 검증 |
| sampling | torch.multinomial() |
토큰 선택 |
자주 하는 오해 5개
- Speculative decoding은 정확도를 낮춘다고 생각한다
- draft 모델은 아무 모델이나 사용할 수 있다고 생각한다
- 항상 속도가 k배 증가한다고 생각한다
- verification이 필요 없다고 생각한다
- speculative decoding은 training 방법이라고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- Speculative decoding이 해결하려는 문제는 무엇인가?
- draft model과 target model의 역할은 무엇인가?
- acceptance probability는 왜 필요한가?
- 속도 향상은 어떤 요인에 의해 결정되는가?
- 왜 speculative decoding은 정확도를 유지하는가?