arXiv 2026. [Paper] [Github]
Xin Cheng, Xingkai Yu, Chenze Shao, Jiashi Li, Yunfan Xiong, Yi Qian, Jiaqi Zhu, Shirong Ma, Xiaokang Zhang, Jiasheng Ye, Qinyu Chen, Chengqi Deng, Jiping Yu, Damai Dai, Zhengyan Zhang, Yixuan Wei, Yixuan Tan, Wenkai Yang, Runxin Xu, Yu Wu, Zhean Xu, Xuanyu Wang, Muyang Chen, Rui Tian, Xiao Bi, Zhewen Hao, Shaoyuan Chen, Huanqi Cao, Wentao Zhang, Anyi Xu, Huishuai Zhang, Dongyan Zhao, Wenfeng Liang
Peking University | DeepSeek-AI
6 Jul 2026

Introduction

LLM은 텍스트를 autoregressive하게 생성하므로 inference 시간이 출력 길이에 비례한다. Speculative decoding은 이러한 문제를 해결하는 원칙적인 솔루션을 제공한다. 가벼운 draft model은 후보 토큰 block을 제안하고, target model은 rejection sampling을 통해 한 번의 forward pass에서 전체 block을 검증한다. 이때 target model 분포와 일치하는 가장 긴 prefix를 수용하고 보너스 토큰 하나를 추가한다. 검증이 병렬로 이루어지고 수용 규칙이 target model 분포를 정확하게 유지하기 때문에, speculative decoding은 품질 손실 없이 생성 속도를 향상시킨다.

Draft model의 디자인은 drafting 시간과 수용률 간의 trade-off를 결정한다. 초기 방법들의 draft model은 autoregressive한 방식으로, 각 위치를 이전에 샘플링된 토큰을 기반으로 결정한다. 그러나 이러한 방식은 drafting 시간이 block 크기에 비례하여 증가하기 때문에 짧은 block과 얕은 아키텍처를 사용해야 한다. 이를 해결하기 위한 병렬 draft model은 모든 위치를 한 번의 forward pass에서 생성하므로 drafting 시간이 block 크기에 거의 영향을 받지 않는다. 이론적으로 이러한 구조적 이점 덕분에 병렬 drafting 방식은 훨씬 더 긴 draft block을 효율적으로 생성할 수 있다.

하지만 대규모 병렬 draft block의 잠재력을 완전히 활용하려면 두 가지 중요한 병목 현상이 발생한다.

  1. 생성 품질 문제: 병렬 draft model은 각 위치를 독립적으로 예측하기 때문에 block 내 토큰 간의 의존성을 모델링할 수 없다. 이러한 독립성으로 인해 충돌이 발생하고 block 후반부에서 수용률이 급격히 감소한다.
  2. 시스템 효율성 문제: 최적의 수용 길이를 결정하는 것은 여전히 ​​어려운 과제이다. 병렬 생성 방식은 쉽게 긴 draft block을 생성할 수 있지만, 제안된 모든 토큰을 무차별적으로 검증하면 특히 높은 동시성 부하에서 시스템 처리량이 저하된다.

이상적인 수용 길이는 두 가지 축을 따라 달라진다. 데이터 측면에서 코드와 같은 구조화된 요청은 채팅보다 자연스럽게 더 높은 수용률을 유지한다. 시스템 측면에서 부하가 적을 때는 추가 토큰 검증에 거의 비용이 들지 않는다. 그러나 부하가 많을 때는 거부 위험이 높은 토큰을 검증하는 데 다른 활성 요청을 처리할 수 있는 중요한 batch 용량을 소모하게 된다.

이러한 병목 현상을 해결하기 위해, 본 논문에서는 고처리량 병렬 생성과 적응형 부하 기반 검증을 통합하는 speculative decoding 프레임워크인 DSpark를 소개한다. DSpark는 두 가지 상호 보완적인 메커니즘을 통해 draft 생성과 검증에 내재된 trade-off를 해결하도록 설계되었다.

