상태: 초안 (2026-10-27), n-gram 실측, EAGLE·MTP·suffix 미실측. 8GB급 노트북 GPU(Ada 세대) 한 장, vLLM 0.31.0, Qwen3-Reranker-0.6B 로 2026-10-27 에 쟀습니다. 모델 기반 방식(EAGLE, MTP, 초안 모델)은 초안 가중치를, suffix 방식은 추가 패키지를 새로 받아야 해서 이번에는 재지 않았습니다. 2026-10-27 추가. 대화용 Qwen3-0.6B 와 vLLM 0.32.0 으로 다시 잰 결과를 3-1절에 더했습니다. 0.31.0·재순위 모델의 수치는 그대로 두었습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
- 1. 원리: 짐작하고, 한 번에 확인한다
- 2. vLLM 의 초안 방법들
- 3. 직접 재 보기
- 3-1. 2026-10-27 재측정: 대화 모델과 0.32.0
- 4. 언제 켜는가
- 5. 확인하지 못한 것
- 참고
1. 원리: 짐작하고, 한 번에 확인한다
디코드 한 걸음은 가중치를 메모리에서 한 번 읽는 데 대부분의 시간을 씁니다(2편). 그런데 한 걸음에 토큰 하나를 검사하든 다섯 개를 검사하든, 가중치를 읽는 양은 같습니다. 그렇다면 다음 토큰 몇 개를 싸게 짐작해 두고, 큰 모델에게 그 초안 전체를 한 걸음에 검증시키면 됩니다.
초안(싼 방법): " keeps a queue of" ← 4토큰 제안
검증(큰 모델 한 걸음): " keeps" ✓ " a" ✓ " queue" ✓ " of" ✓ + 다음 토큰 하나
→ 한 걸음에 5토큰 확정
첫 번째 틀린 토큰에서 멈추고, 그 자리는 큰 모델이 고른 토큰으로 바꿉니다. 그래서 한 걸음에 적어도 한 토큰은 늘 얻습니다. 표본 추출(온도 > 0)에서는 거절 표본 추출(rejection sampling)로 큰 모델 혼자 만든 것과 같은 분포를 지키고, 탐욕 디코딩에서는 출력이 같아야 합니다. Leviathan 외(ICML 2023)는 T5-XXL 에서 출력을 바꾸지 않고 2~3배, Chen 외(DeepMind, 2023)는 Chinchilla 70B 에서 분산 환경 2배에서 2.5배 빨라졌다고 보고했습니다(초록 기준).
이득은 두 숫자로 정해집니다.
- 수락 길이: 한 걸음에 평균 몇 토큰을 확정하는가. 초안이 잘 맞을수록 길어집니다.
- 검증 걸음의 비용: 초안 k개를 함께 검사하는 걸음이 보통 걸음보다 얼마나 비싼가. GPU 에 남는 계산이 있을 때(배치가 작을 때)는 거의 같지만, 배치가 커서 GPU 가 이미 바쁘면 k개를 더 검사하는 만큼 걸음이 길어집니다.
그래서 공식 문서도 추측 디코딩을 「중간 이하의 요청률, 메모리에 묶인 부하에서 토큰 간격을 줄이는 기능」이라고 소개합니다.
2. vLLM 의 초안 방법들
| 방법 | 초안을 만드는 것 | 준비물 | 문서의 평가(정성) | 논문이 보고한 값(초록 기준) |
|---|---|---|---|---|
n-gram(ngram, ngram_gpu) |
프롬프트와 지금까지의 출력에서 같은 토큰 열을 찾아 그 뒤를 베낌 | 없음 | 낮은 요청률에서 낮음~중간 | 프롬프트 조회 디코딩: A100 한 장, Mistral-7B, 요약·문맥 QA 에서 평균 2.4배 |
suffix(suffix) |
프롬프트와 이전 요청들의 출력으로 접미사 트리를 만들어, 빈도로 길이를 바꿔 가며 제안 | arctic-inference 패키지 |
낮음~중간, 반복이 많은 작업에 강함 | SuffixDecoding: 에이전트 작업(SWE-Bench, Text-to-SQL)에서 최대 5.3배 |
EAGLE·EAGLE-3(eagle, eagle3) |
큰 모델의 은닉 상태를 받아 다음 토큰을 내는 작은 머리 | 학습된 초안 머리 | 높음 | EAGLE: LLaMA2-Chat 70B 에서 2.7~3.5배. EAGLE-3: 최대 6.5배 |
MTP(mtp 등) |
모델이 원래 갖고 있는 다중 토큰 예측 머리 | MTP 를 가진 모델(DeepSeek-V3, Qwen3.5 등) | 높음 | |
초안 모델(draft_model) |
같은 어휘의 작은 모델 | 작은 모델 | 높음 |
설정은 하나의 JSON 으로 줍니다.
vllm serve <모델> --speculative-config '{"method":"ngram","num_speculative_tokens":4,"prompt_lookup_min":2,"prompt_lookup_max":5}'
n-gram 의 prompt_lookup_max·min 은 찾을 토큰 열의 길이 범위이고, 둘 다 생략하면 5 입니다. 0.32.0 에서는 Model Runner V2 에 길이가 바뀌는 GPU n-gram 제안기가 들어왔습니다. 0.31.0 에는 ngram_gpu 가 이미 선택지에 있었지만, 실측에서는 두 방법 모두 「Model Runner V2 가 아직 이 방법을 지원하지 않아 V1 실행기를 쓴다」는 경고를 냈습니다. CPU 판 ngram 은 「비동기 스케줄을 끈다」는 경고도 냈습니다.
함께 못 쓰는 기능도 있습니다. 0.32.0 문서의 호환 표에서 추측 디코딩은 LoRA, 풀링 모델, 프롬프트 임베딩 입력과 함께 쓸 수 없고, min_p 와 logit_bias 는 무시된다는 경고가 로그에 찍혔습니다.
3. 직접 재 보기
방법
- 환경: 8GB급 노트북 GPU(Ada 세대) 한 장, vLLM 0.31.0, Qwen3-Reranker-0.6B(bf16).
- 작업 셋. 모두 출력 256토큰,
ignore_eos.- 베끼기: 직접 쓴 영어 문단과 파이썬 함수 하나(약 300토큰)를 주고 「그대로 두 번 베껴라」. 탐욕 디코딩. 출력이 입력과 거의 같아 n-gram 이 가장 잘 맞는 경우입니다.
- 단어 잇기: 30개 단어를 무작위로 이은 200단어를 주고 이어 쓰게 함. 탐욕 디코딩. 이 모델은 같은 말을 되풀이하는 경향이 강해, 출력이 입력의 단어를 다시 쓰는 일이 많습니다.
- 무작위 출력: 어휘 전체에서 무작위로 뽑은 200토큰을 주고 온도 1.0 으로 생성. 겹침이 가장 적을 것으로 기대한 경우입니다. 같은 시드를 써서 서버가 달라도 같은 프롬프트를 받습니다.
- 서버: 기본(추측 없음), n-gram 제안 2·4·8개, GPU n-gram 제안 4개. 조회 길이 2~5.
- 반복: 조건마다 네 묶음(첫 묶음 예열), 높은 동시성은 세 묶음. 수락률은 묶음 앞뒤의
vllm:spec_decode_num_accepted_tokens_total과..._draft_tokens_total차이로 셌습니다.
결과 1. 혼자 쓸 때: 베끼면 네 배에서 여섯 배
| 작업(동시 1) | 기본 | n-gram k=2 | n-gram k=4 | n-gram k=8 | GPU n-gram k=4 |
|---|---|---|---|---|---|
| 베끼기, tok/s | 176.4 | 427.5(2.4배) | 704.1(4.0배) | 1,117.0(6.3배) | 669.5(3.8배) |
| 베끼기, 수락률 | 97.7% | 99.0% | 95.8% | 95.3% | |
| 단어 잇기, tok/s | 175.6 | 524.7(3.0배) | 515.8(2.9배) | ||
| 단어 잇기, 수락률 | 90.8% | 67.9% |
k=4 는 서버를 두 번 따로 띄워 쟀고(692.6, 704.1 tok/s) 거의 같은 값을 냈습니다. 베끼기에서 제안을 8개로 늘리면 초안 8개 중 평균 7.7개가 맞아, 큰 모델이 덧붙이는 한 토큰까지 한 걸음에 약 8.7토큰을 확정했습니다. 그런데 처리량은 8.7배가 아니라 6.3배였습니다. 9토큰을 한꺼번에 검증하는 걸음이 보통 걸음(5.7ms)보다 약 1.4배(7.8ms) 길었다는 뜻입니다. 가중치 읽기는 한 번이어도 검증할 토큰이 늘면 계산과 어텐션이 늘어납니다.
「단어 잇기」도 세 배 빨라진 것은 이 모델이 같은 단어를 되풀이하기 때문입니다(예: signal river meadow signal river meadow …). 일반 대화 모델에서는 이렇게 맞지 않을 것입니다.
결과 2. 무작위 출력: 프롬프트마다 갈렸다
온도 1.0 의 무작위 출력은 프롬프트마다 결과가 크게 달라 묶음별로 적습니다(동시 1, tok/s).
| 프롬프트 | 기본 | k=2 | k=4(수락) | k=8 |
|---|---|---|---|---|
| 1 | 171.4 | 242.4 | 237.6(113/430) | 397.6 |
| 2 | 171.3 | 384.0 | 596.5(202/208) | 914.2 |
| 3 | 171.4 | 149.2 | 153.6(22/175) | 139.9 |
- 프롬프트 2 는 무작위 프롬프트였는데도 모델이 곧 같은 말을 되풀이해서 수락률이 97% 였습니다.
- 프롬프트 3 은 모든 k 에서 기본보다 느렸습니다(-13%, -10%, -18%). k=4 에서 제안 175개 중 22개만 맞았습니다. 맞지 않는 초안도 검증 걸음을 무겁게 하고, n-gram 을 찾는 일도 시간이 듭니다. 제안을 많이 할수록(k=8) 손해가 커졌습니다.
결과 3. 동시성을 올리면 이득이 줄고, 무작위 출력은 손해
| 작업 | 동시 | 기본 tok/s | n-gram k=4 tok/s | 비 | 수락률 |
|---|---|---|---|---|---|
| 베끼기 | 8 | 1,124.6 | 2,860.6 | 2.54 | 97.1% |
| 베끼기 | 32 | 2,868.7 | 4,042.9 | 1.41 | 83.4% |
| 단어 잇기 | 8 | 1,089.7 | 2,478.3 | 2.27 | 92.1% |
| 무작위 단어 입력, 부하 시험(2편과 같은 조건) | 16 | 1,683.1 | 2,436.5 | 1.45 | |
| 무작위 단어 입력, 부하 시험 | 64 | 2,899.3 | 3,267.8 | 1.13 | |
| 무작위 출력 | 8 | 1,072.0 | 950.4 | 0.89 | 58.2% |
| 무작위 출력 | 32 | 2,590.8 | 2,239.8 | 0.86 | 51.4% |
배치가 커지면 GPU 가 이미 바빠서 검증할 토큰이 늘어나는 만큼 걸음이 길어집니다. 수락률이 높은 베끼기도 동시 32 에서는 이득이 1.41배로 줄었고, 수락률이 절반쯤인 무작위 출력은 동시 8 과 32 에서 11~14% 손해였습니다. 문서의 「높은 요청률에서는 이득이 줄어든다」는 설명이 숫자로 보입니다.
결과 4. 출력과 비용
- 탐욕 출력의 같음: 고정 프롬프트 열두 개(베끼기 6, 단어 잇기 6)를 탐욕 디코딩으로 128토큰씩 만들었더니 n-gram k=4 서버의 출력은 기본 서버와 10개가 글자까지 같았고, 단어 잇기 2개가 달랐습니다. 문서는 추측 디코딩이 알고리즘상 손실이 없지만 검증 걸음이 여러 토큰을 한 번에 계산하면서 생기는 부동소수점 차이로 출력이 달라질 수 있다고 적습니다. 실측이 그 경고와 같았습니다.
- KV 자리: 추측 디코딩 서버는 KV 자리가 40,208토큰에서 30,832토큰으로 23% 줄었습니다. 같은 경고(V1 실행기로 돌아감)와 함께 메모리 측정이 달라진 것으로 보이며, 원인은 미확인입니다. KV 가 빠듯한 서버라면 켜기 전에 이 줄을 확인해야 합니다.
- 기동 시간: 추측 디코딩 서버는 준비까지 78초와 96초가 걸려, 컴파일 캐시가 맞은 기본 서버(약 32초)보다 오래 걸렸습니다.
- 위치별 수락:
vllm:spec_decode_num_accepted_tokens_per_pos_total은 초안의 몇 번째 토큰이 맞았는지를 따로 셉니다. k=4 서버의 전체 기록에서 첫째부터 넷째까지 84.2%, 79.4%, 77.0%, 74.7% 였고, 한 걸음에 평균 4.15토큰을 확정했습니다. 뒤로 갈수록 떨어지는 이 곡선이 k 를 고르는 근거가 됩니다.
3-1. 2026-10-27 재측정: 대화 모델과 0.32.0
앞의 측정은 같은 말을 되풀이하는 재순위 모델이라 n-gram 에 유리했습니다. 대화용 Qwen3-0.6B(bf16)와 vLLM 0.32.0 으로 다시 쟀습니다. 작업은 넷입니다.
- 베끼기: 앞과 같음(원시 프롬프트, 탐욕, 256토큰 고정).
- 코드 돌려주기: 채팅 형식으로 「이 파이썬 함수에서 변수 budget 을 token_budget 으로 바꿔 함수 전체를 코드 블록으로만 돌려 달라」. 탐욕, 자연 종료.
- 설명하기: 「긴 프롬프트 하나가 공유 언어 모델 서버의 다른 사용자를 왜 느리게 하는지 짧은 세 문단으로」. 탐욕, 자연 종료. 입력을 되풀이할 일이 거의 없는 작업입니다.
- 무작위 출력: 앞과 같음(무작위 토큰 200개, 온도 1.0).
| 작업 | 동시 | 기본 tok/s | n-gram k=4 tok/s | 비 | 수락률 |
|---|---|---|---|---|---|
| 베끼기 | 1 | 176.3 | 656.0 | 3.72 | 87.3% |
| 코드 돌려주기 | 1 | 177.7 | 544.2 | 3.06 | 69.7% |
| 코드 돌려주기 | 8 | 1,288.6 | 3,252.8 | 2.52 | 69.7% |
| 설명하기 | 1 | 178.6 | 173.9 | 0.97 | 3.0% |
| 설명하기 | 8 | 1,163.5 | 1,141.5 | 0.98 | 3.6% |
| 무작위 출력 | 1 | 171.9 | 197.3 | 1.15 | 13.0% |
| 무작위 출력 | 8 | 1,074.7 | 961.9 | 0.90 | 18.0% |
- 자기 말로 쓰는 답에서는 n-gram 이 거의 맞지 않았습니다. 설명하기의 수락률은 3% 였고 처리량은 3% 줄었습니다. 손해가 작은 것은 맞는 n-gram 을 못 찾으면 초안을 내지 않는 걸음이 많기 때문입니다(제안 1,188개, 재순위 모델의 무작위 출력보다 훨씬 적음).
- 코드 돌려주기는 세 배 빨라졌습니다. 다만 이 0.6B 모델은 이름을 바꾸라는 지시를 따르지 않고 함수를 그대로 돌려줬습니다. 그래서 이 값은 「거의 그대로 베낀 출력」의 경우입니다. 실제로 몇 줄을 고친 출력이라면 고친 자리마다 초안이 틀려 이득이 이보다 작을 것입니다(미실측).
- 탐욕 출력은 12개 모두 기본 서버와 글자까지 같았습니다. 0.31.0·재순위 모델에서는 12개 중 10개였습니다.
- 0.32.0 에서는 KV 자리가 거의 줄지 않았습니다. 0.31.0 에서는 추측 디코딩 서버의 KV 가 23% 줄었고 「V1 실행기로 돌아간다」는 경고가 있었습니다. 0.32.0 은 로그에 「Using V2 Model Runner」가 찍혔고 KV 는 38,224토큰에서 37,456토큰으로 2% 만 줄었습니다. 앞에서 미확인으로 둔 23% 감소는 V1 실행기로 돌아간 것과 관련이 있다고 추정합니다. 「비동기 스케줄을 끈다」는 경고는 0.32.0 에도 그대로 있었습니다.
4. 언제 켜는가
- 출력이 입력을 되풀이하는 작업(코드 수정, 문서 교정, 요약에서 문장 인용, 에이전트의 반복 호출)은 n-gram 만으로도 큰 이득입니다. 준비물이 없어 바로 켤 수 있습니다.
- 일반 대화에서 응답 속도를 줄이려면 EAGLE·MTP 같은 모델 기반 방법이 맞습니다. 그 모델용으로 학습된 초안 머리가 있어야 합니다(미실측).
- 처리량이 목표인 높은 동시성 서버에서는 이득이 줄고, 수락률이 낮으면 손해입니다. 켜기 전후의 처리량을 실제 부하로 재야 합니다. 0.32.0 의 동적 추측 디코딩처럼 부하에 따라 제안 길이를 바꾸는 기능은 이 문제를 겨냥합니다(미실측).
- 켰다면
vllm:spec_decode_num_accepted_tokens_total ÷ vllm:spec_decode_num_draft_tokens_total을 대시보드에 두고, 위치별 수락으로 k 를 맞춥니다.
5. 확인하지 못한 것
- EAGLE·EAGLE-3·MTP·초안 모델·suffix 는 초안 가중치나
arctic-inference패키지를 새로 받아야 해서 미실측입니다. - 일반 대화 모델의 n-gram 수락률은 3-1절에서 0.6B 하나로만 쟀습니다. 실제로 몇 줄을 고치는 코드 편집 출력은 미실측입니다.
- 0.31.0 에서 추측 디코딩 서버의 KV 자리가 23% 줄어든 원인은 V1 실행기로 돌아간 것과 관련이 있다고 추정할 뿐 확인하지 못했습니다(0.32.0 에서는 2% 감소).
참고
- vLLM 문서, Speculative Decoding, N-Gram, Suffix Decoding, EAGLE(0.31.0·0.32.0 동일): https://docs.vllm.ai/en/latest/features/speculative_decoding/
- Leviathan 외, 「Fast Inference from Transformers via Speculative Decoding」, ICML 2023. https://arxiv.org/abs/2211.17192
- Chen 외, 「Accelerating Large Language Model Decoding with Speculative Sampling」, 2023. https://arxiv.org/abs/2302.01318
- Li 외, 「EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty」, ICML 2024. https://arxiv.org/abs/2401.15077
- Li 외, 「EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test」, 2025. https://arxiv.org/abs/2503.01840
- Oliaro 외, 「SuffixDecoding: Extreme Speculative Decoding for Emerging AI Applications」, 2024. https://arxiv.org/abs/2411.04975
- Saxena, 「Prompt Lookup Decoding」, 2023. https://github.com/apoorvumang/prompt-lookup-decoding