Speculative Decoding: LLM 추론 속도 20-50% 향상
요약
Speculative Decoding은 LLM의 추론 속도를 20-50% 향상시키는 기술로, 메모리 대역폭 병목 현상을 해결하기 위해 제안되었습니다. 빠른 초안 모델이 여러 토큰을 미리 생성하면, 대형 모델이 이를 한 번에 검증하는 Draft-Verify 메커니즘을 통해 통계적 동일성을 유지하며 속도를 높입니다.
핵심 포인트
- 자기회귀 디코딩의 순차적 의존성으로 인한 GPU 유휴 상태 해결
- 메모리 대역폭 병목을 줄이기 위해 순전파당 여러 토큰을 생성
- 출력 분포를 변경하지 않으면서 추론 속도 20-50% 향상
- llama.cpp, vLLM, SGLang 등 주요 프레임워크 적용 가능
70B 모델은 하나의 순전파 (forward pass) 당 하나의 토큰을 생성하며, 각 패스마다 VRAM에서 가중치 (weights)를 다시 로드하고, 컨텍스트 (context) 전체에 걸쳐 어텐션 (attention)을 계산하며, 메모리를 동기화합니다. 토큰 사이의 시간 동안 GPU는 순차적 의존성 (sequential dependencies)이 해결되기를 기다리며 유휴 상태 (idle)로 머뭅니다.
H100에서 70B 모델은 30-50ms마다 하나의 토큰을 생성합니다. GPU는 여러 토큰을 병렬로 처리할 수 있는 충분한 연산 능력 (compute capacity)을 가지고 있지만, 순차적 의존성이 이를 방해합니다. 즉, 각 토큰은 이전 토큰에 의존하며, 이로 인해 파이프라인 (pipeline)이 정체됩니다.
Speculative decoding은 출력 분포 (output distribution)를 변경하지 않으면서, 평소 하나의 토큰을 생성하는 데 걸리는 시간 동안 여러 개의 토큰을 생성할 수 있게 함으로써 이러한 병목 현상 (bottleneck)을 해결합니다. 생성된 토큰들은 표준 자기회귀 디코딩 (autoregressive decoding)을 통해 얻는 결과와 통계적으로 동일하며, 유일한 차이점은 토큰을 얻는 속도입니다.
이 가이드는 작동 원리, 2026년에 사용 가능한 변형 모델들, 수락률 (acceptance rate)의 트레이드오프 (tradeoffs), 그리고 llama.cpp, vLLM, SGLang, TensorRT-LLM에서의 실질적인 설정 방법을 다룹니다.
자기회귀 디코딩 (Autoregressive Decoding)의 작동 방식 (그리고 왜 느린가)
Speculative decoding을 이해하기 전에, 이 기술이 우회하고자 하는 자기회귀 제약 (autoregressive constraint)을 이해해야 합니다. 표준 자기회귀 생성은 토큰을 순차적으로 처리합니다:
- 현재 컨텍스트 (context)를 사용하여 모델에 순전파 (forward pass)를 실행합니다.
- 출력 분포 (output distribution)에서 다음 토큰을 샘플링 (sample)합니다.
- 해당 토큰을 컨텍스트 (context)에 추가합니다.
- 반복합니다.
각 단계마다 전체 순전파 (forward pass)가 필요합니다. 즉, VRAM에서 가중치 (weights)를 로드하고, 전체 컨텍스트에 걸쳐 어텐션을 계산하며, 단일 토큰을 생성해야 합니다. 70B 파라미터 (parameters)를 가진 모델의 경우, H100에서 토큰당 약 30-50ms가 소요됩니다. GPU에는 여유 연산 능력 (compute capacity)이 있어 더 많은 작업을 병렬로 처리할 수 있지만, 순차적 의존성이 이를 막고 있습니다.
연산-VRAM 격차 (The Compute-VRAM Gap)
현대 GPU는 단일 토큰 생성(single-token generation)에 필요한 것보다 더 많은 FLOPs(부동 소수점 연산량)를 보유하고 있습니다. 따라서 실제 병목 현상(bottleneck)은 메모리 대역폭(memory bandwidth)에서 발생합니다. 즉, 각 순전파(forward pass)마다 가중치(weights)를 VRAM에서 연산 유닛(compute units)으로 스트리밍해야 합니다. 한 번에 하나의 토큰을 생성할 때, GPU는 유용한 연산을 수행하기보다 메모리 전송을 기다리는 데 대부분의 시간을 소비합니다.
Speculative decoding(추측적 디코딩)은 메모리 전송당 GPU가 더 많은 작업을 수행하게 함으로써 이 문제를 해결합니다. 순전파당 하나의 토큰을 생성하는 대신, 순전파당 K개의 토큰을 생성하여 메모리 비용을 여러 출력값에 걸쳐 분할(amortizing)합니다.
Draft-Verify 메커니즘 (The Draft-Verify Mechanism)
Speculative decoding은 반복되는 draft-verify(초안 작성-검증) 사이클로 작동합니다. 빠른 draft 메커니즘이 K개의 후보 토큰을 제안합니다. 이 제안은 작은 draft 모델(draft model), n-gram 조회(n-gram lookup), 또는 타겟 모델(target model)에 부착된 예측 헤드(prediction head)를 통해 이루어집니다. 그 후 타겟 모델이 단 한 번의 순전파(forward pass)로 K개 전체를 검증합니다. draft 단계는 비용이 저렴하여 일반적으로 타겟 모델 순전파 시간의 5~20%에 불과합니다. 반면 검증(verification) 단계에서는 각 draft 토큰을 타겟 모델이 생성했을 결과와 비교하며, 가장 길게 일치하는 접두사(prefix)를 수락하고 첫 번째 거부(rejection) 지점부터 다시 샘플링(resampling)합니다.
sequenceDiagram
participant Draft as Draft mechanism
participant Target as Target model
...
K개의 토큰을 검증하는 비용은 하나의 토큰을 자기회귀적(autoregressively)으로 생성하는 비용과 거의 동일합니다. 따라서 draft가 정확할 경우, 단 한 번의 검증 단계 비용으로 K개의 토큰을 얻을 수 있습니다.
구체적인 예시
Draft 모델이 5개의 토큰 ["I", " like", " cooking", " and", " traveling"]을 제안한다고 가정해 봅시다. 타겟 모델은 단 한 번의 순전파로 이를 검증합니다.
| 토큰 | Draft | 타겟 일치 여부? |
|---|---|---|
| 1 | "I" | ✓ |
| ... |
타겟 모델은 토큰 1과 2를 수락한 후, 토큰 3에 대해 " playing"을 생성합니다. 결과적으로 세 번의 별도 순전파 대신 한 번의 사이클에서 세 개의 토큰을 생성하게 됩니다. 만약 draft가 토큰 5까지 정확했다면, 단 한 번의 검증 비용으로 5개의 토큰을 얻었을 것이며, 이는 해당 사이클에서만 5배의 속도 향상(speedup)을 의미합니다.
검증 병목 현상 (The Verification Bottleneck)
실제로 검증(verification) 과정이 실행 시간의 42-95%를 차지하며 전체 사이클을 지배합니다. 이는 방법론과 모델 크기에 따라 달라집니다. 타겟 모델의 순전파(forward pass)가 병목 현상(bottleneck)이며, 거절된 토큰(rejected tokens)은 낭비된 연산(compute)을 의미합니다.
이것이 수락률(acceptance rate)이 매우 중요한 이유입니다. 첫 번째 토큰 이후의 모든 거절된 토큰은 낭비된 검증 작업입니다. 가장 뛰어난 추측 디코딩(speculative decoding) 방법들은 단순히 원시 수락률(raw acceptance rate)을 높이는 것이 아니라, 사이클당 기대 수락 토큰(expected accepted tokens) 수를 최대화합니다.
수학적 보장 (The Mathematical Guarantee)
추측 디코딩의 가장 중요한 특성 중 하나는 타겟 모델의 표준 자기회귀 샘플링(standard autoregressive sampling)과 **정확히 동일한 분포(exact same distribution)**에서 토큰을 생성한다는 점입니다. 검증 단계에서는 거절 샘플링(rejection sampling)을 사용합니다. 초안 모델(draft model)이 토큰 x를 제안하면, 타겟 모델은 자체 확률 p(x)를 계산하고 초안 모델은 p_draft(x)를 계산합니다. 이때 수락 확률은 다음과 같습니다:
min(1, p(x) / p_draft(x))
타겟 모델이 동의할 때(p(x) ≥ p_draft(x)), 해당 토큰은 항상 수락됩니다. 타겟 모델이 동의하지 않을 경우, 토큰은 해당 비율에 비례하는 확률로 수락되며, 거절된 토큰은 잔차 분포(residual distribution)로부터 재샘플링됩니다:
r(x) = max(0, p(x) - p_draft(x)) / Σ max(0, p(y) - p_draft(y))
이 절차는 출력 시퀀스가 타겟 모델의 분포를 정확히 따르도록 보장하며, 이것이 추측 디코딩이 손실이 없는(lossless) 이유입니다. 초안 모델은 품질이 아닌 속도에 영향을 미칩니다. 생성된 토큰은 동일한 퍼플렉시티(perplexity)와 분포를 가지며, 통계적으로 표준 디코딩과 구별할 수 없습니다. 유일한 차이점은 지연 시간(latency)뿐입니다.
초안 모델 전략 (Draft Model Strategies)
초안 메커니즘은 가장 중요한 변수입니다. 접근 방식에 따라 설정 복잡도(setup complexity), 수락률, 그리고 속도 향상(speedup) 사이의 트레이드오프(tradeoff)가 달라집니다.
독립형 초안 모델 (Standalone Draft Models)
가장 단순한 접근 방식은 타겟 모델과 함께 더 작은 모델을 로드하는 것입니다. 일반적으로 7B-70B 규모의 타겟 모델을 위해 1B-3B 규모의 모델이 초안을 작성합니다.
장점 (Pros):
- 개념적으로 직관적임 (Conceptually straightforward)
- 어떤 타겟 모델과도 함께 작동 가능
- 초안 모델 (Draft model)을 타겟의 분포에 맞게 튜닝할 수 있음
단점 (Cons):
- VRAM에 두 번째 모델을 로드해야 함 (크기에 따라 1-4 GB)
- 초안 모델의 품질이 수락률 (Acceptance rate)을 직접적으로 결정함
- 서로 다른 계열 간의 초안 작성 (예: Llama를 위해 Qwen이 초안 작성)은 일반적으로 성능이 저조함
경험 법칙 (Rule of thumb): 동일한 계열의 모델을 사용하세요. Gemma 2 2B는 Gemma 2 27B를 위한 초안 작성에 효과적입니다. Llama 3.2 1B는 Llama 3.1 70B를 위한 초안 작성에 효과적입니다. 서로 다른 계열의 초안 작성은 토큰 분포 (Token distributions)가 일치하지 않기 때문에 수락률이 낮은 경향이 있습니다.
호환 가능한 초안 모델 찾기
모든 소형 모델이 특정 타겟의 초안 모델로 작동하는 것은 아닙니다. 핵심 요소는 분포 정렬 (Distribution alignment)입니다. 즉, 초안 모델의 출력 확률이 타겟의 확률과 얼마나 밀접하게 일치하는지가 중요합니다.
| 타겟 모델 (Target Model) | 권장 초안 모델 (Recommended Draft) | 계열 일치 여부 (Family Match) |
|---|---|---|
| Llama 3.1 70B | Llama 3.2 1B-3B | 동일 (Same) |
| ... |
황금률: 만약 초안 모델의 수락률이 50% 미만으로 떨어진다면, Speculative Decoding은 오히려 속도를 늦출 수 있습니다. 대부분의 제안이 거절될 경우, 초안 모델 실행 및 검증에 드는 오버헤드 (Overhead)가 이득보다 커지기 때문입니다.
EAGLE 및 EAGLE-3: 예측 헤드 (Prediction Heads)
EAGLE (Efficient Architecture Guided Language Model Estimation)은 별도의 초안 모델을 사용할 필요를 없앱니다. 대신, 타겟 모델의 내부 레이어(Internal layers)에 경량 자기회귀 (Autoregressive) 예측 헤드를 부착합니다.
EAGLE의 작동 방식
EAGLE은 타겟 모델의 중간 레이어로부터 은닉 상태 (Hidden states)를 받아 미래의 토큰을 예측하는 예측 헤드를 학습합니다. 추론 (Inference) 과정은 다음과 같습니다:
- 타겟 모델이 레이어를 통해 순전파 (Forward pass)를 수행합니다.
- 각 레이어에서 EAGLE 헤드가 은닉 상태를 읽고 미래 위치에 대한 토큰을 제안합니다.
- 여러 개의 헤드가 병렬로 작동하며, 각 헤드는 서로 다른 미래 타임스텝 (Timestep)을 예측합니다.
- 타겟 모델은 단 한 번의 패스 (Single pass)로 모든 제안을 검증합니다.
장점: EAGLE 헤드(heads)는 타겟 모델의 분포 (distribution)를 일치시키도록 특별히 학습되었습니다. 이들은 타겟 모델의 내부 표현 (internal representations)을 직접 확인하며, 이는 독립적인 초안 모델 (standalone draft model)보다 훨씬 더 나은 정렬 (alignment)을 제공합니다.
EAGLE-3 개선 사항
EAGLE-3 (2025)는 세 가지 주요 변경 사항을 통해 이 접근 방식을 개선합니다:
- 레이어 선택 (Layer selection): 모든 레이어에 헤드를 부착하는 대신, EAGLE-3는 베이지안 최적화 (Bayesian optimization)를 사용하여 최적의 종료 레이어 (exit layer)를 선택함으로써 오버헤드 (overhead)를 줄입니다.
- 멀티 토큰 예측 (Multi-token prediction): 각 헤드는 여러 토큰을 동시에 예측하여, 비례적인 연산 비용 증가 없이 초안 깊이 (draft depth)를 늘립니다.
- 학습 효율성 (Training efficiency): EAGLE-3는 타겟 모델 자체의 생성 데이터로 학습되어, 분포 내 워크로드 (in-distribution workloads)에서의 수락률 (acceptance rates)을 향상시킵니다.
수락률 (Acceptance rates): EAGLE-3는 독립적인 초안 모델의 40-60%와 비교하여, 분포 내 워크로드에서 일반적으로 60-80%의 수락률을 달성합니다. 반복성이 높은 코드 생성 워크로드에서는 수락률이 85%를 초과할 수 있습니다.
설정 (Setup): EAGLE-3는 타겟 모델을 위한 사전 학습된 헤드 (pre-trained heads)가 필요합니다. NVIDIA는 TensorRT-LLM 및 HuggingFace의 Speculative Decoding Modules 컬렉션을 통해 여러 인기 모델에 대한 EAGLE-3 헤드를 제공합니다. vLLM 및 SGLang을 위한 제3자 구현체도 존재합니다.
P-EAGLE: 병렬 초안 작성 (2026년 3월)
EAGLE-3의 주요 한계는 자기회귀적 초안 작성 (autoregressive drafting)입니다. 각 초안 토큰이 이전 토큰에 의존하기 때문에, K개의 초안 토큰을 생성하려면 초안 헤드를 통한 K번의 순차적인 순전파 (sequential forward passes)가 필요하며, 초안 오버헤드는 K에 따라 선형적으로 증가합니다. P-EAGLE은 최대 10개의 토큰을 병렬로 예측하도록 학습된 경량 4레이어 초안 작성기 (drafter)를 통한 단 한 번의 순전파로 모든 K개의 초안 토큰을 생성함으로써 이러한 한계를 제거합니다.
결과: P-EAGLE은 NVIDIA B200 기반의 실제 워크로드에서 기존 EAGLE-3 대비 최대 1.69배의 속도 향상을 제공합니다. 이 장점은 K 값이 높을수록 확대됩니다. EAGLE-3의 순차적 초안 작성이 병목 현상이 되는 지점에서, P-EAGLE의 병렬 초안 작성은 추가 비용을 발생시키지 않습니다.
vLLM에서의 설정: HuggingFace에서 사전 학습된 (pre-trained) P-EAGLE 헤드를 다운로드하고, vLLM 설정에서 "parallel_drafting": true를 설정한 뒤, 동일한 --speculative-model 플래그를 사용하면 됩니다. 나머지는 vLLM이 처리합니다. P-EAGLE은 EAGLE 기반의 추측적 디코딩 (Speculative Decoding) 분야에서 현재 최첨단 (state-of-the-art) 기술이며, 만약 2026년에 EAGLE을 배포한다면 P-EAGLE이 사용해야 할 변형 모델입니다.
n-gram 추측적 디코딩 (n-gram Speculative Decoding)
n-gram 추측적 디코딩은 신경망 초안 (neural draft)을 프롬프트 이력 (prompt history)에 대한 패턴 매칭으로 대체합니다. 이 알고리즘은 컨텍스트 (context) 내에서 반복되는 n-gram 시퀀스를 찾으며, 현재 토큰 시퀀스가 이전에 나타난 패턴과 일치할 때 해당 패턴 뒤에 따라왔던 토큰들을 제안합니다. 예를 들어, 모델이 이미 def calculate_total(items):를 생성했고 다시 def calculate_total(를 만나게 되면, 이전 발생 사례를 바탕으로 다음 토큰이 items):가 될 가능성이 높다는 것을 알게 됩니다.
n-gram 맵 변형 (ngram-map-k, ngram-map-k4v)은 선형 스캐닝 (linear scanning) 대신 해시 테이블 (hash tables)을 사용하여 더 빠른 조회를 수행하며, 해시 키 (hash key)는 크기가 N인 현재 n-gram으로, 값 (value)은 그 뒤를 따랐던 토큰 시퀀스로 사용합니다.
장점:
- VRAM 오버헤드 제로 — 로드할 추가 모델이 없음 (해시 테이블용 약 16 MB)
- 반복적인 워크로드 (코드 편집, 리팩토링, 템플릿 생성)에서 매우 빠름
- 자기 유사성 (self-similarity)이 높은 워크로드에서는 수락률 (acceptance rates)이 90% 이상에 달할 수 있음
단점:
- 새로운 생성 (novel generation)에는 무용지물 — 패턴이 이전에 나타난 적이 없다면 n-gram은 제안할 것이 없음
- 창의적이거나 다양한 워크로드에서는 수락률이 0에 가깝게 떨어짐
- 제한된 초안 깊이 (일반적으로 매칭당 2-4 토큰)
가장 적합한 경우: 코드 리팩토링, 템플릿 채우기, 반복적인 문서 작성, 그리고 모델이 유사한 패턴을 다시 방문하는 모든 워크로드. 가장 부적합한 경우: 창의적 글쓰기, 개방형 채팅, 그리고 추론 (reasoning) 작업.
파라미터 튜닝 (Parameter Tuning)
n-gram 파라미터는 예상보다 더 중요합니다. 기본값은 코드에는 잘 작동하지만, 텍스트 워크로드에는 조정이 필요합니다:
| 파라미터 (Parameter) | 기본값 (Default) | 코드 (Code) | 텍스트 (Text) | 비고 (Notes) |
|---|---|---|---|---|
size-n (lookup length) | 12 | 12-16 | 8-10 | n-gram이 길어지면 오탐 (false positives)은 줄어들지만, 더 짧은 패턴을 놓칠 수 있음 |
| ... | ||||
텍스트 워크로드의 경우, size-n을 8-10으로 줄이고 min-hits를 2로 늘리십시오. 이는 매칭 빈도를 희생하는 대신 매칭당 수락률 (acceptance rates)을 높이는 트레이드오프 (trade-off) 방식입니다. |
Self-Speculative Decoding
Self-speculative decoding (LayerSkip 또는 self-speculation이라고도 함)은 모델 자체의 부분적인 연산 (partial computation)을 초안 (draft)으로 사용하므로 별도의 모델이 필요하지 않습니다.
작동 원리
각 토큰에 대해 전체 모델을 실행하는 대신, self-speculative decoding은 일부 트랜스포머 레이어 (transformer layers)를 건너뛰는 축소된 버전 (truncated version)을 실행하여 저렴하게 초안 토큰 (draft tokens)을 생성하며, 이후 전체 모델이 제안된 토큰들을 검증 (verify)합니다.
예를 들어, 32개 레이어를 가진 모델이 초안 생성을 위해 16개 레이어만 사용하여 실행된 다음, 32개 레이어 전체를 사용하여 검증할 수 있습니다. 축소된 순전파 (forward pass)는 처리하는 레이어 수가 적기 때문에 더 빠르며, 초안 토큰은 타겟 모델과 동일한 초기 레이어들을 본다는 이점을 가집니다.
장점 (Pros):
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기