한줄 요약: 작은 모델이 여러 토큰을 "추측"하고 큰 모델이 한 번에 검증하는 방식으로, 출력 분포를 정확히 보존하면서 추론 속도를 2-3배 향상시켰다.
| 항목 | 내용 |
|---|---|
| 저자 | Yaniv Leviathan, Matan Kalman, Yossi Matias |
| 소속 | Google Research |
| 발표 | ICML 2023 |
| 링크 | arxiv.org/abs/2211.17192 |
| 키워드 | Speculative Decoding, Inference Acceleration, Lossless, Draft-Verify |
LLM 추론(autoregressive decoding)의 근본적 병목:
LLM 추론 = 토큰을 하나씩 순차 생성
토큰 1 → 토큰 2 → 토큰 3 → ... → 토큰 n
각 토큰 생성 시:
GPU가 전체 모델 가중치를 메모리에서 읽음
하지만 실제 연산은 1개 토큰에 대해서만 수행
→ GPU 활용률 극히 낮음 (memory-bound)
핵심 비효율:
1개 토큰 처리하든 8개 토큰 처리하든 메모리 읽기 비용은 거의 동일
→ 1개씩 처리하면 메모리 대역폭 낭비
→ 여러 토큰을 한 번에 처리하면 효율적
문제: autoregressive 구조상 이전 토큰을 알아야 다음 토큰 생성 가능
→ 병렬 생성이 불가능한 것 아닌가?
핵심 통찰:
"검증은 생성보다 쉽다"
큰 모델(Mp)로 1개 토큰을 생성하는 비용 ≈ K개 토큰을 검증하는 비용
→ 작은 모델(Mq)이 K개를 추측 → 큰 모델이 한 번에 검증 → 맞으면 채택
비유:
시니어 개발자(Mp)가 코드를 한 줄씩 직접 쓰는 대신,
주니어 개발자(Mq)가 5줄을 먼저 쓰면 시니어가 한 번에 코드 리뷰
→ 대부분 맞으면 5배 빠르게 진행
Draft 모델 Mq (작은 모델, 예: 7B)
Target 모델 Mp (큰 모델, 예: 70B)
추측 길이 K (예: 5)
Step 1 — Draft (추측):
Mq로 K개 토큰을 순차 생성: [t₁, t₂, t₃, t₄, t₅]
→ 작은 모델이므로 빠름
Step 2 — Verify (검증):
Mp에게 원래 컨텍스트 + [t₁, t₂, t₃, t₄, t₅]를 한 번에 입력
→ Mp가 각 위치에서의 확률분포 p(·) 계산 (1회 forward pass)
Step 3 — Accept/Reject:
각 토큰을 왼쪽부터 순서대로 검증:
t₁: p(t₁)/q(t₁) ≥ 1 → 항상 채택 (또는 확률적 채택)
t₂: p(t₂)/q(t₂) ≥ 1 → 채택
t₃: p(t₃)/q(t₃) < 1 → 확률 p(t₃)/q(t₃)로 채택, 아니면 거부
t₃ 거부 시 → 수정된 분포에서 새 t₃' 샘플링 → t₄, t₅ 폐기
결과:
최소 1개(검증 실패 시) ~ 최대 K+1개(전부 통과 + 보너스 1개) 토큰 확정
거부 샘플링(Rejection Sampling) 기법:
채택 확률: min(1, p(x)/q(x))
거부 시 재샘플링 분포:
p'(x) = max(0, p(x) - q(x)) / Σ max(0, p(x) - q(x))
정리: 이 과정의 최종 출력 분포 = p(·) (target 모델의 분포)
→ Speculative Decoding은 정확한(exact) 가속!
→ 출력 품질 손실이 수학적으로 0
→ 근사가 아님 — 이것이 양자화·프루닝과의 핵심 차이
속도 향상 = f(채택률 α, 추측 길이 K, Draft/Target 비용비)
채택률 α: Mq와 Mp의 분포 유사도에 비례
→ Draft 모델이 Target과 비슷할수록 높은 채택률
기대 토큰 수 per iteration:
E[accepted] = (1 - α^(K+1)) / (1 - α)
예: α = 0.8, K = 5 → 기대값 ≈ 3.4 토큰/반복
→ 1개씩 생성 대비 ~3.4배 효율 (비용비 고려 전)
| Draft 모델 | 추측 길이 K | 채택률 α | 속도 향상 |
|---|---|---|---|
| T5-small (60M) | 3 | 0.65 | 1.8x |
| T5-base (220M) | 5 | 0.72 | 2.1x |
| T5-large (770M) | 5 | 0.81 | 2.5x |
→ Draft 모델이 클수록 채택률 증가 → 속도 향상, 단 Draft 자체 비용도 증가
| 태스크 | 속도 향상 | 이유 |
|---|---|---|
| 번역 (WMT) | 2.5x | 출력이 예측 가능 (원문과 구조 유사) |
| 요약 (CNN/DM) | 2.3x | 입력 텍스트에서 복사되는 토큰 많음 |
| 대화 (일반) | 1.9x | 창의적 응답은 불확실성 높음 → 채택률 하락 |
| 코드 생성 | 2.0x | 구조화된 문법 → 중간 수준 예측 가능성 |
→ 예측 가능한 토큰이 많은 태스크에서 효과 극대화
Speculative Decoding vs 표준 Decoding의 출력 비교:
- 토큰별 확률분포: KL-divergence = 0 (이론적 보장)
- 실제 샘플 1000개: 분포 일치 검정 통과 (p > 0.99)
→ 진정한 무손실(lossless) 가속
K가 너무 작으면: 병렬화 효과 부족
K가 너무 크면: 뒤쪽 토큰이 거부될 확률 증가 → Draft 계산 낭비
최적 K ≈ 3-5 (채택률 α에 따라)
α = 0.7 → K = 3-4 최적
α = 0.9 → K = 6-8까지 효과적
Speculative Decoding의 가장 매력적인 특성은 수학적으로 무손실이라는 것이다. 양자화는 모델 품질을 약간 희생하고, 프루닝은 구조를 변경한다. 하지만 Speculative Decoding은 출력 분포가 원래 모델과 정확히 동일하다. 이는 "품질 vs 속도" 트레이드오프가 아닌, 순수한 속도 향상이다.
실전에서 가장 중요한 통찰은 "쉬운 토큰은 작은 모델로 충분하다"는 것이다. "The capital of France is" 다음에 "Paris"가 올 것은 7B 모델도 안다. 70B 모델이 매번 이를 "직접 생성"하는 것은 낭비다. Speculative Decoding은 이 직관을 체계적으로 활용한다.
후속 연구 중 EAGLE이 특히 인상적이다. 별도의 Draft 모델 없이 Target 모델의 마지막 hidden state로 다음 토큰을 추측한다. Draft 모델 선택 문제와 메모리 문제를 동시에 해결한 것으로, Speculative Decoding의 실용적 발전형이다.
관련 논문: Medusa, EAGLE, Lookahead Decoding, SpecInfer, Staged Speculative Decoding