Speculative Decoding 핵심 원리: LLM은 왜 여러 토큰을 한 번에 생성할 수 있을까
LLM 추론에서 가장 중요한 병목은 다음 토큰을 하나씩 확정해야 한다는 점이다. Transformer는 학습 단계에서 여러 토큰을 병렬로 처리할 수 있지만, 생성 단계에서는 앞에서 생성된 토큰이 정해져야 다음 토큰의 확률분포를 계산할 수 있다. 이 방식을 autoregressive decoding이라고 부른다.
Speculative decoding은 이 순차적 병목을 우회하기 위해 나온 방법이다. 작은 예측자가 여러 토큰 후보를 먼저 만들고, 큰 모델이 그 후보들을 한 번에 검증한다. 후보가 target model의 분포와 잘 맞으면 여러 토큰을 한 번에 확정한 것과 같은 효과를 얻고, 맞지 않으면 확률적으로 보정해 target model이 단독으로 생성했을 때의 분포를 유지한다.
그림 1. 작은 draft model이 후보 토큰을 만들고, 큰 target model이 후보를 검증하는 기본 구조.
이 글은 1편이다. 적용 방법과 모델별 특징을 모두 다루기 전에, speculative decoding이 정확히 어떤 문제를 풀고 어떤 원리로 동작하는지부터 정리한다. 핵심은 draft, target, verify, accept, reject 다섯 단어다.
1. LLM은 왜 한 토큰씩 생성하는가
LLM은 문장을 한 번에 완성하지 않는다. 이미 주어진 토큰 시퀀스를 보고 다음 토큰의 확률분포를 계산한 뒤, 그중 하나를 선택한다. 선택된 토큰은 다시 입력 뒤에 붙고, 모델은 새 prefix를 기준으로 다음 토큰을 계산한다.
예를 들어 오늘 날씨가라는 prefix가 있으면 모델은 다음 토큰 후보에 확률을 준다. 좋, 맑, 흐 같은 후보가 있을 수 있다. 여기서 하나가 선택되어 오늘 날씨가 좋이 되면, 그 다음 step에서야 다, 고, 은 같은 다음 후보를 계산할 수 있다.
이 구조에서는 100개 토큰을 만들려면 원칙적으로 100번의 decoding step이 필요하다. KV cache가 있어 이전 토큰의 key와 value를 다시 계산하지 않더라도, 새 토큰 하나를 확정하기 위해 큰 모델의 forward pass가 한 번 필요하다.
Transformer 구조의 기반이 된 Attention Is All You Need는 attention을 통해 시퀀스 내부 의존성을 효율적으로 계산하는 방법을 제시했다. 하지만 autoregressive 생성에서는 미래 토큰을 이미 알고 있다고 가정할 수 없다. 다음 토큰은 이전 토큰이 정해진 뒤에야 의미가 생긴다.
2. 병목은 계산량만의 문제가 아니다
LLM 추론이 느린 이유를 단순히 FLOPs로만 보면 핵심을 놓치기 쉽다. 큰 모델은 매 decoding step마다 거대한 weight를 읽고, activation을 계산하고, KV cache를 갱신한다. 특히 batch가 작고 사용자 응답 latency가 중요한 환경에서는 GPU 연산 유닛을 항상 꽉 채우기 어렵다.
이때 target model은 매우 비싼 계산 장치처럼 동작한다. 문제는 이 비싼 장치를 한 번 호출할 때 토큰 하나만 확정하는 경우가 많다는 점이다. 모델의 품질은 target model이 책임져야 하지만, 매 step마다 target model 전체를 한 토큰 검증에만 쓰는 것은 비효율적이다.
Speculative decoding의 출발점은 이 관찰이다. 다음 토큰 생성 자체는 순차적이지만, 여러 개의 후보 경로를 먼저 만들어 두고 큰 모델이 한 번에 평가할 수 있다면 target model 호출당 확정 토큰 수를 늘릴 수 있다.
3. 연구자들이 던진 질문
핵심 질문은 단순하다.
큰 모델을 매번 한 토큰 생성에만 쓰지 않고, 여러 후보 토큰을 한 번에 검증하게 만들 수 없을까.
이 질문은 LLM 시대에 갑자기 생긴 것이 아니다. Blockwise Parallel Decoding for Deep Autoregressive Models는 autoregressive model에서 여러 위치의 후보를 병렬로 예측하고 검증하는 방향을 제시했다. 순차 생성의 제약을 완전히 없애지는 못하지만, 여러 토큰을 block 단위로 다루려는 시도였다.
LLM 규모가 커지면서 같은 문제가 더 중요해졌다. Fast Inference from Transformers via Speculative Decoding은 작은 draft model이 후보를 만들고 큰 target model이 후보를 검증하는 구조를 정리했다. Accelerating Large Language Model Decoding with Speculative Sampling은 sampling 상황에서도 target model의 분포를 보존하면서 속도를 높이는 절차를 제시했다.
이 흐름에서 중요한 점은 속도와 품질의 단순한 교환이 아니다. 목표는 target model의 출력 분포를 유지하면서 target model을 호출하는 횟수 또는 target model 호출당 낭비를 줄이는 것이다.
4. 가장 작은 예제로 보는 기본 구조
가장 단순한 speculative decoding은 두 모델을 둔다.
- Draft model: 작고 빠른 모델이다. 여러 개의 후보 토큰을 먼저 생성한다.
- Target model: 실제 품질을 책임지는 큰 모델이다. draft model이 제안한 후보를 검증한다.
현재 prefix가 A라고 하자. Draft model은 앞으로 올 토큰 후보를 세 개 만든다.
prefix: A
Draft proposal: x1, x2, x3
일반적인 decoding이라면 target model은 x1을 만들기 위해 한 번, x2를 만들기 위해 한 번, x3를 만들기 위해 한 번 호출되어야 한다. 하지만 speculative decoding에서는 target model이 A x1 x2 x3 전체를 입력으로 보고 각 위치의 다음 토큰 분포를 한 번에 계산한다.
이때 target model은 다음 내용을 동시에 평가한다.
A다음에x1이 그럴듯한가A x1다음에x2가 그럴듯한가A x1 x2다음에x3가 그럴듯한가
Transformer는 입력 시퀀스의 여러 위치에 대한 logits를 병렬로 계산할 수 있다. 이 성질 때문에 draft 후보를 한 번에 검증할 수 있다. 생성은 순차적이지만 검증은 병렬화할 여지가 있다.
그림 2. 후보 생성, 병렬 검증, accept-reject, 보정 샘플링의 반복 흐름.
5. Draft model은 왜 필요한가
Draft model은 정답을 맞히는 보조 모델이 아니다. 역할은 그럴듯한 후보를 싸게 만드는 것이다. Target model보다 훨씬 빠르게 몇 개의 토큰을 먼저 제안하고, 비싼 target model은 그 후보를 검증하는 데 집중한다.
좋은 draft model의 조건은 두 가지다.
- Target model보다 충분히 빠르다.
- Target model과 비슷한 토큰 분포를 낸다.
첫 번째 조건만 만족하면 속도 이득이 나지 않는다. Draft model이 아무리 빨라도 후보가 target model과 자주 다르면 reject가 자주 발생한다. 그러면 target model 한 번으로 확정되는 토큰 수가 줄어든다.
두 번째 조건만 만족해도 충분하지 않다. Draft model이 target model과 거의 비슷하지만 크기도 비슷하다면 후보 생성 비용이 너무 커진다. Speculative decoding의 이득은 draft 생성 비용이 작고, accept되는 후보가 충분히 많을 때 나온다.
6. Target model은 무엇을 검증하는가
Target model은 draft token이 문법적으로 자연스러운지만 보는 것이 아니다. Target model이 단독으로 다음 토큰을 생성했을 때의 확률분포와 draft model이 제안한 확률분포를 비교한다.
이 차이가 중요하다. Speculative decoding은 작은 모델이 쓴 초안을 큰 모델이 맞춤법 검사하는 방식이 아니다. 큰 모델의 확률분포를 기준으로 draft token을 그대로 받아들일 수 있는지 판단하는 방식이다.
Target model이 어떤 토큰에 높은 확률을 주고 draft model도 그 토큰을 제안했다면 accept될 가능성이 커진다. Target model이 낮은 확률을 주는 토큰을 draft model이 강하게 밀었다면 reject될 가능성이 커진다.
따라서 target model은 최종 품질의 기준이다. Draft model은 최종 답을 결정하지 않는다. 최종 출력은 target model의 분포를 따르도록 설계된다.
7. Accept는 정답 채점이 아니다
Speculative decoding에서 accept라는 단어는 오해를 부르기 쉽다. Accept는 draft model이 target model의 argmax를 맞혔다는 뜻만은 아니다. Sampling 상황에서는 더 정확히 말해 target 분포를 보존하기 위한 확률적 수락 절차다.
Draft model의 분포를 q, target model의 분포를 p라고 하자. Draft model이 어떤 토큰 t를 제안했을 때, target model이 그 토큰을 draft model보다 더 그럴듯하게 보거나 비슷하게 본다면 그 토큰은 높은 확률로 accept된다. 반대로 draft model이 과하게 확신했지만 target model은 낮게 본다면 accept 확률이 낮아진다.
핵심은 p와 q의 관계다. Draft model이 target model과 비슷할수록 p와 q가 가까워지고, accept가 많이 일어난다. 두 분포가 멀어질수록 reject가 늘어난다.
이 절차 때문에 speculative decoding은 단순한 근사 추론과 다르다. 단순히 작은 모델의 출력을 더 많이 쓰는 방식이라면 품질이 draft model 쪽으로 끌려간다. Speculative decoding은 accept와 reject, 보정 샘플링을 통해 target model의 분포를 유지하려고 한다.
8. Reject가 발생하면 무엇을 하는가
Reject가 발생하면 그 뒤의 draft 후보는 버린다. 앞의 토큰 하나가 바뀌면 그 이후의 조건부 분포도 달라지기 때문이다. Autoregressive model에서 A x1 다음의 분포와 A y1 다음의 분포는 같은 문제가 아니다.
Reject 이후에는 target model의 분포에서 draft model이 이미 과하게 제안한 부분을 보정한 분포로 토큰을 하나 샘플링한다. 이 보정 절차가 있어야 전체 결과가 target model 단독 샘플링과 같은 분포를 갖는다.
직관적으로 보면 다음과 같다.
- Draft model이 제안했고 target model도 동의한 부분은 그대로 통과시킨다.
- Draft model이 너무 강하게 주장했지만 target model은 동의하지 않은 부분은 거절한다.
- 거절된 자리에서는 target model 기준으로 빠진 확률 질량을 다시 맞춘다.
이 구조에서 reject는 실패가 아니다. Reject는 target model의 분포를 지키기 위한 안전장치다. 다만 reject가 너무 자주 일어나면 속도 이득은 줄어든다.
9. Greedy decoding에서는 더 단순하게 보인다
Greedy decoding은 매 step마다 확률이 가장 높은 토큰을 고르는 방식이다. 이 경우 speculative decoding은 비교적 단순하게 이해할 수 있다. Draft model이 여러 토큰을 제안하고, target model이 각 위치에서 자신의 argmax와 일치하는지 확인한다.
예를 들어 draft model이 x1, x2, x3를 제안했고 target model도 각 위치에서 같은 토큰을 가장 높게 본다면 세 토큰을 accept할 수 있다. 두 번째 위치에서 target model의 argmax가 다르면 첫 번째까지만 accept하고, 두 번째 위치부터 target model의 선택으로 돌아간다.
Greedy decoding에서는 출력이 결정적이므로 검증 기준을 직관적으로 설명하기 쉽다. 다만 실제 서비스에서는 sampling을 쓰는 경우가 많고, 그때는 단순 argmax 일치만으로는 충분하지 않다.
10. Sampling에서는 분포 보존이 핵심이다
Sampling은 다음 토큰을 항상 가장 높은 확률의 토큰으로 고르지 않는다. Temperature, top-k, top-p 같은 설정을 통해 여러 후보 중 하나를 확률적으로 고른다. 이때 speculative decoding은 draft token이 target model의 최빈 토큰과 같은지만 보면 안 된다.
Sampling에서 중요한 것은 최종 출력의 분포다. Target model이 단독으로 sampling했을 때 나올 수 있는 출력 분포와 speculative decoding을 적용했을 때의 출력 분포가 같아야 한다. 이 조건이 깨지면 속도는 빨라질 수 있지만 모델의 행동이 달라진다.
Speculative sampling은 draft 분포와 target 분포의 비율을 이용해 accept 여부를 정하고, reject 시에는 보정된 분포에서 샘플링한다. 이 과정이 있기 때문에 speculative decoding은 target model의 분포를 유지하는 최적화로 이해할 수 있다.
Temperature가 높고 top-p 범위가 넓으면 후보 다양성이 커진다. 이 경우 draft model과 target model의 분포 차이가 더 잘 드러날 수 있고 accept rate가 낮아질 수 있다. 낮은 temperature나 정형 응답에서는 accept rate가 더 안정적인 경향이 있다.
11. 왜 여러 토큰을 한 번에 생성하는 것처럼 보이는가
Speculative decoding이 실제로 미래를 알고 여러 토큰을 한 번에 생성하는 것은 아니다. 정확히는 작은 모델이 미래 후보를 먼저 추측하고, 큰 모델이 그 추측을 병렬로 검증한다.
속도 이득은 target model 호출 한 번으로 확정되는 평균 토큰 수가 늘어날 때 생긴다. Draft length가 4이고 평균 3개가 accept된다면, target model 한 번으로 약 3개 토큰을 확정하는 효과가 난다. 물론 draft model을 돌린 비용과 검증 overhead가 있으므로 실제 속도 향상은 이론적 비율보다 작다.
중요한 지표는 target forward 한 번당 accept되는 토큰 수다. 이 값이 1에 가까우면 일반 decoding과 큰 차이가 없다. 2 이상으로 안정적으로 올라가면 latency 개선 가능성이 생긴다.
12. 이 기술이 빠를 수 있는 조건
Speculative decoding은 항상 빠르지 않다. 다음 조건이 맞아야 효과가 커진다.
- Target model의 한 step 비용이 크다.
- Draft model이 target model보다 훨씬 빠르다.
- Draft model과 target model의 분포가 가깝다.
- 출력 길이가 충분히 길다.
- Reject가 초반에 자주 발생하지 않는다.
- 서비스가 작은 batch의 latency에 민감하다.
반대로 target model이 이미 작거나, 출력이 매우 짧거나, draft model을 올릴 메모리 여유가 없거나, draft와 target의 tokenizer 또는 chat template이 다르면 이득이 줄어든다.
Speculative decoding은 기능을 켜면 무조건 빨라지는 옵션이 아니다. Target model 호출당 확정 토큰 수가 draft 비용과 overhead를 이겨야 한다.
13. 역사적으로 보면 어떤 고민의 결과인가
Speculative decoding의 역사는 LLM inference 최적화에서 반복되는 긴장을 보여준다. 모델이 커질수록 품질은 좋아지지만, autoregressive generation의 순차성은 그대로 남는다. 연구자들은 이 순차성을 완전히 제거하기보다, 큰 모델을 더 효율적으로 호출하는 방향을 택했다.
Blockwise parallel decoding은 여러 위치를 block처럼 다루려는 시도였다. Speculative decoding과 speculative sampling은 작은 모델의 빠른 후보 생성과 큰 모델의 분포 보존 검증을 결합했다. 이후 Medusa는 별도 draft model 대신 여러 prediction head를 붙이는 방향을 제안했고, EAGLE은 feature-level extrapolation으로 더 효율적인 후보 생성을 시도했다.
이 흐름의 공통점은 품질을 희생해 속도를 얻는 단순한 근사가 아니라는 점이다. 목표는 target model의 행동을 유지하면서 GPU에서 더 많은 일을 한 번에 처리하게 만드는 것이다.
14. 초보자가 기억해야 할 한 문장
Speculative decoding은 작은 예측자가 여러 토큰 후보를 싸게 만들고, 큰 모델이 그 후보들을 병렬적으로 검증해서, 최종 출력 분포를 유지하면서 decoding step 수를 줄이는 방법이다.
이 문장 안에 핵심이 모두 들어 있다.
- 작은 예측자: draft model 또는 그에 해당하는 후보 생성기다.
- 여러 토큰 후보: 미래 토큰을 몇 개 먼저 추측한다.
- 큰 모델: target model이다.
- 병렬적 검증: Transformer가 여러 위치의 logits를 한 번에 계산하는 성질을 활용한다.
- 출력 분포 유지: accept, reject, 보정 샘플링의 목적이다.
- decoding step 수 감소: target model 호출당 확정 토큰 수를 늘리는 효과다.
15. 2편에서 다룰 내용
1편에서는 원리만 다뤘다. 실제 적용에서는 후보를 어떻게 만들 것인지가 다시 문제가 된다. 작은 draft model을 붙일 수도 있고, prompt 안의 n-gram을 재사용할 수도 있으며, Medusa처럼 multi-token prediction head를 붙이거나 EAGLE처럼 feature-level drafting을 사용할 수도 있다.
2편에서는 다음 내용을 별도로 정리한다.
- 작은 draft model을 붙이는 방식
- n-gram 또는 prompt lookup 방식
- Medusa 계열의 multi-token prediction head
- EAGLE 계열의 feature-level drafting
- decoder-only, code, chat, multilingual, encoder-decoder, MoE 모델별 특징
- vLLM과 Hugging Face Transformers 적용 관점
- draft length, accept rate, latency를 평가하는 기준
Speculative decoding을 제대로 적용하려면 원리와 적용 방법을 분리해서 봐야 한다. 원리는 target model의 분포를 유지하면서 병렬 검증으로 target 호출 효율을 높이는 것이다. 적용 방법은 이 원리를 어떤 후보 생성기로 구현할지의 문제다.