추측 디코딩과 EAGLE-3 (Speculative Decoding and EAGLE-3)
Phase 7 · Lesson 16에서는 수학을 증명했습니다. Leviathan 거부 규칙(rejection rule)은 검증기(verifier)의 분포를 정확히 보존합니다. 이번 lesson은 2026년 프로덕션 추측 디코딩(speculative decoding)을 학습 스택 관점에서 살펴봅니다. EAGLE-3는 초안 모델(draft model)을 값싼 근사치가 아니라, 검증기 자신의 은닉 상태(hidden state)를 이용해 학습한 목적 특화 초소형 네트워크로 바꿨습니다. 여기에 학습 시점 테스트 루프(training-time test loop)를 더해 학습 분포와 추론 분포를 정렬했습니다. 그 결과 종단 간(end-to-end) 3배에서 6.5배의 속도 향상, 채팅에서 토큰당 수락률(acceptance rate) 0.9 이상을 얻으면서도 분포상의 손해(tradeoff)는 없었습니다. 2026년의 모든 프로덕션 추론 스택은 이를 기본값으로 탑재합니다.
유형: Build
언어: Python (표준 라이브러리)
선수 지식: Phase 7 · 16 (추측 디코딩 수학), Phase 10 · 12 (추론 최적화)
예상 시간: 약 75분
학습 목표
- Leviathan 정리(Leviathan theorem)를 한 문장으로 말하고, 추측 디코딩 루프가 검증기와 동일한 분포의 샘플을 만든다는 것을 증명합니다.
- 기본 추측 디코딩(Leviathan 2023)에서 EAGLE, EAGLE-2, EAGLE-3까지 이어진 2년간의 발전 흐름을 설명하고, 각 단계가 제거한 정확한 한계를 이름 붙입니다.
- 수락률
α와 초안 대비 검증기 비용 비율 c로부터 기대 속도 향상(expected speedup)을 계산하고, 각 구간에서 최적 초안 길이 N을 고릅니다.
- 전체 추측 디코딩 루프를 처음부터 구현합니다. 초안 작성(draft), 검증(verify), 잔차 분포(residual)에서의 거부 샘플링(rejection sampling), 거부 시 KV 캐시 되돌리기(rollback), 전체 수락 시 보너스 토큰(bonus token) 방출까지 포함합니다.
문제
70B 모델에서 자기회귀 디코딩(autoregressive decoding)을 하면 H100에서도 초당 35 토큰 정도가 한계일 수 있습니다. GPU는 전혀 포화되지 않습니다. 병목은 메모리 대역폭(memory bandwidth)입니다. 토큰 하나마다 HBM에서 70B 가중치를 읽어 한 단계 계산을 하고, float 하나를 출력합니다. 연산 장치(compute unit)는 대부분 놀고 있는 셈입니다.
추측 디코딩은 이 문제를 실제로 풀 수 있는 처리량(throughput) 문제로 바꿉니다. 값싼 초안 모델이 N개의 토큰을 N번의 작은 순전파로 제안합니다. 검증기는 접두(prefix)에 N개의 초안 토큰을 붙인 입력에 대해 단 한 번만 실행됩니다. 위치 i에서 검증기의 분포가 초안과 통계적인 의미에서 합치하면 그 토큰을 수락합니다. 합치하지 않으면 거부하고 잔차 분포에서 보정 토큰(correction)을 샘플링합니다. 큰 모델의 순전파 한 번이 토큰 하나가 아니라 최대 N+1개의 수락 토큰을 만들어 냅니다.
핵심이 되는 정리는 Leviathan, Kalman, Matias(ICML 2023)의 결과입니다. 출력 분포는 검증기에서 직접 샘플링했을 때와 동일합니다. 근사적으로 동일한 것이 아니라 정확히 동일합니다. 이 점이 바로 추측 디코딩을 프로덕션에서 받아들일 수 있게 만드는 모든 근거이며, 품질 손해 없이 순수하게 지연 시간만 줄이는 최적화입니다.
Phase 7 · Lesson 16에서 배운 것은 수학이었고, 이번 lesson에서 다루는 것은 학습 스택입니다. 좋은 초안 모델은 값싼 초안 모델보다 2배 더 큰 속도 향상을 줄 수 있습니다. EAGLE, EAGLE-2, EAGLE-3(Li et al., 2024-2025)는 "초안 = 같은 계열의 더 작은 모델"이라는 접근을 정밀한 엔지니어링 분야로 바꿨습니다. 2026년의 프로덕션 추론 서버는 EAGLE-3를 기본값으로 사용합니다.
개념
불변식: Leviathan 거부 샘플링
어떤 접두가 주어졌을 때 다음 토큰에 대한 초안의 분포를 p(t), 검증기의 분포를 q(t)라고 합시다. 초안 토큰 d ~ p를 샘플링합니다. min(1, q(d) / p(d))의 확률로 수락합니다. 거부하면 잔차 분포 (q - p)_+ / ||(q - p)_+||_1에서 샘플링합니다. 이렇게 얻은 샘플은 q를 따릅니다. 이 성질은 p가 얼마나 나쁜지와 무관합니다. p가 나쁠수록 더 자주 거부할 뿐, 출력 분포는 여전히 정확합니다.
이 호출을 N개 이어 붙여 prefix + d_1 + ... + d_N에 대한 검증기 순전파 한 번으로 처리합니다. 검증기는 q_1, q_2, ..., q_{N+1}을 동시에 반환합니다. 왼쪽에서 오른쪽으로 따라가며, 위치 j에서 첫 번째 거부가 일어나면 residual(q_j, p_j)에서 샘플링하고 멈춥니다. 전부 수락되면 q_{N+1}에서 보너스 토큰 하나를 추가로 샘플링합니다.
속도 향상을 결정하는 것
α를 초안 토큰당 기대 수락률이라고 합시다. c = cost(draft) / cost(verifier)를 비용 비율이라고 둡니다. 검증기 순전파 한 번당 기대 수락 토큰 수는 다음과 같습니다.
E[accepted] = (1 - α^(N+1)) / (1 - α)
수락 토큰 하나당 기대 총 실측 시간(wall time)은 (N * c + 1) / E[accepted]입니다. 이를 N에 대해 최소화하면 최적 지점(sweet spot)을 얻습니다. α = 0.8, c = 0.05라면 최적 N은 대략 5-7이고, 속도 향상은 3.2배입니다. α = 0.95, c = 0.02라면 최적 N은 대략 8-10이며, 속도 향상은 5배에 가까워집니다.
가장 큰 지렛대는 α입니다. N = 5로 고정했을 때 α = 0.6인 기본 초안에서 α = 0.9인 EAGLE-3로 올라가면, 검증기 순전파당 기대 수락 토큰 수가 2.2에서 4.1로 늘어납니다. 같은 검증기로 거의 2배 더 많은 처리량을 얻는 셈입니다.
2년간의 발전 흐름
기본 추측 디코딩(Vanilla speculative, Leviathan, 2023). 초안 모델은 같은 계열에서 독립적으로 학습된 더 작은 LLM입니다. 연결하기는 쉽지만 α ≈ 0.6이고, 속도 향상은 잘해야 약 2배에 그칩니다.
EAGLE-1(Li et al., 2024). 초안은 보통 한두 층짜리 작은 트랜스포머(transformer)입니다. 검증기의 마지막 층 은닉 상태를 입력으로 받아 다음 토큰을 직접 예측합니다. 초안이 검증기의 특징 표현(feature representation)을 직접 보기 때문에 분포가 검증기에 훨씬 가까워집니다. α는 0.7-0.8까지 올라갑니다.
EAGLE-2(Li et al., 2024). 동적 초안 트리(dynamic draft tree)를 추가합니다. N개 토큰의 단일 시퀀스를 제안하는 대신 작은 후보 트리를 제안하고, 검증기 순전파 한 번으로 각 후보를 점수화합니다(tree attention). 그런 다음 가장 확률이 높은 경로를 따라갑니다. 초안 길이는 단계마다 적응적으로 바뀝니다. 수락 경로 토큰 기준 α는 0.85를 넘습니다.
EAGLE-3(Li et al., 2025, NeurIPS). 두 가지 변화가 더해집니다. 첫째, 특징 예측 손실(feature-prediction loss)을 완전히 제거합니다. EAGLE-1/2는 초안이 검증기의 은닉 상태를 맞추도록 학습했는데, 이 방식은 데이터를 더 늘려도 성능 향상이 어느 선에서 멈추는 한계를 만듭니다. EAGLE-3는 토큰 예측(token prediction)을 직접 학습합니다. 둘째, 학습 시점 테스트(training-time test, TTT)를 사용합니다. 초안 학습 중에도 추론 때와 같은 방식으로 초안 자신의 이전 예측을 다음 입력으로 되먹입니다. 이렇게 하면 학습 분포와 테스트 분포가 정렬되고 오류 누적(error accumulation)이 줄어듭니다. 측정된 속도 향상은 채팅에서 최대 6.5배, H100의 SGLang에서 batch 64 기준 처리량 38% 개선입니다.
KV 캐시 되돌리기(rollback)
검증은 한 번의 순전파로 검증기의 KV 캐시를 N개 항목(entry)만큼 확장합니다. 위치 j에서 거부가 발생하면 j-1 이후의 캐시 내용은 잘못된 상태가 됩니다. 흔히 쓰는 구현은 두 가지입니다. 임시 버퍼(scratch buffer)에 써 두었다가 수락 시 반영(commit)하는 방식(vLLM, TensorRT-LLM)과, 물리적 KV 캐시와 논리 길이(logical length)를 따로 두고 거부 시 잘라내는(truncate) 방식입니다. 어느 쪽이든 되돌리기 비용은 layer와 head마다 몇 byte를 조정하는 수준이며, 순전파 비용에 비하면 무시할 수 있습니다.
EAGLE-2의 트리 탐색(tree search)에서는 검증기가 트리 위상(tree topology)을 따르는 비인과 마스크(non-causal mask)로 어텐션(attention)을 실행합니다. 엔지니어링은 까다롭지만 계산 자체는 사용자 정의 마스크(custom mask)를 붙인 표준 FlashAttention 호출입니다.
2026년의 초안 아키텍처
| 전략 | 초안 유형 | α | 속도 향상 | 학습 비용 |
|---|
| Vanilla | 별도의 작은 LLM | 0.55-0.70 | 1.8-2.3배 | 없음. 기존의 작은 모델 재사용 |
| Medusa | 검증기 위의 추가 LM head | 0.65-0.75 | 2-3배 | 약 1B SFT 토큰 |
| EAGLE-1 | 은닉 상태 위의 1-layer 트랜스포머 | 0.70-0.80 | 2.5-3배 | 약 60B 토큰 |
| EAGLE-2 | EAGLE-1 + 동적 초안 트리 | 0.80-0.88 | 3-4배 | 약 60B 토큰 |
| EAGLE-3 | 다층 특징 융합(feature fusion) + TTT | 0.88-0.92 | 3.5-6.5배 | 약 60-200B 토큰 |
| Lookahead | 초안 없음. Jacobi iteration | N/A | 1.3-1.6배 | 없음 |
2026년 프로덕션에서는 vLLM과 SGLang이 가능한 경우 EAGLE-3를 기본값으로 사용하고, 그렇지 않으면 EAGLE-2를 사용합니다. TensorRT-LLM은 Meta와 NVIDIA 공개 모델에 대해 가장 빠른 Medusa 경로를 제공합니다. llama.cpp는 CPU 배포용 기본 초안(vanilla draft)을 제공합니다.
직접 만들기
code/main.py를 확인합니다. 이 코드는 모든 조각을 포함한 전체 Leviathan 추측 디코딩 루프입니다. N개 초안 작성, 검증기 병렬 실행, 위치별 거부, 잔차 샘플링, 보너스 토큰, KV 되돌리기, 출력 분포가 q에서 직접 샘플링한 것과 일치한다는 경험적 검증까지 포함합니다.
Step 1: 거부 규칙
def accept(q_prob, p_prob, u):
if p_prob <= 0:
return True
return u < min(1.0, q_prob / p_prob)
Step 2: 잔차 분포
def residual(q, p):
raw = [max(0.0, qi - pi) for qi, pi in zip(q, p)]
s = sum(raw)
if s == 0:
return list(q)
return [r / s for r in raw]
Step 3: 전체 추측 step
spec_step 함수는 p에서 N개 토큰을 초안으로 만들고, 한 번의 병렬 q 평가로 모두 검증합니다. 초안 토큰마다 거부 규칙을 적용하고, 첫 번째 거부가 발생하면 잔차 분포에서 보정 토큰을 샘플링합니다. 모든 초안이 수락되면 q_{N+1}에서 보너스 토큰을 방출합니다.
Step 4: KV 되돌리기 기록 관리(bookkeeping)
시뮬레이터는 작업자(worker)마다 논리적 kv_length를 추적합니다. k개의 초안이 수락되면 kv_length += k가 됩니다. 위치 j에서 거부가 발생하면 캐시는 이미 j 너머까지 쓰여 있지만, 논리 길이는 prefix_length + j + 1로 설정됩니다. 즉 보정 토큰 바로 다음 위치입니다. 이후의 읽기 작업은 논리 길이까지만 유효한 것으로 잘립니다.
Step 5: Leviathan 확인
50,000번의 추측 단계를 실행하면서 수락 토큰의 경험적 분포(empirical distribution)를 셉니다. 이를 q에서 직접 50,000번 샘플링한 결과와 비교합니다. 카이제곱 통계량(chi-square statistic)은 임계값보다 충분히 낮아야 합니다. 정리는 실제 시뮬레이션에서도 통과합니다.
Step 6: α별 속도 향상
p를 여러 진폭(amplitude)으로 q에서 멀어지게 흔들어(perturb) 초안 품질을 휘저으며(sweep) 살펴봅니다. α를 측정한 다음, α와 N에 따른 검증기 호출당 기대 토큰 수를 표로 확인합니다. 코드는 EAGLE-3급 초안 품질(α ≈ 0.9)이 검증기 호출당 4-5 토큰을 가능하게 한다는 표를 출력합니다.
사용해보기
EAGLE-3를 사용하는 프로덕션 수준 vllm serve 예시는 다음과 같습니다.
vllm serve meta-llama/Llama-3.3-70B-Instruct \
--speculative-config '{
"model": "yuhuili/EAGLE3-LLaMA3.3-Instruct-70B",
"num_speculative_tokens": 5,
"method": "eagle3"
}'
EAGLE-3 논문에 따르면 H100의 SGLang batch 64에서 EAGLE-3는 batch 64 기본 디코딩보다 대략 1.38배 더 높은 처리량을 보입니다.
추측 디코딩을 고려할 때는 다음 경우가 좋습니다.
- p50 지연 시간이 최고 처리량(peak throughput)보다 중요한 모든 대화형 채팅 작업 부하(workload).
- 코드 생성과 구조화 출력(JSON, SQL). 목표 분포가 매우 예측 가능하기 때문에
α가 0.9 이상입니다.
- 수천 토큰에 이르는 장문 생성. 분산 상각된 속도 향상(amortized speedup)이 계속 누적됩니다.
사용하지 않는 편이 나은 경우도 있습니다.
- 매우 작은 모델(< 3B). 초안이 검증기보다 충분히 싸지 않습니다.
- 작은 배치 1 규모의 CPU 배포. 초안 모델의 메모리 추가 부담(overhead)이 이득보다 클 수 있습니다.
- 매우 높은 온도(temperature)의 창의적 샘플링.
α가 무너집니다.
산출물 만들기
이번 lesson은 outputs/skill-eagle3-tuner.md를 만듭니다. 추론 작업 부하(모델, 배치 크기, 목표 지연 시간, 작업 프로필)를 입력하면 추측 디코딩 전략과 튜닝(tuning) 매개변수를 추천합니다. 초안 계열(draft family), N, 트리 깊이(tree depth), 온도 인지 전환(temperature-aware switching)을 포함합니다.
연습문제
-
(쉬움) code/main.py를 실행합니다. Leviathan 분포 확인에서 카이제곱 통계량이 50,000 샘플 기준 95% 임계값 아래에 머무는지 확인합니다.
-
(중간) α = 0.9, c = 0.04로 고정하고 N을 1부터 10까지 훑어봅니다. 검증기 호출당 기대 토큰 수와 실제 토큰당 실측 시간을 그립니다. 실측 시간을 최소화하는 N을 찾고, 곡선의 모양을 설명합니다.
-
(중간) EAGLE-2 트리 탐색을 시뮬레이션하도록 코드를 수정합니다. 각 단계에서 초안은 [2, 2, 2] 형태의 트리, 즉 8개 후보 경로를 제안합니다. 검증기는 한 번만 실행되고, 가장 높은 확률의 수락 경로가 선택됩니다. 잎(leaf) 노드별 α와 검증기 호출당 총 토큰 수를 계산합니다. 같은 계산량의 선형 체인(linear-chain) 추측 디코딩과 비교합니다.
-
(어려움) 두 개의 동시 시퀀스에 대한 일괄(batched) KV 되돌리기 시뮬레이터를 구현합니다. 시퀀스 A는 모든 초안이 수락되고, 시퀀스 B는 위치 2에서 거부됩니다. 올바른 kv_length가 시퀀스별로 갱신되고, 작업이 낭비되지 않는다는 것을 보입니다.
-
(어려움) EAGLE-3 논문의 Section 4(Training-Time Test)를 읽습니다. TTT 없는 단순 초안 학습이 왜 노출 편향(exposure bias)을 겪는지, 학습 중에 초안 자신의 예측을 다시 입력하는 방식이 왜 이를 바로잡는지 두 문장으로 설명합니다. 이를 seq2seq의 scheduled sampling 문헌과 연결해 봅니다.
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| Leviathan 규칙(Leviathan rule) | "q over p의 min(1)" | min(1, q(d)/p(d)) 확률로 베르누이(Bernoulli) 수락/거부를 수행합니다. 거부 시 잔차에서 샘플링하면 검증기 분포를 정확히 보존합니다. |
| 잔차 분포(Residual distribution) | "q minus p plus, normalize" | (q - p)_+를 0 아래에서 잘라낸(clamp) 뒤 다시 정규화한 분포입니다. 거부 시 샘플링해야 하는 올바른 분포입니다. |
수락률(acceptance rate) α | "초안이 맞는 빈도" | 거부 규칙 아래에서 토큰당 베르누이 성공 확률의 기대값입니다. 모든 속도 향상 계산을 지배합니다. |
| EAGLE-1 | "은닉 상태 초안" | 검증기의 마지막 층 은닉 상태를 조건으로 쓰는 작은 트랜스포머 초안입니다(Li et al., 2024). |
| EAGLE-2 | "동적 초안 트리" | EAGLE-1에 후속 토큰(continuation) 후보 트리를 더하고, 트리 어텐션(tree attention)으로 한 번의 검증기 순전파(pass)에서 점수화합니다. |
| EAGLE-3 | "training-time test" | 특징 예측 손실(feature-prediction loss)을 제거하고, 학습 중에도 초안 자신의 출력을 입력으로 되먹이는 직접 토큰 예측 방식입니다. |
| 학습 시점 테스트(Training-time test, TTT) | "노출 편향 수정" | 학습 중 초안을 자기회귀적으로 실행해 학습 입력 분포와 테스트 입력 분포를 맞춥니다. scheduled sampling과 직접 대응됩니다. |
| KV 되돌리기(KV rollback) | "거부된 초안 되돌리기" | 거부가 발생하면 검증기의 KV 캐시를 수락된 접두 길이로 되돌리는 기록 관리(bookkeeping)입니다. |
| 보너스 토큰(bonus token) | "공짜 토큰" | N개 초안이 모두 수락되면 추가 검증기 비용 없이 q_{N+1}에서 하나 더 샘플링하는 토큰입니다. |
| 트리 어텐션(tree attention) | "여러 후보를 한 번에 검증" | 초안 트리의 위상을 따르는 비인과 마스크(non-causal mask)를 가진 어텐션입니다. 순전파 한 번으로 트리의 모든 노드에 대한 q_i를 계산합니다. |
더 읽을거리