첫째, 토큰 간 의존성 부족 문제를 해결하기 위해 DSpark는 semi-autoregressive 아키텍처를 채택했다. 이 아키텍처는 계산 비용이 많이 드는 draft backbone을 완전히 병렬로 유지하고, 직전 토큰 정보를 주입하기 위한 가벼운 출력 head만 추가한다. 이러한 설계는 병렬 모델의 drafting 속도를 유지하면서 suffix decay 현상을 크게 완화한다.

둘째, 시스템 수준의 병목 현상을 해결하기 위해 DSpark는 confidence-scheduled verification을 사용하였다. 위치별 prefix 생존 확률을 추정하는 confidence head와 hardware-aware scheduler를 결합하여 DSpark는 각 요청에 대한 검증 시간을 동적으로 조정한다. 이 스케줄러는 실시간 엔진 처리량 프로파일을 활용하여 검증 예산을 return 기대값이 가장 높은 토큰에만 할당한다.

Method


Speculative decoding의 속도는 빨라지려면 수용률이 높고, drafting 속도가 빨라야 한다. Autoregressive한 draft model은 높은 수용률을 달성하지만 drafting 시간이 오래 걸린다. 반면, 병렬 draft model은 drafting 시간이 짧지만, 각 위치를 독립적으로 예측하기 때문에 수용률이 낮다. DSpark는 두 가지 상호 보완적인 구성 요소를 통해 이러한 한계를 해결하였다.

  • Semi-Autoregressive Generation. 병렬 backbone이 drafting의 대부분을 처리한 다음, 가벼운 sequential block이 draft 토큰 간의 의존성을 주입하여 최소한의 추가 시간으로 수용률을 개선한다.
  • Confidence-scheduled verification. confidence head는 위치별 수용 확률을 추정하고, hardware-aware scheduler는 이러한 추정치를 사용하여 신뢰도가 낮은 suffix 토큰을 제거하여 불필요한 검증 계산을 줄인다.

1. Semi-Autoregressive Generation

병렬 draft model은 모든 $\gamma$개의 draft logit을 한 번의 forward pass로 생성하므로, 각 예측은 block의 다른 곳에서 샘플링된 토큰에 의존할 수 없다. 따라서 “of course”와 “no problem” 대신 “of problem” 또는 “no course”와 같은 일관성 없는 조합을 생성할 수 있다. 따라서 수용률은 block을 따라 급격히 감소하여 drafting 및 검증 컴퓨팅 자원을 낭비하게 된다. 그러므로 저자들은 draft 생성을 두 단계로 나누는 semi-autoregressive 구조를 채택하였다.

1.1 Parallel stage

병렬 backbone인 DFlash는 전체 block에 대해 한 번의 forward pass를 실행하여 hidden state \(h_1, \ldots, h_\gamma\)와 base logit \(U_1, \ldots, U_\gamma\)를 생성한다. 저자들은 원래 DFlash backbone에 약간의 수정만 가했다. 앵커 토큰과 $\gamma$개의 마스크 토큰을 입력하고 마스크 위치만 예측하는 대신, 앵커 자체를 첫 번째 예측 위치로 처리하여 $\gamma$개의 입력 토큰(앵커 + $\gamma-1$개의 마스크)이 $\gamma$개의 draft logit을 생성하도록 했다. 이렇게 하면 draft 계산량을 줄이면서 draft 품질은 유사하게 유지할 수 있다.

1.2 Sequential stage

순차적 단계는 base logit에 transition bias \(B_k (x_0, x_{< k, x_k})\)를 추가하여 각 draft 위치가 block 내에서 이전에 샘플링된 토큰에 따라 컨디셔닝될 수 있도록 하였다. 순차적 단계는 autoregressive factorization을 통해 인과적인 block 분포를 유도한다.

