MTP와 DFlash¶
다중 토큰 예측(Multi-Token Prediction, MTP)과 DFlash는 대상 모델에 맞춘 초안 모델을 만드는 두 가지 방식입니다. 둘 다 한 번의 검증 라운드에서 대상 모델이 승인한 토큰을 여러 개 얻으려 하지만 제안 방식은 다릅니다. MTP는 여러 미래 토큰을 직접 예측하도록 학습하고 DFlash는 가벼운 블록 디퓨전 모델로 여러 후보 위치를 병렬로 개선합니다.
두 용어 모두 범용 체크포인트 형식을 뜻하지 않습니다. 대상 모델, 초안 모델, 런타임 규약이 서로 맞아야 합니다. 이 페이지는 먼저 개념을 설명하고 mlxcel의 정확한 지원 범위와 명령을 제시합니다.
MTP: 바로 다음 토큰보다 더 많이 학습하기¶
일반적인 인과 언어 모델 학습은 각 위치에서 다음 토큰을 예측합니다. MTP 학습 목표는 더 먼 미래 토큰의 손실도 추가합니다. 단순화하면 위치 t의 표현으로 x_(t+1), x_(t+2), ... x_(t+K)를 예측합니다.
구체적인 아키텍처는 다양합니다. 모델이 여러 예측 헤드, 작은 순환형 미래 예측 계층, 또는 대상 모델의 은닉 상태를 받는 별도 보조 모델을 가질 수 있습니다. 추론할 때는 이 학습된 구성 요소가 토큰 시퀀스나 블록을 제안하고 완전한 대상 모델이 이를 검증합니다.
MTP가 디코딩을 가속하는 이유¶
MTP는 초안 생성의 비용 구조를 두 가지 측면에서 바꿉니다.
- 대상 모델과의 정렬: 특정 대상 모델 계열의 미래를 예측하도록 학습했으므로 관계없는 소형 언어 모델보다 승인 접두 길이가 길어질 수 있습니다.
- 중복 작업 감소: 보조 모델이 독립적인 완전 언어 모델 프리필을 다시 실행하지 않고 대상 모델의 임베딩, 은닉 상태, 접두 시퀀스와 KV 정보를 재사용할 수 있습니다.
대상 모델 자체가 비자기회귀 모델로 바뀌는 것은 아닙니다. 대상 모델이 앞부분을 거부하면 뒤의 제안은 버립니다. 검증하지 않은 MTP 출력을 신뢰해서 빨라지는 것이 아니라, 저렴한 제안 경로와 효율적인 대상 모델 블록 검증을 사용하기 때문에 빨라집니다.
MTP는 학습 목표이기도 하다¶
다중 토큰 예측은 투기적 추론에 전혀 사용하지 않아도 학습 표현을 개선할 수 있습니다. 반대로 MTP 목표로 학습한 가중치가 모든 서빙 런타임에서 자동으로 동작하는 것도 아닙니다. 추론에는 정확한 헤드 또는 보조 모델 아키텍처, 마스크, 캐시 규약, 위치 규칙, 검증 알고리즘이 필요합니다.
Gemma 4 보조 모델¶
Gemma 4는 Gemma 4 계열에 맞춘 작고 전용인 텍스트 전용 보조 모델을 공개합니다. 보조 모델은 대상 모델의 마지막 계층 활성값을 받고 대상 모델의 입력 임베딩을 공유하며, 독립적인 전체 프리필 대신 대상 모델의 접두 상태를 재사용할 수 있습니다. 보조 모델이 여러 미래 토큰을 예측하면 Gemma 4 대상 모델이 밀집 검증 순전파에서 이를 검증합니다.
이 방식은 임의의 작은 Gemma 체크포인트를 고르는 것과 다릅니다. 대상 모델 계열과 크기를 명시한 보조 모델 카드를 사용하십시오. 텍스트 전용 보조 모델이 멀티모달 대상 체크포인트의 텍스트 생성을 가속할 수 있더라도 투기 디코딩 경로가 이미지, 오디오, 비디오 임베딩을 이해한다는 뜻은 아닙니다.
Gemma 4 MTP는 Metal과 CUDA에서 동작합니다. 첫 버스트 전에 작업자가 Qwen 3.5 계열과 같은 블록 대 시퀀스 정확성 검사를 실행하므로(MTP 정확성 검사 참조), 실행 중인 하드웨어에서 검증 블록이 단일 토큰 디코딩과 바이트 단위로 같지 않은 Gemma 4 조합은 일반 디코딩으로 전환됩니다.
Qwen 3.5 계열 MTP¶
Qwen 생태계는 다중 토큰 예측을 지원하는 모델과 설정을 공개하며 다른 런타임은 체크포인트 내부의 NEXTN 또는 MTP 헤드를 사용할 수 있습니다. mlxcel의 계약은 더 좁고 명시적입니다.
- Qwen 3.5/Qwen3.8 계열 대상 모델을
model_type = qwen3_5_mtp인 별도 초안 모델과 짝지어야 합니다. --draft-block-size를 생략하면 초안 모델이 선언한block_size를 사용하며 공개 체크포인트는 흔히3을 사용합니다.- 지원되는 VLM으로 감싼 대상 모델의 텍스트 전용 요청을 포함한 텍스트 전용 경로입니다.
- 대상 체크포인트 안의 내장
mtp.layers.*가중치는 실행하지 않습니다. 로더는 이 가중치를 제외하고, 사용자는internal-mtp를 선택할 수 없으며, 이를 위한 전용 라운드 반복문도 구현되어 있지 않습니다. 대상 체크포인트만 있으면 mlxcel MTP를 쓸 수 있다고 설명하면 안 됩니다. 체크포인트 자신의 헤드를 실행하는 유일한 형태가 아래의qwen4_exp입니다.
이 구분은 운영에서 중요합니다. 상류 모델 카드가 “MTP 포함”이라고 올바르게 설명하더라도 mlxcel에서는 외부 qwen3_5_mtp 짝 체크포인트가 필요합니다.
GLM-4.7-Flash MTP¶
GLM-4.7-Flash(glm4_moe_lite)는 DeepSeek-V3 스타일 next-token-prediction 계층 하나를 model.layers.47.*로 가지고 있습니다. 커뮤니티 4비트 변환본은 이 텐서를 버리므로 mlxcel은 이 계층을 별도 초안 모델 디렉터리로 실행하며, 이 디렉터리는 mlxcel split-mtp가 원본 zai-org/GLM-4.7-Flash 체크포인트에서 만듭니다.
결과물의 model_type은 glm4_moe_lite_mtp이며, 형상이 같은 모든 glm4_moe_lite 대상 모델과 오프라인 및 서버에서 짝을 이룹니다. 초안 모델에는 대상 모델의 최종 정규화 뒤 은닉 상태가 들어갑니다(MLXCEL_GLM_MTP_HIDDEN_TAP=pre는 승인율 측정용으로 정규화 전 잔차를 선택하며, 출력 토큰은 바꾸지 않습니다). 기본 검증 블록은 num_nextn_predict_layers + 1이며 공개 체크포인트에서는 2입니다. split-mtp --block-size로 16 이하의 다른 폭을 기록할 수 있습니다. 시작 시 Qwen MTP와 같은 블록 대 단일 토큰 시퀀스 정확성 검사를 실행합니다. 두 가지 제약이 있습니다. 프롬프트 캐시 접두부를 채택한 요청은 일반 디코딩으로 처리하며, MTP로 처리한 요청은 대상 모델의 K/V가 모델 소유 슬롯에 있으므로 접두부 캐시에 아무것도 남기지 않습니다. 명령의 플래그는 mlxcel split-mtp를 참조하십시오.
Qwen3.8-Flash-Next(qwen4_exp) MTP¶
qwen4_exp는 시퀀스별 상태를 직접 소유하므로 투기적 디코딩에는 승인된 접두부에서 그 상태를 다시 만드는 롤백이 필요합니다. mlxcel은 이를 구현했습니다(src/models/qwen4_exp_rollback.rs). KV 캐시와 QSA 인덱스를 잘라내고, 더 이상 완성되지 않는 블록의 요약은 버린 뒤 필요할 때 다시 계산하며, GatedDeltaNet 순환과 두 컨볼루션 윈도를 승인된 토큰 위에서 재생하고, PLE n-gram 문맥을 같은 토큰에서 다시 계산하므로 거부된 EOS가 문맥을 초기화하지 않습니다. --prompt-lookup도 이 롤백을 씁니다.
초안 모델은 두 가지로 붙일 수 있습니다. model_type이 qwen4_exp_mtp인 분리 디렉터리가 기본 형태입니다. mtp.* 텐서를 남긴 대상 모델 변환본은 자기 자신을 초안 모델로 쓸 수 있는데, 대상 디렉터리를 --draft-model(오프라인)이나 --model-draft(서버)로 한 번 더 넘기면 됩니다. 이를 고르는 플래그는 없고, 인덱스나 헤더에 mtp.*, model.mtp.*, language_model.mtp.* 텐서가 있으면 로더가 mtp로 해석합니다. 헤드가 없는 체크포인트에 --draft-kind mtp를 주면 NoEmbeddedMtpHead로 실패하며, 이런 텐서가 없는 디렉터리는 이전과 같이 해석됩니다.
# 변환본이 유지한 내장 헤드
mlxcel generate -m models/Qwen3.8-Flash-Next-4bit-mtp \
--draft-model models/Qwen3.8-Flash-Next-4bit-mtp -p "Hello" -n 256 --temp 0
# 분리 초안 모델 디렉터리
mlxcel-server -m models/Qwen3.8-Flash-Next-OptiQ-2bit \
--model-draft models/Qwen3.8-Flash-Next-MTP --port 8080
--draft-block-size의 기본값은 4이며, 분리 초안 모델이 선언한 block_size는 적응형 시작 깊이입니다. MTP 대상 모델의 프리필은 일반 경로와 같은 계획을 따릅니다(기본 2048 토큰 청크, 서버에서는 --prefill-chunk-size). 한 번의 호출로 프리필하면 긴 프롬프트에서 일반 디코딩과 갈라지기 때문입니다. 검증 블록은 디코드와 동등하게 구성했습니다. QSA 어텐션 호출마다 쿼리 하나, 컨볼루션은 행 단위, GatedDeltaNet은 융합 프로젝션, 게이트 프로젝션은 행 단위, expert gather는 정렬 없이 실행합니다. 이 구성이 없으면 정확성 검사가 실제 체크포인트를 블록 4에서 거부합니다. GPU 세대 15 이상에서 남는 차이 원인은 qmv_wide이며 게이트가 이를 끄고, 이 계열의 프롬프트 조회도 max_draft + 1에서 같은 게이트를 거칩니다. hc_count가 다른 초안 모델은 바인딩 전에 거부합니다.
이 경로는 Metal 전용이고 B = 1입니다. 이미지나 비디오가 있는 요청과 B > 1 윈도는 일반 디코딩으로 전환됩니다. 내장 헤드는 메모리에 남아 있으며 4비트 체크포인트에서 약 1.61 GiB이고, 인덱스 total_size가 이미 헤드를 포함하므로 mlxcel inspect도 한 번만 셉니다.
DFlash: 초안 모델로 사용하는 디퓨전¶
DFlash는 가벼운 블록 디퓨전 초안 모델입니다. 초안 토큰을 하나씩 생성하지 않고 알 수 없거나 잡음이 섞인 위치로 이루어진 블록에서 시작하여 대상 모델의 특징을 조건으로 여러 위치를 반복해서 개선합니다. 완성된 블록은 어디까지나 제안입니다. 자기회귀 대상 모델이 후보를 검증하고 출력에 대한 최종 권한을 유지합니다.
이는 DFlash와 고유 디퓨전 언어 모델을 구분하는 핵심입니다.
- DFlash 투기 경로에서는 디퓨전이 보조 제안 엔진이고 대상 모델은 여전히 자기회귀 모델입니다.
- DiffusionGemma 또는 LLaDA-2 생성에서는 블록의 노이즈 제거 또는 마스크 해제가 대상 모델 자체의 고유 디코딩 알고리즘입니다. 각 후보를 검증하는 별도의 자기회귀 대상 모델이 없습니다. 블록 디퓨전을 참조하십시오.
DFlash는 초안 모델 안의 직렬 작업을 줄이고 MTP보다 넓은 블록을 사용할 수 있습니다. 반면 대상 모델 전용 학습, 여러 차례의 초안 개선, 전용 어텐션 마스크와 캐시 연결이 필요하며 대상 모델이 일찍 동의하지 않으면 넓은 블록 계산을 낭비합니다.
mlxcel의 DFlash 계열 초안 모델¶
아래 초안 모델은 모두 embed_tokens와 lm_head를 대상 모델에서 빌려 쓰므로 독립 모델로 로드되지 않습니다. -m에 넘기면 그 이유를 설명하며 거부합니다. 각 초안 모델은 자기 대상 계열과만 짝을 이루며, 맞지 않는 조합은 이름을 밝혀 거부합니다.
| 초안 모델 | 대상 모델 | 진입점 | 참고 |
|---|---|---|---|
| Qwen 3.5 DFlash | Qwen 3.5 계열 텍스트 대상 모델, 또는 지원되는 VLM으로 감싼 대상 모델의 텍스트 전용 요청 | 서버 | CUDA에서 head_dim이 256 또는 288이면 fused sdpa_vector 경로가 바이트 동일성을 깨므로 모든 폭에서 버스트를 거부합니다. MLXCEL_SDPA_VECTOR_LARGE_D=0은 동일성을 되찾고, MLXCEL_MTP_ALLOW_INEXACT=1은 그래도 동작시킵니다. |
LFM2 / LFM2.5 DSpark (Lfm2DSparkDraftModel) | lfm2와 lfm2_moe 텍스트, LFM2-VL의 텍스트 전용 요청 | 서버 | 5계층 DFlash 백본에 Markov 토큰 전이 헤드를 더한 구조입니다. 탐욕적 디코딩 전용이어서 temperature > 0이고 top_k != 1인 요청은 경고 한 줄과 함께 일반 디코딩으로 처리합니다. 기본 폭은 초안 모델의 runtime_block_size(없으면 8)입니다. |
Muse Glimmer 보조 모델(muse_glimmer_assistant) | Muse Glimmer, 배치 크기 1의 텍스트 전용 요청 | 서버 | Muse Glimmer가 받는 유일한 초안 모델입니다. 라운드 반복문은 초안 모델이 선언한 깊이인 4행에서 시작하고, 측정 구간에서 이득이 확인될 때만 요청한 상한 쪽으로 넓힙니다. 정확성 검사는 실행이 도달할 수 있는 모든 폭을 확인합니다. |
Laguna DFlash (DFlashLagunaForCausalLM, 예: poolside/Laguna-XS-2.1-DFlash) | 배치 크기 1의 Laguna 텍스트 경로 | 서버와 오프라인 mlxcel generate | 대상 모델에서 가져온 잔차 스트림 위에서 동작하는 인과 sliding-window(512) 초안 모델입니다. 오프라인에서는 탐욕적 디코딩 전용입니다. |
LFM2, Muse Glimmer, Laguna 조합은 서버에서 측정 기반 블록 대 단일 토큰 시퀀스 정확성 검사를 거치며, Laguna 조합은 오프라인에서도 거칩니다. 검사가 거부하면 서버는 일반 디코딩으로 처리하고 오프라인 generate는 판정을 보고하며 종료합니다. MLXCEL_MTP_ALLOW_INEXACT=1은 그래도 동작시키며 일반 디코딩과의 바이트 동일성을 포기합니다.
배치 Qwen 3.5 DFlash 라운드 반복문에서는 라운드를 가장 짧은 살아 있는 행에 맞춰 고정하지 않고 행마다 승인 수를 따로 확정합니다. 어텐션 캐시는 행별 연속 유효 접두부로 압축되고, 쿼리와 키는 각 행의 논리 위치에서 회전하며 오래된 빈틈은 마스킹되고, 선형 어텐션 계층은 승인된 접두부 위에서 컨볼루션과 순환 상태를 재생합니다. 초안 모델 문맥은 여전히 공유 사각형 접두부라서 승인 폭은 독립 초안보다 작습니다. A/B 비교용으로 MLXCEL_DFLASH_PER_ROW_ACCEPTS=0을 주면 고정 방식으로 돌아가며, 대상 모델의 어텐션 캐시가 양자화되었거나 paged이거나 head-trimmed이면 행별 압축이 불가능하므로 자동으로 고정 방식을 씁니다. 검증한 M3 Ultra 호스트에서 배치 크기 4일 때 행별 경로는 116.05 tok/s, 고정 방식은 83.06 tok/s였습니다.
MTP와 DFlash 비교¶
| 속성 | 외부 MTP 보조 모델 | DFlash 초안 모델 |
|---|---|---|
| 제안 방식 | 대상 모델과 정렬된 은닉 상태에서 학습한 미래 토큰 시퀀스 또는 블록 | 제안 블록을 반복적으로 개선하는 디퓨전 |
| mlxcel의 일반적인 폭 | Gemma 기본값 4, Qwen은 체크포인트 값으로 흔히 3, Qwen3.8-Flash-Next 4, GLM-4.7-Flash 2 | 초안 모델이 폭을 선언하거나 장치별 기본값이 적용되지 않으면 16. 초안 블록 폭 참조 |
| 최종 권한 | 대상 모델이 접두 부분을 검증하고 승인 | 대상 모델이 접두 부분을 검증하고 승인 |
| 주요 장점 | 저렴하고 대상 모델과 강하게 정렬된 단계, 상태 재사용 가능 | 토큰별 초안 의존성이 적은 병렬 블록 제안 |
| 주요 단점 | 대상 모델과 강하게 결합되며 일부 직렬 의존성이 남을 수 있음 | 넓은 초안 계산과 여러 개선 단계가 낭비될 수 있음 |
mlxcel 오프라인 generate | 조건을 만족하는 텍스트 전용 Gemma 4, Qwen, Qwen3.8-Flash-Next, GLM-4.7-Flash 조합 지원 | Laguna 대상 모델과 Laguna DFlash 초안 모델 조합만 지원 |
| mlxcel 서버 | 문서화된 자격 조건과 정책에서 지원 | Qwen 3.5 계열, Qwen3.8-Flash-Next, LFM2/LFM2.5, Muse Glimmer, Laguna 텍스트 경로 지원 |
지원표¶
| 경로 | 초안 모델의 model_type | 대상 모델과 요청 | 진입점 | 중요한 경계 |
|---|---|---|---|---|
| Gemma 4 MTP | gemma4_assistant | Gemma 4 텍스트 모델 또는 지원되는 Gemma 4 대상 모델의 텍스트 전용 요청 | 오프라인 및 서버 | 이미지·오디오·비디오 요청은 이 MTP 디코딩 경로를 사용하지 않습니다. |
| Gemma 4 Unified MTP | gemma4_unified_assistant | Gemma 4 Unified 텍스트 전용 요청 | 오프라인 및 서버 | 보조 모델은 텍스트 전용입니다. |
| Qwen MTP | qwen3_5_mtp | 지원되는 Qwen 3.5/Qwen3.8 계열 텍스트 대상 모델 또는 VLM으로 감싼 모델의 텍스트 전용 요청 | 오프라인 및 서버 | 시작 시 정확성 검사가 사용을 거부할 수 있고 대상 모델 내부 MTP는 사용하지 않습니다. 이미지나 비디오가 포함된 요청은 MTP를 쓰지 않고 일반 디코딩으로 처리합니다. |
| GLM-4.7-Flash MTP | glm4_moe_lite_mtp (mlxcel split-mtp로 생성) | 배치 크기 1의 glm4_moe_lite 텍스트 대상 모델 | 오프라인 및 서버 | 프롬프트 캐시 접두부를 쓴 요청과 배치 크기 2 이상 구간은 일반 디코딩으로 전환합니다. |
| Qwen3.8-Flash-Next MTP | qwen4_exp_mtp, 또는 대상 모델 자신의 mtp.* 헤드(같은 디렉터리를 --draft-model/--model-draft로 지정) | Metal에서 배치 크기 1의 qwen4_exp 텍스트 대상 모델 | 오프라인 및 서버 | 롤백이 승인된 접두부에서 시퀀스별 상태 전체를 다시 만듭니다. 이미지, 비디오, 배치 크기 2 이상 요청은 일반 디코딩으로 전환하며, 프롬프트 조회는 qmv_wide 게이트를 거칩니다. |
| Qwen DFlash | 지원 대상과 짝지은 DFlash 체크포인트 | Qwen 3.5 계열 텍스트 대상 모델 또는 VLM으로 감싼 모델의 텍스트 전용 요청 | 서버 전용 | 실제 멀티모달 요청은 일반 디코딩으로 전환하며, CUDA에서 head_dim이 256 또는 288이면 거부합니다. |
| LFM2 DSpark | DSpark 초안 모델(Markov 헤드가 있는 dflash_config) | lfm2 / lfm2_moe 텍스트 또는 LFM2-VL의 텍스트 전용 요청 | 서버 전용 | 탐욕적 디코딩 전용이며 샘플링 요청은 일반 디코딩으로 전환합니다. |
| Muse Glimmer DFlash | muse_glimmer_assistant | 배치 크기 1의 Muse Glimmer 텍스트 전용 요청 | 서버 전용 | 이 초안 모델만 받으며 --draft-kind는 dflash이거나 생략해야 합니다. 어댑터, KV 캐시 모드, TP, PP는 이 대상 모델에서 계속 거부합니다. |
| Laguna DFlash | dflash_config가 있는 laguna 초안 모델 | 배치 크기 1의 Laguna 텍스트 경로 | 오프라인 및 서버 | 두 진입점 모두 정확성 검사를 거치며 오프라인은 탐욕적 디코딩 전용입니다. |
| 전체 모델 | 일반 인과 언어 모델. MTP model_type이 없고 DFlash 표시도 없는 config.json | 드래프터와 토크나이저를 공유하는 텍스트 대상 모델 | 오프라인 및 서버 | 종류를 지정하지 않으면 자동 감지되며 --draft-kind full-model로 명시할 수도 있습니다. 대상 모델이나 드래프터의 캐시를 잘라내기로 되돌릴 수 없거나, 드래프터 어휘가 대상 모델보다 크거나, 설정에 vocab_size가 없거나, DFlash 디렉터리를 전체 모델로 넘기면 시작 단계에서 거부합니다. |
빠른 실행 명령¶
Gemma 4 MTP 서버¶
mlxcel-server \
--model ./models/gemma-4-31b-it-4bit \
--model-draft ./models/gemma-4-31B-it-assistant-bf16 \
--draft-kind mtp \
--draft-block-size 4 \
--parallel 1 \
--max-batch-size 1 \
--port 8080
Gemma 4 오프라인 MTP¶
mlxcel generate \
--model ./models/gemma-4-31b-it-4bit \
--draft-model ./models/gemma-4-31B-it-assistant-bf16 \
--draft-kind mtp \
--prompt "Summarize the key ideas in the Rust ownership model." \
--max-tokens 400 \
--profile
이 예시의 --draft-model은 의도된 표기입니다. 오프라인 mlxcel generate에는 이 이름만 등록되어 있습니다. mlxcel serve와 독립 실행형 mlxcel-server는 --draft-model과 --model-draft를 모두 받지만, 독립 실행형 서버의 도움말은 llama.cpp 호환 이름인 --model-draft를 대표 표기로 보여 줍니다.
Qwen MTP 서버¶
mlxcel-server \
--model ./models/qwen3.8-27b-4bit \
--model-draft ./models/qwen3.8-27b-mtp \
--draft-kind mtp \
--draft-block-size 3 \
--max-batch-size 1 \
--port 8080
qwen3_5_mtp 체크포인트에 자체 block_size가 있으면 --draft-block-size를 생략하여 그 값을 사용하십시오.
Qwen DFlash 서버¶
mlxcel-server \
--model ./models/qwen3.5-27b-4bit \
--model-draft ./models/Qwen3.5-27B-DFlash \
--draft-kind dflash \
--draft-block-size 16 \
--max-batch-size 1 \
--port 8080
mlxcel serve는 도움말에서 --draft-model을 대표 표기로 사용하고 독립 실행형 mlxcel-server는 llama.cpp 호환 --model-draft를 대표 표기로 사용합니다. 두 서버 경로 모두 두 이름을 별칭으로 받습니다. 알려진 보조 모델의 model_type을 자동 감지할 수 있지만 재현 가능한 운영을 위해 --draft-kind를 명시하십시오.
LFM2 DSpark 서버¶
mlxcel-server \
--model ./models/lfm2.5-2.6b-bf16 \
--model-draft ./models/lfm2.5-2.6b-dspark-bf16 \
--port 8080
DSpark 유형은 초안 모델의 아키텍처와 dflash_config 블록에서 자동 감지합니다. 탐욕적 요청(temperature: 0)을 보내십시오. 샘플링 요청은 일반 디코딩으로 처리합니다.
GLM-4.7-Flash MTP¶
mlxcel split-mtp -m ./models/glm-4.7-flash-bf16 -o ./models/glm-4.7-flash-mtp-4bit --q-bits 4
mlxcel generate \
--model ./models/glm-4.7-flash-4bit \
--draft-model ./models/glm-4.7-flash-mtp-4bit \
--prompt "Explain in two sentences why the sky is blue." \
--temp 0
같은 초안 모델 디렉터리를 mlxcel-server의 --model-draft로도 사용할 수 있습니다.
Laguna DFlash 오프라인¶
mlxcel generate \
--model ./models/laguna-xs-2.1-nvfp4 \
--draft-model ./models/laguna-xs-2.1-dflash \
--draft-kind dflash \
--prompt "def retry_with_backoff(" \
--no-chat-template \
--temp 0
mlxcel generate의 --draft-kind dflash는 Laguna 대상 모델과 그 Laguna DFlash 초안 모델 조합에서만 받습니다. 다른 대상 모델은 해당 DFlash 조합이 서버에서 실행된다고 보고합니다.
명령줄과 환경 변수¶
| 제어 | 기본값 | 효과 |
|---|---|---|
--draft-model / --model-draft | 없음 | 짝이 되는 초안 모델 체크포인트 |
--draft-kind mtp\|dflash\|full-model | 자동 감지 | 초안 경로를 선택합니다. 드래프터 경로가 있는데 종류를 지정하지 않으면 드래프터 디렉터리에서 자동 감지합니다. gemma4_assistant, gemma4_unified_assistant, qwen3_5_mtp는 mtp, DFlash 계열 디렉터리는 dflash, 그 밖의 읽을 수 있는 모델 디렉터리는 full-model로 대응됩니다. mlxcel generate는 mtp, dflash, full-model을 받고 mlxcel serve와 mlxcel-server는 prompt-lookup도 받습니다(mlxcel의 프롬프트 조회 참조). |
--draft-block-size N | 시작 시 결정. 초안 블록 폭 참조 | 선택한 드래프터 종류의 최대 제안·검증 폭 |
--draft-max / --draft | 16 | props에 n_max로 보고되는 llama.cpp 호환 값입니다. mlxcel 드래프터의 폭은 --draft-block-size로 정합니다. |
LLAMA_ARG_DRAFT_KIND, MLXCEL_DRAFT_KIND | 미설정 | 초안 모델 유형의 환경 변수 대체값. 명시한 명령줄 인자가 우선합니다. |
LLAMA_ARG_DRAFT_BLOCK_SIZE, MLXCEL_DRAFT_BLOCK_SIZE | 미설정 | 폭의 환경 변수 대체값. 명시한 명령줄 인자가 우선합니다. |
초안 블록 폭¶
--draft-block-size, MLXCEL_DRAFT_BLOCK_SIZE, LLAMA_ARG_DRAFT_BLOCK_SIZE가 모두 없으면 시작 시 다음 순서로 폭을 한 번 결정합니다.
- 초안 체크포인트가 스스로 선언한 폭: Qwen 3.5 MTP의
block_size, LFM2 DSpark의runtime_block_size, Muse Glimmer 보조 모델의 깊이, Inkling MTP의 깊이, GLM-4.7-Flash의num_nextn_predict_layers + 1. - 실행 중인 장치와 대상 모델의 양자화 방식에 대해 측정한 기본값. 현재 항목은 하나이며, CUDA compute capability 12.1(GB10)에서 affine 양자화 대상 모델과 짝지은 DFlash 초안 모델은
4로 결정됩니다. 이 환경에서는 고정값16이 일반 디코딩보다 느리게 측정되었습니다. - 유형별 고정 기본값: MTP는
4, DFlash는16, 전체 모델은4.
시작 시 speculative= 줄이 결정된 폭과 그 폭을 만든 규칙을 함께 기록하며(예: block_size=4, block_size_from=measured default for sm_121 with an affine-quantized target), 요청별 DFlash 진단 줄도 폭을 다시 보여 줍니다. 폭은 작업자가 소유하므로 바꾸려면 재시작해야 합니다.
배치 크기 1의 적응형 MTP 정책¶
서버의 배치 크기 1 MTP는 기본적으로 적응형입니다. 대상 모델·초안 모델·하드웨어·블록 크기 조합마다 조건을 충족한 처음 네 번의 버스트를 프로파일링하고 승인율과 지연으로 이득을 추정하여 ${MLXCEL_CACHE_DIR:-$HOME/.cache/mlxcel}/mtp-policy/ 아래에 대략적인 활성화 또는 사용 거부 결정을 저장합니다. 프롬프트 문자열이나 토큰 ID는 저장하지 않습니다. 측정이 모호하면 정적 하드웨어 정책으로 전환합니다.
| 변수 | 의미 |
|---|---|
MLXCEL_ENABLE_MTP_B1=0 | 배치 크기 1을 일반 디코딩으로 강제하고 프로파일링을 생략합니다. 일반적인 참 값은 MTP를 강제합니다. |
MLXCEL_MTP_ADAPTIVE=0 | 프로파일링을 끄고 정적 정책을 사용합니다. |
MLXCEL_ENABLE_MTP_BATCH=1 | 기본적으로 꺼진 배치 크기 2 이상의 버스트 경로를 연산자 또는 디버깅 목적으로 강제로 켭니다. 행 단위(row-wise) Gemma 4 구성에서는 배치 버스트가 시퀀스별 일반 디코딩과 바이트 단위로 같습니다. CUDA에서만 동작하고, 행 4개 이하이며 캐시가 모두 덴스 FP16이고 프롬프트가 슬라이딩 윈도 안에 들어가는 창에 한정되며, Metal과 ROCm에서는 사용을 거부합니다. |
MLXCEL_MTP_TICK_SLICE=0 | 틱 단위로 협력하는 기본 배치 크기 1 서비스 대신 한 요청이 생성 전체를 소유하도록 되돌립니다. |
MLXCEL_MTP_SLICE_GRANT_ROUNDS=N | 경쟁할 때의 허용 라운드 예산을 설정합니다. 기본값은 8라운드입니다. |
배치 크기 1 미세 성능 측정으로 실제 서비스의 배치 크기 2 이상 이득을 추정하지 마십시오. 큐, 스케줄러 협력, 대상 모델의 배치 처리 가능성, 검증 연산 형태가 모두 달라집니다.
MTP 정확성 검사¶
페널티가 없고 온도가 0인 요청에서 mlxcel은 Qwen 3.5 계열과 Gemma 4의 MTP 출력을 일반 디코딩과 바이트 단위로 같게 만들려고 합니다. 하지만 폭 K의 블록 순전파는 MLX가 다른 양자화 사영 커널이나 다른 연산 순서를 선택하면 단일 토큰 순전파 K회와 달라질 수 있습니다.
작업자가 시작될 때 런타임은 서로 독립적인 합성 입력 세 개를 사용해, 같은 상태에서 합성 검증 블록과 동등한 단일 토큰 시퀀스를 비교합니다. 결과는 (model, block width) 조합별로 기억하고 요청 처리 경로 밖에서 예열합니다. 차이가 나면 MLX의 qmv_wide 커널을 끄고 다시 검사합니다. 두 번째 결과가 정확하면 해당 선택을 끈 채 MTP가 동작하고, 여전히 다르면 일반 디코딩으로 전환합니다. qmv_wide 재검사는 Metal 백엔드를 쓸 수 있을 때만 실행하며, 다른 백엔드에서는 첫 검사 결과로 바로 결정합니다. 사용 거부 로그는 검사 판정을 담고 프로세스당 한 번만 남습니다.
MLXCEL_QMV_WIDE는 커널 선택을 명시적으로 고정하며 정확성 관문의 재시도보다 우선합니다.MLXCEL_MTP_ALLOW_INEXACT=1은 검사가 실패해도 Qwen 3.5나 Gemma 4 MTP를 동작시킵니다. 정확성을 보장하는 설정이 아니라 처리량 연구용 강제 설정입니다.MLXCEL_MTP_PROBE_PROMPT_LEN은 검사가 비교 전에 프리필하는 프롬프트 토큰 수를 정합니다(기본값8). 다른 체크포인트에서 길이 스윕을 반복하기 위한 값이며, 값을 늘리면 작업자 시작 시 검사마다 프리필이 한 번씩 늘어납니다.- 페널티를 쓰면 바이트 단위 동일성 기준이 약해집니다. 첫 보너스 토큰에만 같은 페널티 처리를 적용한 뒤 나머지 검증 토큰은 탐욕적으로 진행합니다. f16 연산 오차도 해당 조합의 사용 거부를 일으킬 수 있습니다.
체크포인트 차원, 양자화, 블록 폭, GPU 세대, MLX 버전, 커널 선택이 모두 동일성에 영향을 주므로 측정 관문이 고정된 하드웨어 허용 목록보다 안전합니다.
초안 생성 비용과 진단¶
Qwen MTP 초안 모델은 가중치 전송량을 줄이기 위해 기본적으로 로드할 때 양자화합니다. MLXCEL_MTP_QUANTIZE_DRAFTER=0으로 끌 수 있습니다. 양자화는 검증을 우회하지 않습니다. 제안 비용을 바꿀 뿐 대상 모델의 권한은 그대로입니다.
다음 진단 기능으로 라운드를 분석할 수 있습니다.
MLXCEL_MTP_DRAFT_PROFILE=1은 GPU 시간을 구성 요소별로 귀속하기 위해 초안 모델의 각 구성 요소에서 동기화합니다. 동기화 비용이 추가되므로 일반 단계 지연으로 인용하기에는 부적합하며 프로파일링하지 않은 실행과 비교해야 합니다.MLXCEL_MTP_GAP_LOG=1은 정확성과 분기 연구를 위해 각 검증 위치의 후보 토큰과 상위 두 로그잇의 차이를 기록합니다.MLXCEL_PRINT_TOKEN_IDS=1은 오프라인mlxcel generate가 프롬프트와 생성 토큰 ID를 stderr에 출력하게 하여, 일반 실행과--draft-model실행을 디코딩된 문자열이 아니라 ID로 비교할 수 있게 합니다.
라운드 로그는 실제 블록 폭을 표시하며 출력 토큰 예산이나 캐시 한계 근처에서는 설정한 폭보다 작을 수 있습니다.
커뮤니티 체크포인트를 안전하게 조합하기¶
커뮤니티가 공개한 보조 모델, MTP, DFlash, Medusa, EAGLE 저장소를 로드하기 전에 다음 질문에 답하십시오.
- 학습에 사용한 정확한 대상 모델 저장소와 리비전은 무엇인가?
- 런타임이 일반 알고리즘 이름만 인식하는 것이 아니라 이 초안 모델의 아키텍처와
model_type을 실제로 구현하는가? - 대상 모델의 토큰 ID, 임베딩 차원, 은닉 상태를 가져오는 위치, 계층 수, 위치 규칙이 호환되는가?
- 모델 카드가 블록 폭과 검증·샘플링 기준을 설명하는가?
- 초안 가중치가 이미 양자화되어 있는가? 그렇다면 런타임이 그 양자화를 지원하는가?
- 공개된 속도가 비교 가능한 대상 모델, 배치, 출력 길이, 하드웨어에서 종단 간으로 측정되었는가?
호환되지 않는 전용 초안 모델은 품질이 낮은 대체 모델이 아니라 호환되지 않는 어댑터처럼 취급해야 합니다. 검증되지 않은 제안을 조용히 출력하는 대신 시작 오류나 명시적인 기본 경로 전환을 선택하십시오.
더 읽을거리¶
- Gloeckle 외, Better & Faster Large Language Models via Multi-token Prediction
- Google AI for Developers, Gemma 다중 토큰 예측 개요
- Hugging Face Transformers, Gemma 4 보조 모델
- Qwen, Qwen3.5 모델 카드와 MTP 배포 예제
- Z Lab, DFlash 프로젝트 및 DFlash 논문
- DFlash 참조 구현