
로컬 하드웨어에서의 Speculative Decoding: NVIDIA DGX Spark에서 N-Gram, MTP, EAGLE3, DFlash
요약
NVIDIA DGX Spark 환경에서 Qwen3.5 모델을 대상으로 N-Gram, MTP, EAGLE3, DFlash 등 네 가지 추측적 디코딩(Speculative Decoding) 기법을 벤치마킹했습니다. LLM 추론의 메모리 대역폭 병목 현상을 해결하기 위한 최적화 방안과 각 기법의 성능 특성을 분석합니다.
핵심 포인트
- MTP-2가 처리량과 안정성 측면에서 가장 균형 잡힌 성능을 보임
- DFlash는 가장 높은 피크 속도를 기록했으나 변동성이 큼
- LLM 추론은 연산 제한이 아닌 메모리 대역폭 제한(memory-bandwidth bound) 문제임
- 추측적 디코딩은 출력 품질 저하 없이 추론 속도를 향상시키는 핵심 기술임
로컬 하드웨어에서의 Speculative Decoding: NVIDIA DGX Spark에서 N-Gram, MTP, EAGLE3, DFlash 벤치마킹
요약 (TL;DR): 단일 NVIDIA DGX Spark (GB10, SM121)에서
Qwen3.5-122B-A10B-hybrid-int4-fp8를 실행하며 네 가지 Speculative Decoding (추측적 디코딩) 방법인 N-Gram, MTP, EAGLE3, DFlash를 벤치마킹했습니다. MTP-2가 처리량(throughput)과 안정성 사이에서 가장 좋은 균형(평균 ~49 tok/s, 피크 ~51 tok/s)을 보여주었습니다. DFlash는 가장 높은 개별 피크(~78 tok/s)를 달성했으나 변동성이 컸습니다. 설정값들을 공유합니다.
로컬 AI에서 Speculative Decoding이 중요한 이유
비싼 로컬 하드웨어에서 초당 토큰 수를 최대한으로 끌어올리는 것은 단순히 있으면 좋은 기능이 아닙니다. 프런티어 규모(frontier-scale)의 모델을 로컬에서 실행하기 위해 시스템에 투자한 DGX Spark와 같은 기기에서, 추론 처리량(inference throughput)은 에이전트 파이프라인(agentic pipelines), 코딩 어시스턴트, 그리고 다회차 대화(multi-turn conversations)에서의 지연 시간(latency)과 직결됩니다.
Speculative Decoding (추측적 디코딩)은 출력 품질의 변화 없이 의미 있는 속도 향상을 제공할 수 있는 몇 안 되는 최적화 기술 중 하나입니다. 타겟 모델의 최종 검증 단계가 표준적인 자기회귀 디코딩 (autoregressive decoding)과 수학적으로 동일한 출력 분포를 보장하기 때문에, 품질 저하(quality trade-off)가 전혀 없습니다.
LLM 추론: 메모리 대역폭 병목 현상
Speculative Decoding의 메커니즘을 깊이 파고들기 전에, 왜 LLM 추론이 근본적으로 느린지 이해할 가치가 있습니다.
LLM이 단일 토큰을 생성할 때마다 GPU는 VRAM에서 연산 유닛으로 전체 모델 가중치 행렬(model weight matrix)을 로드해야 합니다. 120B 이상의 파라미터를 가진 모델의 경우, 이는 수십 기가바이트의 데이터를 이동시켜야 함을 의미하며, 이는 종종 가중치당 불과 몇 번의 부동 소수점 연산(floating-point operations)을 위한 작업입니다. 이로 인해 추론은 근본적으로 연산 제한(compute-bound)이 아닌 메모리 대역폭 제한 (memory-bandwidth bound) 상태가 됩니다. 메모리 버스가 힘든 일을 하는 동안 GPU의 텐서 코어 (tensor cores)는 대부분 유휴 상태로 있게 됩니다.
각 추론 단계는 두 가지 뚜렷한 단계로 구성됩니다:
- Prefill (Prompt Processing, 프롬프트 처리): 입력 프롬프트 토큰들이 병렬로 처리됩니다. 이 단계는 연산 집약적 (compute-bound)이며, 긴 컨텍스트 (context)에서도 비교적 빠릅니다.
- Decode (Generation, 디코딩/생성): 모델이 한 번에 하나의 토큰을 자기회귀적 (autoregressively)으로 생성합니다. 각 단계마다 모델의 모든 가중치 (weights)를 메모리에서 로드하며 전체 순전파 (forward pass)를 수행해야 합니다. 이것이 느린 단계이며, 출력 길이에 따라 선형적으로 증가합니다.
Qwen3.5-122B-A10B-hybrid-int4-fp8 체크포인트를 사용하는 DGX Spark에서, 최적화되지 않은 베이스라인 (baseline)은 약 36–37 tok/s의 생성 처리량 (throughput)을 기록합니다. 이것이 우리가 넘어서고자 하는 수치입니다.
Speculative Decoding (추측적 디코딩)의 작동 원리
핵심 아이디어는 직렬적인 토큰 단위의 병목 현상을 깨뜨리는 것입니다. 작고 빠른 **초안 모델 (draft model)**이 K개의 후보 토큰 시퀀스를 빠르게 연속적으로 제안합니다. 그러면 거대한 **대상 모델 (target model)**이 **단 한 번의 순전파 (single forward pass)**로 K개의 토큰을 모두 검증합니다. 검증(알려진 입력에 대해 전체 모델을 실행하는 것)은 독립적인 생성보다 훨씬 비용이 저렴하기 때문입니다.
실질적인 속도 향상은 상충하는 두 가지 요소에 달려 있습니다:
- 초안 속도 (Draft speed): 초안 모델이 얼마나 빠르게 토큰을 제안할 수 있는가
- 수락률 (Acceptance rate, α): 대상 모델이 초안 토큰 중 어느 정도의 비율을 수락하는가
비용은 매우 저렴하지만 품질이 낮은 초안 모델 (낮은 α)은 대상 모델이 수락할 수 있는 속도보다 더 빠르게 토큰을 생성하여 연산 자원을 낭비하게 됩니다. 반대로 대상 모델과 거의 일치할 정도로 매우 정확한 초안 모델은 α는 높지만 실행 속도가 유의미하게 빠르지 않을 것입니다. 최적의 지점(sweet spot)은 **해당 작업에 대해 대상 모델의 분포를 정확하게 모방하는 경량 초안 모델 (lightweight drafter)**을 사용하는 것입니다.
대상 모델의 순전파 1회당 생성되는 예상 토큰 수는 다음과 같습니다:
여기서 α는 토큰당 수락률 (acceptance rate)이며, K는 추측된 토큰 (speculative tokens)의 수입니다. 이는 K=2일 때 적절한 수락률(예: 0.8)만으로도 타겟 패스(target pass)당 약 2.4개의 토큰을 생성할 수 있음을 의미하며, 이는 유의미한 승수 (multiplier) 역할을 합니다.
테스트 설정 (The Test Setup)
모든 테스트는 다음과 같은 기본 설정을 갖춘 단일 **NVIDIA DGX Spark (GB10, SM121, 128 GB 통합 메모리)**에서 실행되었습니다:
- 모델 (Model):
Qwen3.5-122B-A10B-hybrid-int4-fp8(Intel AutoRound INT4 MoE 전문가 + FP8 밀집 공유 전문가 레이어) - 추론 엔진 (Inference engine): SM121용으로 컴파일된 vLLM 0.19.1
- 어텐션 백엔드 (Attention backend): FlashInfer
- MTP 가중치 패치 (MTP weights patch): Intel AutoRound 체크포인트에 필요 (아래 참조)
하이브리드 체크포인트는 주목할 만한 가치가 있습니다. MoE 전문가 가중치는 INT4로 양자화(Intel의 AutoRound 사용)된 반면, 밀집 공유 전문가 레이어(dense shared expert layers)는 공식 Qwen FP8 체크포인트의 FP8을 사용합니다. 이러한 하이브리드 접근 방식은 활용도가 높은 어텐션 레이어를 INT4로 양자화할 때 발생하는 정확도 손실을 방지합니다.
하이브리드 체크포인트를 위한 Albond 레시피 (Albond Recipe for Hybrid Checkpoint)
방법 1: N-Gram 추측적 디코딩 (Method 1: N-Gram Speculative Decoding)
개념 (Concept): N-Gram 매칭은 가능한 가장 단순한 추측적 디코딩 (speculative decoding) 방식이며, 수락률의 역학을 이해하는 데 가장 교육적인 방식입니다. 이 방식은 학습된 모델을 전혀 사용하지 않습니다. 대신, **현재 컨텍스트 윈도우 (current context window)**를 스캔하여 반복되는 토큰 n-gram을 찾고, 빈도 공생 (frequency co-occurrence)을 기반으로 연속된 토큰을 제안합니다.
vLLM에서의 추측 설정 (Speculative configuration in vLLM):
{
"method": "ngram",
"num_speculative_tokens": 5,
...
prompt_lookup_num_tokens는 룩업 키 (lookup key)를 형성하는 토큰의 수를 제어합니다. 알고리즘은 컨텍스트 내에서 마지막 N개의 토큰이 이전에 나타났던 모든 위치를 찾아내고, 그 뒤에 무엇이 왔는지를 제안합니다.
개방형 생성(open-ended generation)에서 실패하는 이유: N-gram 매칭은 출력이 입력에 비해 매우 반복적일 때(예: 모델이 프롬프트의 일부를 그대로 되풀이하거나 요약 작업을 수행할 때) 잘 작동합니다. 자유 형식의 생성(free-form generation)의 경우, 컨텍스트에 의미 있는 접두사 일치(prefix matches)가 없기 때문에 수락률(acceptance rate)이 급격히 떨어집니다.
docker run -it --name vllm-qwen35 \
--gpus all --net=host --ipc=host \
-v /home/krisitown/AI/models:/models \
...
결과: ~24–30 tok/s — 36–37 tok/s 기준치(baseline) 미만. 거부되는 토큰을 제안하는 데 드는 오버헤드(overhead)가 얻을 수 있는 이득보다 더 큽니다. N-Gram 추측적 디코딩(Speculative decoding)은 반복성이 매우 높거나 검색(retrieval) 비중이 높은 워크로드에서만 실용적입니다.
방법 2: MTP (Multi-Token Prediction)
개념: MTP는 근본적으로 다른 접근 방식입니다. 별도의 외부 초안 모델(draft model)을 사용하는 대신, MTP는 **타겟 모델과 함께 공동 학습되었으며 체크포인트의 일부로 제공되는 경량 헤드(lightweight head)**를 활용합니다. MTP 헤드는 타겟 모델의 내부 표현(internal representations)을 공유하며 타겟 모델 자체의 출력 분포와 일치하도록 최적화되었기 때문에, 수락률(acceptance rates)이 그 어떤 외부 초안 모델보다 훨씬 높습니다.
MTP 헤드는 메인 모델의 끝에 추가적인 트랜스포머 레이어(transformer layers)를 더하며, 이 레이어들은 메인 모델의 중간 은닉 상태(intermediate hidden states)를 사용하여 시퀀스의 다음 토큰을 예측하도록 보조 손실(auxiliary loss)과 함께 학습됩니다. 추론(inference) 과정에서 이 레이어들은 메인 모델이 이미 계산한 KV 캐시(KV cache)를 재사용하는 저비용의 초안 패스(drafting pass)로 동작합니다.
Intel AutoRound를 위한 MTP 가중치 패치:
Qwen3.5-122B를 위한 Intel AutoRound INT4 체크포인트는 MTP 가중치를 model_extra_tensors.safetensors(model_extra_tensors.safetensors, 785개 텐서, 약 4.8 GB BF16)에 포함하여 제공하지만, model.safetensors.index.json에는 이를 등록하지 않습니다. vLLM은 가중치를 찾기 위해 인덱스(index)를 읽기 때문에, 인덱스를 수동으로 패치(patch)하지 않으면 MTP 헤드(head)를 전혀 로드하지 않습니다. albond/DGX_Spark_Qwen3.5-122B-A10B-AR-INT4에 있는 레시피에는 785개의 모든 텐서 매핑을 등록하는 스크립트가 포함되어 있습니다:
python patches/02-mtp-speculative/add-mtp-weights.py \
--source "$INTEL_DIR" \
--target "$MODEL_DIR"
이 패치 없이는 --speculative-config를 추가하더라도 아무런 효과 없이 조용히 넘어갑니다.
vLLM 설정:
vllm serve /models/qwen35-122b-hybrid-int4fp8 \
--attention-backend FLASHINFER \
--speculative-config '{"method":"mtp","num_speculative_tokens":2}'
⚠️ MTP를 사용하려면
--attention-backend FLASHINFER가 필요합니다. PyTorch 백엔드는 vLLM ≤0.19 버전에서 MTP를 지원하지 않습니다.
num_speculative_tokens 튜닝:
추측 토큰(speculative tokens)의 수는 핵심적인 튜닝 파라미터(tuning parameter)입니다. 1개, 2개, 4개의 토큰으로 테스트한 결과 명확한 패턴이 나타났습니다:
num_speculative_tokens | 평균 tok/s | 최대 tok/s | 비고 |
|---|---|---|---|
| 0 (baseline) | ~36–37 | ~38 | Speculative decoding 미사용 |
| ... |
num_speculative_tokens=4에서의 성능 저하는 예상된 결과입니다. 추가되는 speculative token이 많아질수록 오류가 누적됩니다. 만약 위치 i에서 MTP head가 타겟 모델(target model)과 일치하지 않는다면, 이후의 모든 위치 i+1 ... K는 이미 틀린 상태가 됩니다. 따라서 이 토큰들을 생성한 후 폐기하는 데 드는 오버헤드가 처리량(throughput)을 저해합니다. 위치 4에서의 수락률(acceptance rate)은 50%대 초반으로 측정되었으며, 이는 네 번째 위치 토큰의 약 절반이 거부되었음을 의미합니다. 결과적으로 head 실행 + 검증(verification) + 토큰 수정(token correction)에 드는 오버헤드가 이득을 초과했습니다.
결과: MTP-2는 평균 ~49 tok/s, 최대 ~51 tok/s를 제공하며, 안정적이고 일관된 처리량으로 **베이스라인 대비 약 +32%**의 성능 향상을 보여줍니다.
방법 3: EAGLE3
개념: EAGLE3는 speculative decoding drafter인 EAGLE 제품군의 세 번째 반복 버전입니다. MTP와 달리, EAGLE drafter는 **별도로 학습된 모델(separately trained model)**입니다. 하지만 단순히 출력 토큰 임베딩(output token embeddings)에만 의존하는 것이 아니라, 타겟 모델의 **내부 은닉 상태(internal hidden states)**를 조건부로 사용함으로써 이를 보완합니다.
그 직관적인 원리는 다음과 같습니다. 만약 draft 모델이 현재 위치에서 타겟 모델의 중간 표현(intermediate representations)에 접근할 수 있다면, 다음 토큰을 생성하기 전에 타겟 모델이 계산하려 했던 내용의 대부분을 이미 "알고" 있는 상태가 됩니다. 이는 순수하게 외부적인 drafter와 비교했을 때 수락률(acceptance rate)을 극적으로 향상시킵니다.
EAGLE1/2 대비 EAGLE3의 아키텍처 변경 사항:
- 다층 은닉 상태 입력 (Multi-layer hidden state inputs): Drafter는 타겟 모델의 여러 레이어로부터 은닉 상태 (hidden states)를 소비합니다 (단순히 마지막 레이어만이 아닙니다). 이전 레이어들은 마지막 레이어가 로짓 분포 (logit distribution)로 압축해버리는 것보다 더 풍부한 의미론적 정보를 담고 있습니다.
- 다음 특징 예측 손실 제거 (Removal of next-feature prediction loss): EAGLE-2는 Drafter가 다음 토큰(next token)과 다음 은닉 상태(next hidden state)를 모두 예측하도록 학습되었습니다. EAGLE3는 은닉 상태 예측 보조 손실 (auxiliary loss)을 제거하여, 실제 목표를 위해 모델 용량 (model capacity)을 확보합니다.
- 추론 정렬 학습 데이터 증강 (Inference-aligned training data augmentation): 학습 과정에서 Drafter는 (정답 은닉 상태가 아닌) 자기 자신의 자기회귀적 롤아웃 (autoregressive rollouts)에 노출됩니다. 이를 통해 학습과 추론 사이의 분포 변화 (distribution shift)를 줄입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기