\[\begin{aligned} P(X \mid x_0) &= \prod_{k=1}^y p_k (x_k \mid x_0, x_{< k}) \\ p_k (v \mid x_0, x_{< k}) &= \frac{\exp (U_k (v) + B_k (x_0, x_{< k}, v))}{\sum_{u \in \mathcal{V}} \exp (U_k (u) + B_k (x_0, x_{< k}, u))} \end{aligned}\]

($x_0$는 이전 검증 사이클의 앵커 토큰, $U_k$는 위치 $k$에서의 base logit 벡터, $\mathcal{V}$는 vocabulary)

Inference 시, sequential block은 \(p_k (\cdot \vert x_0, x_{< k})\)에 따라 왼쪽에서 오른쪽으로 샘플링한다. 이 샘플링 과정은 본질적으로 순차적이기 때문에, 전체 draft 시간이 병렬 단계에 의해 좌우되도록 sequential block은 계산량이 적어야 한다. 다음은 sequential block의 두 가지 구현 예시이다.

Markov head. 가장 간단한 구현은 $B_k$가 바로 앞 토큰에만 의존하도록 제한하는 것이다. 원칙적으로 이것은 완전한 $V \times V$ 행렬 $B$이지만, $W_1 \in \mathbb{R}^{V \times r}$과 $W_2 \in \mathbb{R}^{r \times V}$를 사용한 low-rank factorization $B = W_1 W_2$로 근사한다. 바로 앞 토큰 $x_{k-1}$이 주어졌을 때, 위치 $k$에 대한 transition bias는 다음과 같다.

\[\begin{equation} B(x_{k-1}, \cdot) = W_1 [x_{k-1}] W_2 \in \mathbb{R}^V \end{equation}\]

여기서 $W_1$은 embedding lookup table 역할을 하고 $W_2$는 logit projection 역할을 한다. 위치 1에서 “of”를 샘플링하면 Markov head는 위치 2에서 “course”를 증폭하고 “problem”을 억제한다.

RNN head. Markov head의 경우 위치 $k$는 $x_{k-1}$ 이전의 토큰에 접근할 수 없다. RNN head는 block 내에서 전체 prefix history를 누적하는 recurrent state $s_k$를 유지함으로써 이러한 제약을 완화한다. 각 step에서 모듈은 현재 상태 $s_{k-1} \in \mathbb{R}^r$, 이전 토큰 임베딩 $W_1 [x_{k-1}] \in \mathbb{R}^r$, 그리고 backbone hidden $h_k \in \mathbb{R}^d$를 입력 벡터 $z_k \in \mathbb{R}^{2r+d}$로 concat한 다음, single gated update를 적용한다.

\[\begin{equation} s_k = \sigma (W_g z_k) \odot s_{k-1} + (1 - \sigma (W_g z_k)) \odot \textrm{tanh} (W_c z_k) \\ B_k (x_{< k}, \cdot) = W_2^\top \textrm{tanh} (W_o z_k) \end{equation}\]

($s_0$는 0으로 초기화)

2. Confidence-Scheduled Verification

Semi-autoregressive 아키텍처 덕분에 DSpark는 많은 draft block을 효율적으로 생성할 수 있다. 하지만 더 많은 draft 토큰을 생성한다고 해서 자동으로 속도가 향상되지는 않는다. 특히 동시 접속이 많은 시나리오에서 draft block 전체를 무분별하게 검증하면 오히려 시스템 처리량이 저하될 수 있다.

이러한 성능 병목 현상은 두 가지 상호 작용하는 요인에서 비롯된다.

  1. 데이터 측면에서 draft 수용률은 도메인별로 본질적으로 다르다. 코드와 같은 구조화된 텍스트는 수용률이 높은 반면, 채팅은 수용률이 현저히 낮다.
  2. 시스템 측면에서 추가 토큰을 검증하는 데 드는 실제 비용은 엔진 부하에 따라 크게 달라진다. 시스템 부하가 낮을 때는 추가 검증이 거부되더라도 최소한의 페널티만 발생한다. 그러나 동시 접속이 많은 환경에서는 불필요한 검증 하나하나가 다른 활성 요청을 처리할 수 있는 target model의 batch 용량을 차지하게 된다.

