투기적 디코딩¶
투기적 디코딩(speculative decoding)은 계산 비용이 낮은 **초안 모델(drafter)**이 미래 토큰을 제안하고 최종 권한을 가진 **대상 모델(target)**이 여러 제안을 한꺼번에 검증하는 알고리즘 계열입니다. 작은 모델이 큰 모델을 대신하는 방식이 아닙니다. 선택한 검증 규칙에 따라 대상 모델이 승인하지 않은 제안 토큰은 출력에 들어갈 수 없습니다.
이 페이지는 공통 알고리즘, 정확성 조건, 성능상의 손익, 초안 모델의 유형을 설명합니다. mlxcel의 학습형 초안 모델 구현과 운영 설정은 MTP와 DFlash에서 자세히 다룹니다.
자기회귀 디코딩은 왜 가속하기 어려운가¶
자기회귀 언어 모델은 시퀀스를 왼쪽에서 오른쪽으로 다음과 같이 분해합니다.
일반적인 디코딩은 프리필 이후 대상 모델을 한 번 순전파하고, 토큰 하나를 샘플링하고, KV 캐시에 붙이는 일을 반복합니다. 배치 크기가 1이면 유효 토큰 하나를 얻을 때마다 모델 가중치의 큰 부분을 메모리에서 읽는 경우가 많습니다. 현재 토큰을 알아야 다음 대상 모델 단계를 시작할 수 있으므로 여러 단계를 단순히 병렬 실행하면 토큰 사이의 의존성이 깨집니다.
투기적 디코딩은 이 직렬 의존성의 일부를 훨씬 저렴한 모델로 옮깁니다. 초안 모델이 가능성 높은 미래 토큰을 낮은 비용으로 예측하면 대상 모델은 짧고 넓은 검증 순전파에서 모든 후보 위치에 점수를 매길 수 있습니다. 현대 가속기는 짧은 검증 블록 하나를 같은 횟수의 개별 대상 모델 디코딩보다 효율적으로 처리하는 경우가 많습니다.
기본 라운드¶
현재 승인된 접두 시퀀스를 x, 제안 폭을 K, 초안 모델 분포를 q, 대상 모델 분포를 p라고 합시다.
- 초안 모델이 보통 짧은 직렬 시퀀스나 구조화된 블록으로 후보
y_1 ... y_K를 예측합니다. - 대상 모델은 한 번의 검증 순전파로 후보가 붙은 접두 시퀀스를 평가하고 필요한 모든 위치의 로그잇을 반환합니다.
- 검증기가 유효한 후보 중 가장 긴 접두 부분을 승인합니다.
- 처음 거부된 위치에서는 대상 모델이 허용한 대체 토큰을 선택하거나 샘플링하고, 무효가 된 투기 캐시 상태를 버린 뒤 다음 라운드를 시작합니다.
- 모든 후보가 승인되면 일부 알고리즘은 마지막 검증 위치에서 대상 모델이 예측한 보너스 토큰까지 출력합니다.
탐욕 디코딩(greedy decoding)에서는 후보가 해당 위치에서 대상 모델의 최댓값 토큰과 같을 때 보통 유효합니다. 확률적 샘플링에서는 승인 규칙과 보정 규칙이 함께 있어야 합니다. 1순위 토큰만 비교하는 방식은 대상 모델의 확률 분포를 보존하지 않습니다.
핵심 지표¶
| 지표 | 의미 | 중요한 이유 |
|---|---|---|
제안 폭 K | 한 라운드의 후보 위치 수 | 넓은 블록은 비용을 더 잘 분산할 수 있지만 초안 생성과 검증 계산을 더 많이 낭비할 수도 있습니다. |
| 토큰 승인율 | 제안 토큰 중 승인된 비율 | 유용하지만 처음 거부된 위치를 드러내지 않습니다. |
| 평균 승인 접두 길이 | 되돌리기 전에 연속으로 출력한 후보 수 | 검증 라운드당 유효 토큰 수를 더 직접적으로 예측합니다. |
| 검증당 토큰 수 | 승인된 접두 부분과 유효한 보너스 토큰의 합 | 알고리즘의 승인 성능을 대상 모델 순전파 횟수와 연결합니다. |
| 초안 생성 시간 | 후보를 만드는 데 걸린 시간 | 정확하지만 무거운 초안 모델은 가속 이득을 없앨 수 있습니다. |
| 검증 시간 | 대상 모델의 블록 순전파 시간 | 블록 폭, 양자화, 커널, 하드웨어에 따라 달라집니다. |
| 사용 거부·기본 경로 전환 비율 | 기본 디코딩으로 처리된 요청 또는 라운드의 비율 | 설정한 투기 경로가 실제로 동작하지 않는 이유를 보여 줍니다. |
응답에 실리는 요청별 수락 통계¶
mlxcel-server는 요청 하나에 대한 이 카운터들을 그 요청의 응답에 실어 주므로, 클라이언트는 서버 로그 없이도 드래프터가 도움이 됐는지 알 수 있습니다. 이 블록은 드래프터가 검증 라운드를 한 번 이상 실행했을 때만 나타납니다. 네이티브 /completion과 /completions 경로에서는 기존 timings 객체에 실리고, /v1/chat/completions는 비스트리밍 본문과 finish_reason을 싣는 스트리밍 청크의 최상위에 timings 객체 전체를 둡니다.
"timings": {"prompt_n": 12, "predicted_n": 64, "draft_n": 72, "draft_n_accepted": 55, "draft_rounds": 9, "draft_kind": "dflash"}
draft_n과 draft_n_accepted는 llama-server의 선택 필드 쌍이고, draft_rounds와 draft_kind(mtp, dflash, full-model, prompt-lookup)는 mlxcel이 더한 필드입니다. 프롬프트 조회에서는 이 카운터가 요청 하나에 대한 드래프터 합계이며, 라운드당 평균 수락 길이는 draft_n_accepted / draft_rounds입니다. 스트림 중간 청크에는 실행 전체의 합계인 드래프트 카운터가 실리지 않습니다. 기본으로 꺼져 있는 배치 버스트(B > 1)와 분리형 라우터는 아무것도 보고하지 않습니다.
왜 빨라질 수 있는가¶
일반 디코딩이 대상 모델 토큰 하나에 t_T를 쓴다고 합시다. 토큰 K개에는 대략 K * t_T가 듭니다. 투기적 라운드의 비용은 대략 다음과 같습니다.
한 라운드가 평균 E[A]개의 유효 토큰을 출력한다면 다음 조건일 때만 유효 토큰 처리율이 개선됩니다.
이 식에서 실전 규칙을 얻을 수 있습니다.
- 초안 모델은 대상 모델보다 훨씬 저렴해야 합니다.
- 대상 모델과 충분히 비슷하게 예측하여 긴 승인 접두 부분을 만들어야 합니다.
- 검증은 하드웨어에 유리한 넓은 연산 형태를 활용해야 합니다. 대상 모델 디코딩
K회를 한 API 호출로 감싼 것만으로는 이득이 없습니다. - 캐시 상태 저장, 되돌리기, 호스트 읽기, 동기화, 스케줄링 비용이 작아야 합니다.
- 큰
K가 항상 빠르지는 않습니다. 깊어질수록 승인율은 보통 떨어지고 검증과 폐기되는 초안 계산은 늘어납니다.
대상 모델은 여전히 비싼 최종 권한이지만 출력 토큰당 호출 횟수는 줄어듭니다. 일반적인 투기적 디코딩은 프롬프트 프리필을 줄이지 않으므로 토큰 간 지연이 개선되어도 첫 토큰 시간은 그대로이거나 오히려 늘 수 있습니다.
정확성 기준¶
“손실 없음(lossless)”이 무엇인지 정확히 정의해야 합니다.
탐욕 디코딩 동등성¶
온도 0에서는 대상 모델만 사용한 일반 디코딩과 정확히 같은 토큰 시퀀스를 목표로 할 수 있습니다. 그러나 이론적으로 올바른 검증 규칙만으로는 충분하지 않습니다. 블록 순전파와 단일 토큰 순전파의 결과가 같아야 하고, 페널티 상태가 같은 위치에 적용되어야 하며, 캐시를 되돌렸을 때 정확히 승인된 접두 부분이 복원되어야 합니다. 부동소수점 연산 순서나 서로 다른 양자화 행렬 커널은 확률이 거의 같은 토큰의 순위를 바꿀 수 있습니다.
확률 분포 보존¶
확률적 디코딩에서 고전적 투기 샘플링은 p(y) / q(y)와 관련된 확률로 초안 토큰을 승인합니다. 처음 거부된 위치에서는 [p - q]+에 비례하는 잔여 분포에서 샘플링합니다. 토큰화가 호환되고 거부 규칙 전체를 구현하면 초안 모델이 토큰을 제안했더라도 최종 표본은 대상 모델의 분포를 따릅니다.
MTP와 DFlash는 서로 다른 라운드 반복문, 자격 판정, 페널티 제한을 사용하므로 이 분포 보존 주장을 모든 방식으로 확대하면 안 됩니다.
과제 품질 동등성¶
일부 연구 시스템은 정확한 출력 동등성을 속도와 교환하고 후속 과제의 품질을 보고합니다. 서비스의 선택으로는 타당할 수 있지만 앞의 두 기준과는 다른 계약입니다. 이를 명시하고 정확한 대상 모델 디코딩이라고 표현하지 마십시오.
초안 모델의 유형¶
| 유형 | 제안 방식과 추가 요구 사항 | 장점과 단점 | mlxcel |
|---|---|---|---|
| 작은 완전 언어 모델 | 작은 자기회귀 모델을 같은 접두 시퀀스에서 실행하며 기존 호환 모델로 충분할 수 있습니다. | 단순하고 대상 모델 아키텍처와 독립적이지만 두 모델의 상태와 직렬 초안 단계가 필요하고 토크나이저가 불일치할 수 있습니다. | 전체 모델 드래프터(--draft-kind full-model) |
| 보조 모델/MTP | 대상 모델의 은닉 상태 등을 사용해 여러 미래 위치를 예측하는 전용 모듈 또는 체크포인트가 필요합니다. | 작은 초안 모델을 대상 모델과 강하게 정렬할 수 있지만 정확한 조합과 런타임 통합이 필요합니다. | 외부 Gemma 4 및 Qwen 3.5 계열 MTP 경로 |
| Medusa 계열 다중 헤드 | 미세 조정한 미래 토큰 헤드를 붙이고 후보 트리를 검증합니다. | 두 번째 완전 언어 모델을 피하지만 트리 구성과 런타임 전용 어텐션이 필요하며 헤드의 품질에 의존합니다. | 미지원 |
| EAGLE 계열 특징 초안 모델 | 대상 모델 전용으로 학습한 모델이 미래의 대상 특징이나 토큰을 예측합니다. | 전체 대상 모델을 복제하지 않고 강하게 정렬할 수 있지만 아키텍처와 리비전에 밀접하게 결합됩니다. | 미지원 |
| DFlash 계열 디퓨전 초안 모델 | 투기적 제안에만 쓸 블록을 노이즈 제거하는 디퓨전 모델을 학습합니다. | 자기회귀 초안의 직렬 의존성을 줄이지만 전용 마스크, 캐시 연결, 검증이 필요합니다. | 범위가 제한된 Qwen 3.5 계열 서버 경로 |
| N-그램 또는 프롬프트 조회 | 학습 없이 문맥에 이미 있는 이어지는 문자열을 재사용합니다. | 모델 메모리가 거의 필요 없지만 텍스트가 반복될 때만 유효합니다. | mlxcel generate --prompt-lookup과 서버 --draft-kind prompt-lookup. mlxcel의 프롬프트 조회 참조 |
따라서 커뮤니티가 공개한 “투기적 모델”을 서로 바꾸어 쓸 수는 없습니다. 작은 인과 언어 모델은 같은 토큰 ID만 필요할 수 있지만 보조 모델은 특정 대상 모델의 크기와 은닉 상태 인터페이스를 요구할 수 있습니다. Medusa나 EAGLE 체크포인트에는 각각의 트리 또는 특징 예측 규약을 구현한 런타임이 필요하고 DFlash 체크포인트에는 디퓨전 초안 반복문이 필요합니다. 저장소 이름에 draft가 있다는 이유로 고르지 말고 모델 카드, 대상 리비전, 토크나이저, 양자화, 런타임 지원을 확인하십시오.
mlxcel의 전체 모델 드래프터¶
일반적인 더 작은 인과 언어 모델도 토크나이저를 공유하면 더 큰 대상 모델의 드래프터로 쓸 수 있습니다. 드래프터는 자체 KV 캐시에서 자기회귀적으로 동작하며, 그 캐시는 현재 토큰 직전에서 멈추는 문맥 접두부를 담습니다. 각 단계에서 argmax를 제안하고 대상 모델에서는 아무것도 읽지 않습니다. 대상 모델은 라운드마다의 제안을 프롬프트 조회와 공유하는 한 번의 토큰 전용 검증 라운드에서 검증하며, 거부된 제안은 대상 모델의 캐시와 함께 드래프터의 캐시에서 잘려 나갑니다. 출력을 결정하는 것은 오직 대상 모델입니다.
mlxcel generate \
--model ./models/Llama-3.1-70B-4bit \
--draft-model ./models/Llama-3.2-1B \
--draft-kind full-model \
--prompt "Summarize the key ideas in the Rust ownership model." \
--max-tokens 400 \
--profile
--draft-kind full-model이 이 경로를 선택합니다. 종류를 지정하지 않고 드래프터 경로를 주면 MTP도 DFlash도 아닌 읽을 수 있는 모든 모델 디렉터리를 전체 모델로 감지합니다. --draft-model은 generate, run, serve, mlxcel-server에서 로컬 경로와 owner/name 저장소 ID를 모두 받습니다. 폭을 정하는 유일한 설정은 --draft-block-size이며 기본값은 4입니다. 대상 체크포인트와 초안 체크포인트는 토크나이저 어휘와 토큰 ID가 일치해야 하며 같은 계열의 작은 모델이 보통 가장 안전한 후보입니다. llama.cpp에서 일반 초안 모델 투기를 부르는 이름인 --spec-type draft-simple은 이 종류로 대응됩니다. --draft-block-size는 모든 드래프터 종류에 공통인 유일한 폭 설정이며 mlxcel generate에는 --num-draft-tokens 플래그가 따로 없습니다. --draft-model의 config.json이 없거나 형식이 잘못되었으면 시작 단계에서 설정 오류와 함께 실패합니다.
이 드래프터는 엔진의 토큰 전용 FullModelDrafter이고, 프롬프트 조회가 쓰는 Engine::verify_round로 검증합니다. 오프라인과 서버가 같은 구현을 실행하므로 라이브러리에는 SpeculativeGenerator 타입이 없습니다. 다음 경우에는 시작 단계에서 조합을 거부합니다. 대상 모델이나 드래프터의 캐시를 잘라내기로 되돌릴 수 없을 때, 드래프터의 어휘가 대상 모델보다 크거나 두 설정 중 하나에 vocab_size가 없을 때, DFlash 계열 디렉터리를 전체 모델로 넘겼을 때입니다.
mlxcel serve와 mlxcel-server에서 드래프터는 프롬프트 조회와 같은 요청별 검증 라운드를 같은 --prompt-lookup-max-batch 관문(기본값 2) 아래에서 실행합니다. 활성 배치가 이보다 크면 일반 디코딩으로 처리합니다. --no-batch일 때, 분리형 KV 핸드오프로 넘겨받은 행, 통합 KV 예산(--kv-unified)을 쓰는 경우, 그리고 이미지, 오디오, 비디오, 구조화 출력, logprobs, 확장 샘플러 체인을 쓰는 요청에도 이 경로를 쓰지 않으며 해당 요청은 일반 디코딩으로 처리됩니다.
이는 측정된 가속이 아니라 제공되는 기능입니다. 유휴 상태의 M1 Ultra에서 배치 크기 1, 출력 256토큰, 온도 0으로 측정했을 때 Qwen3-8B 4-bit를 Qwen3-0.6B 4-bit로 초안 생성하면 일반 디코딩 93.5 tok/s에 대해 56.1 tok/s였고, Llama 3.1 8B bf16을 1B 체크포인트로 초안 생성하면 양쪽 모두 40.3 tok/s였습니다. 실제 조합을 쓰기 전에 --draft-model 없이 대상 모델만으로 기준을 측정하십시오.
mlxcel의 프롬프트 조회¶
프롬프트 조회(prompt lookup)는 초안 체크포인트 없이 동작하는 N-그램 투기 디코딩입니다. 드래프터가 시퀀스의 마지막 몇 토큰을 프롬프트와 이미 생성한 텍스트의 앞 위치와 대조하고, 그 앞선 위치 뒤에 이어졌던 토큰을 제안하면 대상 모델이 한 번의 순전파로 검증합니다. 프롬프트를 그대로 옮겨 적는 응답(수정, 재작성, 서식 변환, 인용)에서 이득이 나고, 자유로운 산문에서는 제안을 줄이거나 멈춰 일반 디코딩에 가까운 속도를 유지합니다.
수락 규칙은 sampler-match입니다. 제안 토큰은 그 위치에서 대상 모델의 샘플러로 새로 뽑은 토큰과 같을 때만 수락됩니다. 원-핫 제안에서는 이 규칙이 무손실이면서 수락 확률도 최대입니다. 다만 검증 블록과 단일 토큰 순전파의 리덕션 순서가 다를 수 있어서, 로그잇이 거의 같은 위치에서는 탐욕 디코딩 출력이 일반 디코딩과 달라질 수 있습니다.
프롬프트 조회에는 캐시를 잘라내 상태를 되돌릴 수 있는 대상 모델이 필요합니다. 순환(recurrent) 모델과 하이브리드 모델, 그리고 캐시를 모델 내부에서 직접 관리하는 계열(Qwen 3.5, Gemma 3, Gemma 4, Llama 4)은 거부됩니다.
오프라인 generate¶
mlxcel generate \
--model ./models/Qwen3-1.7B-4bit \
--prompt-lookup \
--prompt "Fix the typos in this paragraph and return it otherwise unchanged: ..." \
--max-tokens 400
| 플래그 | 기본값 | 효과 |
|---|---|---|
--prompt-lookup | 꺼짐 | 프롬프트 조회 투기 디코딩을 켭니다. --draft-model과 함께 쓸 수 없습니다. |
--prompt-lookup-ngram-max N | 3 | 문맥과 대조할 가장 긴 접미 N-그램입니다(최대 16). |
--prompt-lookup-ngram-min N | 2 | 문맥과 대조할 가장 짧은 접미 N-그램입니다. |
--prompt-lookup-max-draft N | 7 | 라운드당 최대 제안 토큰 수이며 검증 블록은 이보다 하나 넓습니다(최대 64). |
--prompt-lookup-no-adaptive | 꺼짐 | 수락되지 않는 제안을 줄이거나 멈추지 않고 매 라운드 최대치를 제안합니다(A/B 측정용). |
--prompt-lookup-policy auto\|graded\|gated | auto | gated는 좁은 블록과 최대 블록 중 하나를 쓰고, 검증하지 않은 조회 제안이 실제로 맞아떨어진 뒤에만 제안을 재개합니다(CUDA에서 조정). graded는 최근 수락률로 블록 크기를 정하고 잠시 멈춘 뒤 다시 시도합니다(Apple Silicon에서 조정). auto는 CUDA 빌드에서 gated, 그 밖에서는 graded를 고릅니다. |
조정 플래그는 모두 --prompt-lookup이 있어야 합니다. mlxcel generate --draft-kind prompt-lookup은 --prompt-lookup을 안내하는 인자 파싱 오류가 됩니다. CLI는 대화형 채팅(-p 없음), 멀티모달 프롬프트(--image, --audio, --video), 파이프라인 병렬화, --draft-model과의 조합을 거부합니다. 측정 대상 생성 전에는 모든 검증 폭을 미리 실행해 두므로 측정 구간에 커널 첫 컴파일 비용이 들어가지 않습니다. GB10에서 측정했을 때 수정형 응답은 일반 디코딩보다 1.10배에서 1.94배 빨랐고, 자유 산문은 gated 정책에서 0.98배에서 1.00배였습니다.
서버 --draft-kind prompt-lookup¶
mlxcel serve와 mlxcel-server는 초안 체크포인트 없이 --draft-kind prompt-lookup을 받으며, --draft-model을 함께 주면 시작에 실패합니다. 이 플래그가 없을 때의 디코딩은 그대로입니다. 프리필이 끝나면 조건을 만족하는 요청마다 드래프터가 하나씩 붙습니다. 디코딩 틱마다 제안이 있는 행은 혼자 검증 라운드 하나를 실행하고 나머지 행은 일반 배치 단계를 진행하며, 아무도 제안하지 않은 틱은 룩어헤드 파이프라인에 그대로 남습니다.
| 설정 | 기본값 | 효과 |
|---|---|---|
--draft-block-size N | 7 | 라운드당 최대 제안 길이입니다. |
--prompt-lookup-max-batch N | 2 | 활성 디코딩 배치의 행 수가 이 값 이하일 때만 검증 라운드를 실행합니다. 이보다 크면 배치가 줄어들 때까지 모든 행이 일반 디코딩을 합니다. |
--spec-type none | 다른 드래프터와 마찬가지로 프롬프트 조회를 끕니다. |
드래프트 정책은 CUDA 빌드에서 gated, 그 밖에서는 graded이며, 시작 시 speculative=prompt-lookup 줄에 max_draft, policy, max_batch, min_tokens_per_round, shadow_confirm_tokens, plain_rounds_before_pipeline이 기록됩니다. 통합 KV 예산(--kv-unified)에서는 검증 라운드가 꺼지고, 페이지드 KV 저장소에서는 전체 문맥이 4608 토큰을 넘은 시퀀스가 검증을 멈춥니다. 덴스 저장소에는 이런 한도가 없습니다. CUDA에서는 손익분기 조절기가 동작하는데, 초안 라운드를 두 번 거친 뒤 검증 라운드당 출력 토큰 수의 이동 평균이 4 아래로 떨어지면 그 행을 멈추고, 검증 없이 조회한 제안 토큰이 연속 7개 맞으면 다시 재개합니다.
이미지, 오디오, 비디오가 있는 요청, 구조화 출력, 토큰별 logprobs, mirostat, adaptive-p, 확장 샘플러 체인(동적 온도, min_keep)을 쓰는 요청, 그리고 캐시 잘라내기로 상태를 되돌릴 수 없는 모델은 일반 디코딩으로 처리되고 debug 로그에 이유가 남습니다. llama-server 고유의 N-그램 --spec-type 값은 여전히 시작에 실패하며, mlxcel에서는 --draft-kind prompt-lookup으로 씁니다. 조건을 만족하는 첫 프리필(보통 시작 시 워밍업 요청)이 2부터 --draft-block-size + 1까지 모든 검증 폭을 미리 실행합니다. 완료된 요청은 timings 블록에 draft_kind: "prompt-lookup"과 함께 라운드 통계를 보고합니다.
GB10에서 Qwen3-1.7B 4-bit로 측정한 서버 구성의 처리량 변화는 채팅 -0.275%, 짧은 복사 작업 +149%에서 +159%, 긴 복사 작업 1.52배에서 2.82배였습니다. 검증 라운드가 다른 행과 틱을 나누는 방식은 연속 배칭에서 다룹니다.
알려진 문제: 온도 0의 블록 검증¶
온도 0에서 블록 검증 경로(--prompt-lookup 또는 전체 모델 --draft-model)는 일반 디코딩의 토큰 열에서 벗어날 수 있으므로 투기 디코딩 출력이 일반 디코딩과 같다고 보장하지 않습니다(#2778). 원인은 아직 밝혀지지 않았습니다. 바이트 단위로 같은 출력이 필요하면 같은 프롬프트를 드래프터 없이 실행해 비교하고, 다르면 일반 디코딩을 사용하십시오. 수락 규칙은 샘플러 일치이며, 수락 최적 거부 규칙과 MLXCEL_SPECULATIVE_STOCHASTIC_ACCEPT는 제공하지 않습니다.
트리 초안 생성¶
시퀀스 방식은 미래 깊이마다 후보가 하나입니다. 트리 방식은 일부 검증 위치를 대안 후보에 사용합니다. 초안 모델의 1순위와 2순위 선택이 비슷하면 둘 다 가지가 될 수 있습니다. 트리 어텐션은 한 가지가 다른 가지의 토큰을 보지 못하게 해야 하고 위치 인코딩은 각 노드의 깊이를 반영해야 합니다.
mlxcel의 MTP 트리 초안 생성은 실험적이며 기본적으로 꺼져 있습니다. MLXCEL_MTP_TREE_BRANCHES는 차순위 후보가 사용할 수 있는 검증 위치 수를 제어하고 0은 선형 동작을 뜻합니다. MLXCEL_MTP_TREE_MARGIN으로 상위 두 로그잇의 차이가 지정한 범위 안일 때만 가지를 만들도록 제한할 수 있습니다. 분기는 승인 경로를 찾을 가능성을 높일 수 있지만 검증 폭을 키우고 보너스 토큰에 적용하던 단순한 시퀀스 동등성 논리를 약화합니다. 사용 전에 종단 간 이득을 측정하십시오.
제안 폭 선택¶
체크포인트 또는 방식의 기본값에서 시작하고 실제 서비스와 비슷한 프롬프트로 몇 가지 작은 폭을 비교하십시오.
- 대상 모델만 사용할 때의 지연과 메모리를 기록합니다.
- 초안 생성 시간과 검증 시간을 따로 기록합니다.
- 승인율만 보지 말고 평균 승인 접두 길이와 검증당 유효 토큰 수도 그립니다.
- 검증 비용의 증가가 유효 승인 작업의 증가보다 커지면 폭을 더 늘리지 않습니다.
- 실제 배치와 동시성 환경에서 반복합니다.
mlxcel 기본값은 전체 모델 드래프터에서 제안 4개, 프롬프트 조회에서 제안 7개(검증 블록 8)입니다. MTP와 DFlash 초안 모델은 초안 체크포인트가 선언한 폭(예: qwen3_5_mtp 체크포인트의 block_size)이 우선이고, 다음으로 측정 기반 장치별 기본값(GB10에서 affine 양자화 대상 모델과 짝지은 DFlash는 4), 그다음 MTP 4개와 DFlash 16개를 사용합니다. 초안 블록 폭을 참조하십시오. 남은 출력 예산이나 캐시 한계에 가까운 라운드는 실제로 더 좁은 폭을 사용할 수 있습니다.
체크포인트 조합과 운영 체크리스트¶
- 대상 모델과 초안 모델의 모델 카드가 호환되는 계열, 크기, 리비전을 명시하는지 확인합니다.
- 의도한 조합의 토크나이저 파일을 함께 보관합니다. 어휘 크기가 같다는 사실만으로 토큰 ID 호환성을 증명할 수 없습니다.
- 메모리 추정에 두 모델을 모두 포함하고 두 캐시와 검증용 임시 공간을 남깁니다.
- 시작 로그가 의도대로
speculative=full-model,speculative=mtp,speculative=dflash,speculative=prompt-lookup을 표시하는지 확인합니다. - 짧은 탐욕 디코딩 프롬프트뿐 아니라 중지 문자열, EOS, 페널티, 온도, 긴 프롬프트, 캐시 경계를 시험합니다.
- 텍스트 전용 자격 조건과 멀티모달 체크포인트가 이미지를 받을 수 있다는 사실을 구분합니다. 전용 투기 디코딩 경로에는 입력 형식 제한이 있습니다.
- 기본 경로 전환과 사용 거부 로그를 감시합니다. 정상적인 기본 응답이 가속 경로가 전혀 동작하지 않았다는 사실을 숨길 수 있습니다.
- 체크포인트, 양자화, mlxcel, MLX, macOS, 하드웨어가 바뀌면 성능을 다시 측정합니다.
흔한 실패 형태¶
| 증상 | 가능한 원인 | 조치 |
|---|---|---|
| 승인율이 높은데도 빨라지지 않음 | 초안 모델이 너무 느리거나 검증 폭이 비효율적이거나 동기화 비용이 지배함 | 전체 라운드를 프로파일링하고 더 작은 초안 모델이나 더 좁은 폭을 시도합니다. |
| 몇 토큰 뒤 승인율 급락 | 대상·초안 모델 불일치 또는 실제 프롬프트 분포가 초안 모델의 학습 분포와 다름 | 공개된 조합을 다시 확인하고 실제 작업으로 성능을 측정합니다. |
| 탐욕 디코딩의 바이트 단위 출력 불일치 | 커널 연산 순서, 페널티 적용 위치, 보너스 토큰 의미, 캐시 되돌리기 차이 | 해당 방식의 정확성 기준과 관문을 확인하고 먼저 모든 페널티를 끈 채 비교합니다. |
| 시작 시점 또는 긴 문맥에서 메모리 부족 | 대상 모델, 초안 모델, 두 캐시 상태가 메모리 예산을 초과함 | 문맥·캐시 사용량을 줄이거나 더 작은 초안 모델을 쓰거나 투기적 디코딩을 끕니다. |
| 방식을 설정했지만 일반 디코딩처럼 보임 | 요청 자격 판정 실패 또는 런타임의 사용 거부 | 시작·요청 로그를 확인하고 문서상 지원되는 텍스트 전용 단일 배치 요청으로 시험합니다. |
더 읽을거리¶
- Leviathan, Kalman, Matias, Fast Inference from Transformers via Speculative Decoding
- Chen 외, Accelerating Large Language Model Decoding with Speculative Sampling
- Cai 외, Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads
- Li 외, EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test