TT Lab
블로그

한국어

시작하기
블로그

블로그

추측 디코딩: 맞히면 네 배, 못 맞히면 손해

상태: 초안 (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편). 그런데 한 걸음에 토큰 하나를 검사하든 다섯 개를 검사하든, 가중치를 읽는 양은 같습니다. 그렇다면 다음 토큰 몇 개를 싸게 짐작해 두고, 큰 모델에게 그 초안 전체를 한 걸음에 검증시키면 됩니다.

초안(싼 방법): " 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배 빨라졌다고 보고했습니다(초록 기준).

이득은 두 숫자로 정해집니다.

그래서 공식 문서도 추측 디코딩을 「중간 이하의 요청률, 메모리에 묶인 부하에서 토큰 간격을 줄이는 기능」이라고 소개합니다.

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. 직접 재 보기

방법

결과 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

결과 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. 출력과 비용

3-1. 2026-10-27 재측정: 대화 모델과 0.32.0

앞의 측정은 같은 말을 되풀이하는 재순위 모델이라 n-gram 에 유리했습니다. 대화용 Qwen3-0.6B(bf16)와 vLLM 0.32.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%

4. 언제 켜는가

5. 확인하지 못한 것

참고

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다