따라서 많은 draft block의 잠재력을 완전히 활용하려면 기대값이 양수인 토큰에만 target model 연산을 라우팅하는 통합 메커니즘이 필요하다. DSpark는 prefix 생존 확률을 예측하는 confidence head와 현재 시스템 부하에 따라 최적의 수용 길이를 동적으로 결정하는 hardware-aware prefix scheduler를 결합하여 이를 구현하였다.

2.1 Confidence Head

Confidence head는 각 draft 위치 $k$에 대해 스칼라 $c_k \in (0, 1)$을 출력한다. 중요한 것은 $c_k$가 block의 모든 이전 토큰이 수용되었을 때, 위치 $k$의 draft 토큰이 target model의 검증을 통과할 조건부 확률을 모델링한다는 점이다. 이 아키텍처는 가벼운 linear projection과 sigmoid로 구성된다.

\[\begin{equation} c_k = \sigma (w^\top [h_k; W_1 [x_{k-1}]]) \end{equation}\]

($h_k$는 backbone의 hidden state, $W_1 [x_{k-1}]$은 Markov embedding)

Step별 실제 수용률 $c_k^\ast$를 GT로 사용하며, $c_k^\ast$는 draft 분포 $p_k^d$와 target 분포 $p_k^t$ 사이의 total variation distance에 의해 결정된다.

\[\begin{equation} c_k^\ast = 1 - \frac{1}{2} \| p_k^d - p_k^t \|_1 \end{equation}\]
Post-hoc Calibration

Threshold 기반 검증 휴리스틱은 draft 토큰 품질의 순위를 정확하게 매기기 위해 신뢰도 점수만 필요로 하는 반면, 본 논문의 hardware-aware scheduling 방식은 수용 길이 기대값 $\tau$를 계산하기 위해 누적 수용 확률의 절대값을 정확하게 필요로 한다. 신경망 기반 신뢰도 추정치는 종종 크게 예측되는 경향이 있기 때문에, 신뢰도 점수를 직접 사용하면 처리량 추정이 왜곡되어 최적화되지 않은 스케줄링으로 이어질 수 있다.

저자들은 이 문제를 해결하기 위해 Sequential Temperature Scaling (STS)을 도입하였다. 각 $c_i$는 조건부 확률을 모델링하므로, 연쇄 법칙에 따라 draft prefix가 수용될 결합 확률은 누적 곱 \(\prod_{i \le k} c_i\)이 된다. STS는 별도의 검증 세트를 사용하여 이 결합 확률을 왼쪽에서 오른쪽으로 순차적으로 보정한다.

구체적으로, 각 위치 \(k \in \{1, \cdots, \gamma\}\)에서, 이전 위치들의 이미 보정된 점수를 고정한 상태로, 누적 곱의 Expected Calibration Error (ECE)를 최소화하는 최적의 temperature 스칼라를 찾기 위해 간단한 1D grid search를 수행한다. 중요한 것은 temperature scaling이 순서를 보존한다는 점이다. 즉, confidence head가 학습한 상대적인 draft 토큰 순위를 변경하지 않고 예측 확률을 실제 수용률과 일치하도록 조정한다.

2.2 Hardware-Aware Prefix Scheduler

기존 방법들은 일반적으로 신뢰도 점수에 고정된 threshold를 적용하여 수용 길이를 결정한다. 이러한 방식은 요청이 적은 상황에서는 효과적이지만, 시스템 부하에 따라 draft 토큰 검증의 유용성이 크게 좌우되는 높은 동시성의 시스템에서는 최적의 방법이 아닐 수 있다.

