추측 디코딩은 왜 빨라지면서 답은 바뀌지 않나
← 전체 목차 · 이전: 배치 처리로 처리량을 올렸는데 왜 P99 꼬리 지연은 나빠지나 · 다음: 첫 글자 지연은 왜 주로 Prefill을 보나
가장 흔한 오답은 "더 작은 모델로 추론했으니 시스템 전체가 빨라졌다"이다. 이것이 틀린 이유는 추측 디코딩은 모델을 바꾸지 않기 때문이다.
목표 모델을 그대로 둔 채 투기(Speculate) + 검증(Verify) 두 동작으로 무손실 가속을 얻는다. 초안 모델은 가속기이지 대체품이 아니다.
추측 디코딩은 소형 초안 모델이 여러 후보 token을 빠르게 추측하게 하고, 목표 대형 모델이 한 번에 이 묶음을 검증한다. 검증을 통과한 것은 그대로 채택하고, 거부된 것만 대형 모델이 직접 생성한다.
정답의 근거는 한 문장이다: 검증 단계가 최종 출력과 대형 모델의 독립 생성이 완전히 일치함을 보장한다.
1단계 · 초안 생성(Draft)
- 목표 모델보다 파라미터가 훨씬 적은 소형 모델을 초안 모델로 고른다. 규모 기준: 목표 모델의 10분의 1 크기.
- 초안 모델이 자기회귀 방식으로 K개의 후보 token을 빠르게 생성한다.
- 이 단계는 거의 시간을 쓰지 않는다 — 초안 모델의 1회 추론은 목표 모델보다 한 자릿수 저렴하다.
2단계 · 일괄 검증(Verify)
입력: 사용자 입력(prompt) + 초안 모델이 준 K개 token
계산: 1회 순전파, 같은 Forward Pass 안에서 완료
판정: 「초안 token의 확률 분포」 vs 「목표 모델 자신의 확률 분포」를 자리별 대조
├─ 일치 → token 채택
└─ 첫 불일치 → 그 token 거부, 여기서 절단
이후는 목표 모델이 직접 이어서 생성
핵심은 **"한 번에"**이다. K개 후보를 하나씩 검증하는 것이 아니라 같은 Forward Pass에 붙여 일괄 계산하는 것 — 여기서 시간이 절약된다.
3단계 · 적중률이 가속 효과를 결정한다
| 시나리오 | 예측 가능성 | 실측 수용률 | 결과 |
|---|
| 코드 자동완성 | 강한 패턴: import os 다음은 높은 확률로 import sys | 80% 이상 | 대폭 가속 |
| 자연어 대화 | 사용자의 다음 말은 예측 불가능성이 높음 | 60% 수준 | 가속 효과 반감 |
수용률이 낮아지면 → 대부분의 추측이 거부되고 → 가속 효과가 깎이며 → 때로는 가속은커녕 초안 모델을 한 번 더 돌린 만큼 오히려 느려진다.
추측 디코딩은 "달면 빨라진다"가 아니라 음의 수익 구간이 있는 조건부 베팅이다.
4단계 · 왜 답이 바뀌지 않는가(무손실의 증명)
검증 = 목표 모델이 「자신의 확률 분포로」 초안 token을 재정(裁定)
↓
목표 모델이 동의하지 않는 token → 현장에서 거부 → 자신이 직접 생성
↓
최종 출력의 모든 token은 확률 분포 관점에서
「추측 디코딩이 없을 때 목표 모델이 하나씩 생성한」 시퀀스와 완전히 등가
↓
출력 품질 = 목표 모델의 원래 품질, 다만 더 빠를 뿐
요점: 재정권이 처음부터 끝까지 목표 모델의 손에 있다. 초안 모델에는 제안권만 있고 결정권이 없다. 그래서 "무손실"은 엔지니어링적으로 비슷하다는 뜻이 아니라 확률 분포 층위의 등가다.
답변 템플릿
추측 디코딩의 핵심은 소형 초안 모델이 후보 token을 투기 생성하고, 대형 목표 모델이 하나의 Forward Pass 안에서 일괄 검증하는 것이다. 통과한 것은 채택하고, 통과하지 못한 것은 버린 뒤 대형 모델이 직접 보완한다.
K 값과 초안 모델의 적중률이 두 개의 핵심 튜닝 파라미터다.
- 적중률이 높은 시나리오(코드 자동완성)는 K = 5 또는 6으로 대폭 가속할 수 있다.
- 적중률이 낮은 개방형 대화 시나리오는 K 값을 낮추거나 심지어 추측 디코딩을 자동으로 끄고 지연 역손실을 피해야 한다.
반면교사: K를 상수로 박은 팀
0. 오프라인 벤치마크에서 적중률을 한 번 측정 → HIT_RATE = 0.8
1. 이를 근거로 K를 정하고 전역 정적 설정으로 하드코딩 (K_VALUE = 5, 영원히 갱신 없음)
2. 출시 후 사용자 입력 분포가 바뀜
3. 적중률이 80%에서 30%로 하락
4. 초안 모델의 추측이 거의 전부 거부됨
5. 초안 추론을 한 번 더 돌린 만큼 → 엔드투엔드 지연이 오히려 길어짐
6. 팀은 여전히 예전 K로 돌리고 있고, 「가속이 이미 감속으로 바뀐 것」을 아무도 발견하지 못함
추측 디코딩의 가속은 동적이다 — K와 초안 모델은 실제 트래픽의 적중률을 따라가야 한다.
핵심 통찰
- "무손실"의 원천은 유사도가 아니라 재정권이다 — 최종 token 하나하나를 목표 모델이 자신의 확률 분포로 재정했기 때문에 출력이 바뀌지 않는다고 말할 수 있다. 초안 모델에는 제안권만 있다. "소형 모델의 출력을 그대로 통과시키는" 방안은 추측 디코딩이 아니며 무손실이라 부를 자격도 없다.
- 추측 디코딩이 최적화하는 것은 "직렬 단계 수"이지 "단일 단계 연산력"이 아니다 — 초안 모델이 한 자릿수 저렴한 것도 있지만, 진짜 수익은 목표 모델이 K개 token을 같은 Forward Pass에 넣어 한 번에 계산하는 데 있다. K번의 직렬 디코딩을 1번으로 압축하는 것이며, memory-bound인 자기회귀 디코딩에 효과적인 이유다.
- 적중률이 이 메커니즘의 유일한 기축통화다 — 수용률이 "한 번의 검증으로 몇 개의 token을 현금화하는지"를 결정하고, 가속비는 거의 전적으로 여기에 좌우된다. 추측 디코딩을 논하면서 수용률을 논하지 않는 것은 캐시를 논하면서 적중률을 논하지 않는 것과 같다.
- 추측 디코딩에는 음의 수익 구간이 존재한다 — 틀렸을 때 초안 추론에 쓴 그 한 번의 오버헤드는 회수할 수 없고 엔드투엔드 지연은 순증한다. "달면 이득"인 최적화가 아니라 적중률이 손익분기점보다 높아야 한다는 조건이 붙은 베팅이다.
- 가속비는 시나리오의 "예측 가능성"과 강하게 연동된다 — 코드 자동완성은
import os → import sys 같은 강한 패턴이 있어 수용률 80%+, 개방형 대화는 60% 수준이다. 같은 코드가 다른 트래픽에서 두 배까지 수익이 차이 날 수 있으므로 오프라인 결론을 시나리오를 넘어 옮길 수 없다.
- 동적인 양을 정적 설정으로 고착시키는 것이 이런 최적화의 가장 전형적인 실패 방식이다 — K는 트래픽에 따라 표류하는 양이므로 전역 상수로 쓰는 것은 "분포가 영원히 변하지 않는다"고 가정하는 것과 같다. 분포가 바뀌면 시스템은 조용히 가속에서 감속으로 퇴화한다. 에러도 알람도 없이 지연 곡선만 오른다.
- 좋은 가속 방안은 "자기 자신을 끄는" 능력을 갖춰야 한다 — 적중률이 임계값 아래로 떨어지면 자동으로 K를 낮추거나 추측 디코딩을 끄는 편이 버티고 돌리는 것보다 값지다. 퇴화 가능성이 가속 기능의 합격선이다.
- 이런 문제는 메커니즘 층과 운영 층 두 겹으로 답해야 한다 — 메커니즘 층(투기/검증/등가성)은 입장권일 뿐이고, 운영 층(적중률, K 튜닝, 모니터링과 롤백)이 해본 사람과 안 해본 사람을 가른다.
엔지니어링 실전 Tips
- K는 변수이지 상수가 아니다:
const K_VALUE = 5 같은 작성 자체가 버그의 온상이다. K는 핫 업데이트 가능한 설정이나 적응형 전략에서 와야지 코드에 컴파일되면 안 된다.
- 오프라인 1회 측정 ≠ 프로덕션 장기 결론: 반면교사의 팀은 오프라인 벤치마크에서 한 번만 측정했다. 트래픽 분포는 변하므로 측정은 상시화되어야 한다.
- 등가를 먼저 증명하고 나서 속도를 논할 것: 무손실이 추측 디코딩의 존립 근거다. 출시 전에 "추측 디코딩을 끈" 출력으로 등가성 회귀를 반드시 돌릴 것. 그렇지 않으면 가속과 함께 은밀한 품질 사고를 얻는다.
- "한 번 더 돌린" 비용에 주목할 것: 거부 시 초안 추론의 오버헤드는 매몰 비용이다. 수익 평가에서 계산할 것은 순수익(절약한 목표 모델 직렬 단계 − 초안 모델 오버헤드)이지 총 가속비가 아니다.
- 시나리오별로 등급을 나눠 설정할 것: 같은 서비스 안에서도 코드 자동완성 요청과 개방형 대화 요청은 다른 K를 쓰거나 한쪽은 켜고 한쪽은 꺼야지, 전역 파라미터를 공유해서는 안 된다.
- 자동 종료를 일급 시민으로: "추측 디코딩을 끄는 것"을 장애 처치 수단이 아니라 정상 운행 상태 중 하나로 만들어야, 적중률이 무너질 때 시스템이 스스로 안전 경로로 돌아온다.
- 모니터링은 두 곡선을 함께 볼 것: 가속비만 보면 스스로를 속인다(분모도 변하고 있다). 실시간 적중률과 엔드투엔드 지연을 함께 놓아야 "가속이 감속으로 바뀐" 순간을 즉시 잡을 수 있다.