이를 해결하기 위해, 저자들은 수용 길이 선택을 글로벌 처리량 최대화 문제로 공식화하였다. 활성 요청 $R$개를 batch로 고려한다. 요청 $r$에 대해 \(c_{r,1}, \ldots, c_{r,\gamma}\)를 위치별 신뢰도 추정치라고 하고, \(\ell_r \in \{0, \ldots, \gamma\}\)를 예정된 수용 길이라고 하자. Speculative decoding은 draft 토큰을 연속 prefix로만 동적으로 허용하기 때문에 위치 $j$에 있는 토큰의 생존 확률은 누적 곱 \(a_{r,j} = \prod_{i \le j} c_{r,i}\)이다.

한 번의 검증 step에서 target model로 전송되는 총 batch 크기 $B$와, 성공적으로 수용된 토큰 개수의 기대값 $\tau$는 다음과 같다.

\[\begin{equation} B = \sum_{r=1}^R (1 + \ell_r), \quad \tau = \sum_{r=1}^R (1 + \sum_{j=1}^{\ell_r} a_{r,j}) \end{equation}\]

주어진 forward pass batch size $B$에 대해 초당 step 수로 측정되는 엔진 처리량을 $\textrm{SPS}(B)$라고 하자. 이 처리량 곡선은 엔진 초기화 중에 한 번 프로파일링되어 가벼운 비용 테이블로 저장된다. 스케줄러는 수용 길이 \(\ell_1, \ldots, \ell_R\)을 동적으로 선택하여 시스템 전체의 토큰 처리량 기대값 $\Theta = \tau \cdot \textrm{SPS}(B)$를 최대화하는 것을 목표로 한다.

$a_{r,j}$는 $j$에 대한 단조 감소 함수이므로 (\(a_{r,j} \le a_{r,j-1}\)), 요청 $r$의 수용 길이를 $j-1$에서 $j$로 확장했을 때 수용 토큰 수 기대값의 증가는 정확히 $a_{r,j}$이다. 이러한 단조성은 $a_{r,j}$를 기준으로 후보 토큰을 글로벌하게 정렬하는 것이 block 내 prefix 의존성을 자연스럽게 고려하도록 보장한다. 결과적으로, 전체 검증 batch 크기 $B$가 고정된 경우, 최적 할당 \(\{\ell_r\}\)은 모든 \(\{a_{r,j}\}\)의 글로벌 풀에서 생존 확률이 가장 높은 draft 토큰을 greedy하게 선택함으로써 결정된다.

따라서, 먼저 모든 유효한 prefix 확장을 생존 확률의 내림차순으로 글로벌하게 정렬한다. 최적의 batch 크기 $B$를 동적으로 결정하기 위해, 정렬된 풀에서 토큰을 점진적으로 허용하고 비용 테이블에서 조회하여 처리량 기대값 $\Theta$를 업데이트한다.

손실 없는 speculative decoding은 예측 불가능성이라는 속성을 엄격하게 요구한다. 즉, 수용 결정은 미래의 후보 토큰에 의존해서는 안 된다. Confidence head는 이전에 샘플링된 토큰의 Markov feature에 의존하기 때문에, 다음 생존 확률 $a_{r,k+1}$을 계산하려면 인스턴스화된 후보 $x_{r,k}$가 ​​명시적으로 필요하다. 따라서 이러한 글로벌 탐색은 의도치 않게 $x_{r,k}$를 step $k$의 수용 결정에 노출시켜 선택 편향을 초래할 수 있다.

엄격한 인과관계를 적용하기 위해 스케줄러는 조기 종료 메커니즘을 사용한다. 처리량이 감소하는 순간 greedy 탐색을 즉시 중단함으로써, 종료 결정은 해당 step까지 처리된 prefix에만 의존한다. 이는 수용 이벤트를 이후 토큰과 분리하여 정확한 target 분포 복구를 보장한다. 이러한 조기 종료 메커니즘은 하드웨어 처리량 곡선이 부드럽게 감소한다는 것을 가정하며, 이러한 가장 하에서 최대 처리량을 얻을 수 있다.

3. Training

학습 과정에서 각 target 시퀀스에서 여러 앵커 위치를 무작위로 샘플링하여 $\gamma$개의 토큰 block으로 구성된 학습 데이터를 생성한다. Target model은 학습 기간 내내 고정되어 있으며, draft model은 embedding layer와 언어 모델링 head를 공유하고 이를 고정한 상태로 유지하며, backbone draft model, sequential block, confidence head만 업데이트한다.

학습 loss는 cross-entropy loss \(\mathcal{L}_\textrm{ce}\), 분포 매칭 loss \(\mathcal{L}_\textrm{tv}\), 신뢰도 loss \(\mathcal{L}_\textrm{conf}\)의 세 가지 항으로 구성된다. 이 세 가지 loss 모두 $w_k$로 위치 가중치가 부여되는데, 이는 prefix 기반 검증에서 예상 수용 길이에 더 큰 영향을 미치는 초기 block 위치를 강조한다.

\[\begin{equation} w_k = \exp(-\frac{k-1}{\gamma}) \end{equation}\]

Cross-entropy loss \(\mathcal{L}_\textrm{ce}\)는 draft model이 다음에 나올 토큰을 정확하게 예측하도록 한다.

\[\begin{equation} \mathcal{L}_\textrm{ce} = -\sum_{k=1}^y w_k \log p_k^d (x_k^\ast) \end{equation}\]

($x_k^\ast$는 GT 토큰, $p_k^d$는 draft 분포)

분포 매칭 loss \(\mathcal{L}_\textrm{tv}\)는 draft 분포와 target 분포 간의 total variation distance를 페널티로 적용한다.

\[\begin{equation} \mathcal{L}_\textrm{tv} = \sum_{k=1}^y w_k \| p_k^d - p_k^t \|_1 \end{equation}\]

Total variation distance는 수용률에 대한 직접적인 proxy이므로 step별 수용 확률은 \(1 - \frac{1}{2} \| p^d - p^t \|_1\)과 같으며, \(\mathcal{L}_\textrm{tv}\)를 최소화하면 예상 수용률이 직접적으로 최대화된다.

신뢰도 loss \(\mathcal{L}_\textrm{conf}\)는 confidence head가 \(c_k^\ast\)를 예측하도록 하는 binary cross-entropy이다.

\[\begin{equation} \mathcal{L}_\textrm{conf} = -\sum_{k=1}^y w_k [c_k^\ast \log c_k + (1 - c_k^\ast) \log (1 - c_k)] \end{equation}\]

전체 loss는 세 가지 항의 가중합이다. (기본 가중치 \(\alpha_\textrm{ce} = 0.1\), \(\alpha_\textrm{tv} = 0.9\), \(\alpha_\textrm{conf} = 1.0\))

\[\begin{equation} \mathcal{L} = \alpha_\textrm{ce} \mathcal{L}_\textrm{ce} + \alpha_\textrm{tv} \mathcal{L}_\textrm{tv} + \alpha_\textrm{conf} \mathcal{L}_\textrm{conf} \end{equation}\]

Experiments

  • 학습 데이터셋: Open-PerfectBlend

1. Results

다음은 주요 speculative decoding 결과이다.

2. Analysis

다음은 위치별 수용률을 비교한 결과이다.


다음은 draft model 깊이에 따른 수용 길이를 비교한 결과이다.


다음은 draft 길이에 따른 수용 길이와 처리 시간을 비교한 결과이다.


다음은 고정된 신뢰도 threshold에 따른 step당 평균 토큰 수를 비교한 결과이다.


다음은 ECE 기반 post-hoc calibration의 영향을 나타낸 그래프이다.

3. Real-World Deployment

다음은 초당 토큰 수(TPS)에 따른 처리량을 실제 배포 환경에서 테스트한 결과이다.


다음은 동시 요청 수에 따른 처리량과 검증 예산을 비교한 결과이다.