Qwen3.6-27B-MLX-4bit-MTP

English | ไธญๆ–‡

Native MTP (Multi-Token Prediction) weights preserved for MLX inference. The official mlx-community releases strip MTP weights during sanitize(), breaking speculative decoding support.

ๅŽŸ็”Ÿไฟ็•™ MTP๏ผˆๅคš token ้ข„ๆต‹๏ผ‰ๆƒ้‡็š„ MLX ้‡ๅŒ–็‰ˆๆœฌใ€‚ๅฎ˜ๆ–น mlx-community ๅ‘ๅธƒ็‰ˆๅœจ sanitize() ้˜ถๆฎตไผšไธขๅผƒ MTP ๆƒ้‡๏ผŒๅฏผ่‡ดๆ— ๆณ•ไฝฟ็”จๆŠ•ๆœบ่งฃ็ ๅŠ ้€Ÿใ€‚


Introduction

This is a 4-bit quantized MLX conversion of Qwen/Qwen3.6-27B with native MTP (Multi-Token Prediction) weights fully preserved.

Most pre-converted MLX models on HuggingFace (including mlx-community releases) remove MTP weights during the sanitize() step, making it impossible to use Qwen3.6's built-in speculative decoding acceleration. This model fixes that.

Why This Matters

Qwen3.6 models include a dedicated MTP head (an extra transformer layer) trained to predict token t+2 from the hidden state at t and the embedding of t+1. When enabled during inference:

  • Speedup: ~1.5-2x faster generation compared to standard autoregressive decoding
  • Quality: Zero quality loss โ€” MTP is trained end-to-end with the base model
  • No draft model needed: Unlike DFlash or standard speculative decoding, MTP uses the model's own weights โ€” no separate draft model to load or manage

Official MLX conversions strip these weights because mlx-lm's sanitize() method drops mtp.* keys. This repository preserves them.

Model Details

Property Value
Base Model Qwen/Qwen3.6-27B
Quantization 4-bit affine, group_size=64
Total Parameters ~27B
Context Length 262,144
Architecture Qwen3.5 (Gated DeltaNet hybrid)
MTP Layers 1
File Size ~14.4GB (3 safetensors)
Compatible With mlx-lm feat/mtp-batched branch

Performance (M5 Max, 64GB RAM)

Mode Tokens/sec Notes
Standard ~30-35 Baseline
MTP enabled ~45-55 ~1.5x speedup
MTP + DFlash โŒ Incompatible Cannot combine
MTP + TurboQuant KV โŒ Incompatible MTP needs exact attention path

MTP acceptance rate observed: 74-84% in continuous conversation tests (15K+ tokens).

Required Branch / Version

You MUST use the feat/mtp-batched branch of mlx-lm. The official PyPI release and mlx-community conversions do NOT support MTP inference โ€” they strip mtp.* weights during sanitize().

Component Required Path / Branch
mlx-lm install git+https://github.com/AirRunner/mlx-lm.git@feat/mtp-batched
Model on HuggingFace samwang0041/Qwen3.6-27B-MLX-4bit-MTP
Original base model Qwen/Qwen3.6-27B
# Install the exact branch
pip install git+https://github.com/AirRunner/mlx-lm.git@feat/mtp-batched

Model Directory Structure

After mlx_lm.load() downloads or after manual conversion, the model directory contains:

qwen3.6-27b-4bit-mtp/
โ”œโ”€โ”€ config.json                          # Model config (includes text_config.mtp_num_hidden_layers: 1)
โ”œโ”€โ”€ tokenizer.json                       # BPE tokenizer
โ”œโ”€โ”€ tokenizer_config.json
โ”œโ”€โ”€ chat_template.jinja                  # Qwen3.6 chat template
โ”œโ”€โ”€ model.safetensors.index.json         # Weight map
โ”œโ”€โ”€ model-00001-of-00003.safetensors     # ~5.0GB (backbone layers 0-21)
โ”œโ”€โ”€ model-00002-of-00003.safetensors     # ~5.4GB (backbone layers 22-42 + lm_head)
โ””โ”€โ”€ model-00003-of-00003.safetensors     # ~4.7GB (backbone layers 43-63 + MTP weights)

MTP weights are inside shard 3 under these keys (as seen in model.safetensors.index.json):

  • language_model.mtp.fc.weight
  • language_model.mtp.layers.0.input_layernorm.weight
  • language_model.mtp.layers.0.mlp.down_proj.weight
  • language_model.mtp.layers.0.mlp.gate_up_proj.weight
  • language_model.mtp.layers.0.post_attention_layernorm.weight
  • language_model.mtp.layers.0.self_attn.k_proj.weight
  • language_model.mtp.layers.0.self_attn.o_proj.weight
  • language_model.mtp.layers.0.self_attn.q_proj.weight
  • language_model.mtp.layers.0.self_attn.v_proj.weight
  • language_model.mtp.emb.weight
  • language_model.mtp.lm_head.weight
  • ... (31 total MTP weight keys)

How to Use

CLI generation:

python -m mlx_lm.generate \
  --model samwang0041/Qwen3.6-27B-MLX-4bit-MTP \
  --prompt "Explain quantum computing" \
  --max-tokens 512 \
  --mtp

Python API:

from mlx_lm import load, generate

# Auto-downloads from HuggingFace if not cached locally
model, tokenizer = load("samwang0041/Qwen3.6-27B-MLX-4bit-MTP")

response = generate(
    model, tokenizer,
    prompt="Explain quantum computing",
    max_tokens=512,
    verbose=True,
    mtp=True,  # Enable MTP speculative decoding
)

Load from local path:

# If you downloaded/converted manually
model, tokenizer = load("/path/to/qwen3.6-27b-4bit-mtp")

With omlx server:

Add to ~/.omlx/model_settings.json:

{
  "qwen3.6-27b-4bit-mtp": {
    "mtp_enabled": true,
    "turboquant_kv_enabled": false,
    "dflash_enabled": false,
    "temperature": 1.0,
    "top_p": 0.95,
    "top_k": 20
  }
}

The model directory should be placed at:

~/.omlx/models/qwen3.6-27b-4bit-mtp/

Conversion Process

This model was converted using the following steps:

# 1. Install mlx-lm with MTP support
pip install git+https://github.com/AirRunner/mlx-lm.git@feat/mtp-batched

# 2. Download original weights and convert with quantization
python -m mlx_lm convert \
  --hf-path Qwen/Qwen3.6-27B \
  --mlx-path qwen3.6-27b-4bit-mtp \
  -q --q-bits 4 --q-group-size 64

# 3. The key: feat/mtp-batched branch preserves mtp.* weights during sanitize()
#    Official mlx-lm releases strip them, breaking speculative decoding

The conversion was performed on an Apple M5 Max with 64GB RAM. Original BF16 weights (54GB) were loaded and quantized to 4-bit (14.4GB).

KV Cache Stability

Extensively tested with continuous multi-turn conversations (10+ rounds, 15K+ tokens):

  • โœ… No KV cache corruption
  • โœ… No SSM state rollback errors
  • โœ… Stable MTP acceptance rates across long sessions
  • โœ… Suitable for production use as an OpenAI-compatible API server

Important Notes

  1. MTP vs DFlash: These are mutually exclusive. MTP uses the model's own weights; DFlash uses a separate draft model. Pick one.
  2. MTP vs TurboQuant KV: Also mutually exclusive. MTP requires exact attention computation paths; TurboQuant approximates KV cache, breaking MTP's draft validation.
  3. Only Qwen3.5/3.6 architecture: MTP is specific to Qwen3.5/3.6's architecture. Other models (Llama, Gemma, etc.) do not have this feature.
  4. Requires feat/mtp-batched branch: The official PyPI mlx-lm does not support MTP inference yet.

Related Links

License

This model follows the same license as the original Qwen/Qwen3.6-27B: Apache 2.0

The conversion and upload are provided as-is for community use. No warranties expressed or implied.


็ฎ€ไป‹

่ฟ™ๆ˜ฏ Qwen/Qwen3.6-27B ็š„ 4-bit MLX ้‡ๅŒ–็‰ˆๆœฌ๏ผŒๅฎŒๆ•ดไฟ็•™ไบ†ๅŽŸ็”Ÿ MTP๏ผˆๅคš Token ้ข„ๆต‹๏ผ‰ๆƒ้‡ใ€‚

HuggingFace ไธŠๅคงๅคšๆ•ฐ้ข„่ฝฌๆข็š„ MLX ๆจกๅž‹๏ผˆๅŒ…ๆ‹ฌ mlx-community ๅ‘ๅธƒ็‰ˆ๏ผ‰ๅœจ sanitize() ้˜ถๆฎตไผš็งป้™ค MTP ๆƒ้‡๏ผŒๅฏผ่‡ดๆ— ๆณ•ไฝฟ็”จ Qwen3.6 ๅ†…็ฝฎ็š„ๆŠ•ๆœบ่งฃ็ ๅŠ ้€Ÿใ€‚่ฟ™ไธชๆจกๅž‹่งฃๅ†ณไบ†่ฟ™ไธช้—ฎ้ข˜ใ€‚

ไธบไป€ไนˆ้‡่ฆ

Qwen3.6 ๆจกๅž‹ๅŒ…ๅซไธ€ไธชไธ“้—จ็š„ MTP Head๏ผˆ้ขๅค–็š„ไธ€ไธช Transformer ๅฑ‚๏ผ‰๏ผŒ่ฎญ็ปƒ็›ฎๆ ‡ๆ˜ฏไปŽไฝ็ฝฎ t ็š„้š่—็Šถๆ€้ข„ๆต‹ token t+2ใ€‚ๅฏ็”จๅŽ๏ผš

  • ้€Ÿๅบฆๆๅ‡๏ผš็›ธๆฏ”ๆ ‡ๅ‡†่‡ชๅ›žๅฝ’่งฃ็ ๏ผŒ็”Ÿๆˆ้€Ÿๅบฆๆๅ‡็บฆ 1.5-2 ๅ€
  • ้›ถ่ดจ้‡ๆŸๅคฑ๏ผšMTP ไธŽๅŸบ็ก€ๆจกๅž‹็ซฏๅˆฐ็ซฏ่”ๅˆ่ฎญ็ปƒ๏ผŒไธไผš้™ไฝŽ่พ“ๅ‡บ่ดจ้‡
  • ๆ— ้œ€่‰็จฟๆจกๅž‹๏ผšไธŽ DFlash ๆˆ–ๆ ‡ๅ‡†ๆŠ•ๆœบ่งฃ็ ไธๅŒ๏ผŒMTP ไฝฟ็”จๆจกๅž‹่‡ช่บซ็š„ๆƒ้‡๏ผŒไธ้œ€่ฆๅŠ ่ฝฝๅ•็‹ฌ็š„่‰็จฟๆจกๅž‹

ๅฎ˜ๆ–น MLX ่ฝฌๆขไผšไธขๅผƒ่ฟ™ไบ›ๆƒ้‡๏ผŒๅ› ไธบ mlx-lm ็š„ sanitize() ๆ–นๆณ•ไผš่ฟ‡ๆปคๆމ mtp.* ้”ฎใ€‚ๆœฌไป“ๅบ“ๅฎŒๆ•ดไฟ็•™ไบ†ๅฎƒไปฌใ€‚

ๆจกๅž‹่ฏฆๆƒ…

ๅฑžๆ€ง ๅ€ผ
ๅŸบ็ก€ๆจกๅž‹ Qwen/Qwen3.6-27B
้‡ๅŒ–ๆ–นๅผ 4-bit affine, group_size=64
ๆ€ปๅ‚ๆ•ฐ้‡ ~27B
ไธŠไธ‹ๆ–‡้•ฟๅบฆ 262,144
ๆžถๆž„ Qwen3.5๏ผˆGated DeltaNet ๆททๅˆ๏ผ‰
MTP ๅฑ‚ๆ•ฐ 1
ๆ–‡ไปถๅคงๅฐ ~14.4GB๏ผˆ3 ไธช safetensors๏ผ‰
ๅ…ผๅฎน็Žฏๅขƒ mlx-lm feat/mtp-batched ๅˆ†ๆ”ฏ

ๆ€ง่ƒฝ่กจ็Žฐ๏ผˆM5 Max, 64GB ๅ†…ๅญ˜๏ผ‰

ๆจกๅผ Tokens/็ง’ ่ฏดๆ˜Ž
ๆ ‡ๅ‡†่งฃ็  ~30-35 ๅŸบ็บฟ
ๅฏ็”จ MTP ~45-55 ~1.5 ๅ€ๅŠ ้€Ÿ
MTP + DFlash โŒ ไธๅ…ผๅฎน ไธ่ƒฝๅŒๆ—ถๅผ€ๅฏ
MTP + TurboQuant KV โŒ ไธๅ…ผๅฎน MTP ้œ€่ฆ็ฒพ็กฎ็š„ๆณจๆ„ๅŠ›่ทฏๅพ„

ๅœจ่ฟž็ปญๅฏน่ฏๆต‹่ฏ•ไธญ๏ผˆ15K+ tokens๏ผ‰๏ผŒMTP ๆŽฅๅ—็އ็จณๅฎšๅœจ **74-84%**ใ€‚

ๅฟ…้กปไฝฟ็”จ็š„ๅˆ†ๆ”ฏ / ็‰ˆๆœฌ

ๅฟ…้กปไฝฟ็”จ mlx-lm ็š„ feat/mtp-batched ๅˆ†ๆ”ฏใ€‚ PyPI ๆญฃๅผ็‰ˆๅ’Œ mlx-community ็š„่ฝฌๆขๆจกๅž‹ไธๆ”ฏๆŒ MTP ๆŽจ็† โ€” ๅฎƒไปฌไผšๅœจ sanitize() ้˜ถๆฎตไธขๅผƒ mtp.* ๆƒ้‡ใ€‚

็ป„ไปถ ๆ‰€้œ€่ทฏๅพ„ / ๅˆ†ๆ”ฏ
mlx-lm ๅฎ‰่ฃ… git+https://github.com/AirRunner/mlx-lm.git@feat/mtp-batched
HuggingFace ๆจกๅž‹ samwang0041/Qwen3.6-27B-MLX-4bit-MTP
ๅŽŸๅง‹ๅŸบ็ก€ๆจกๅž‹ Qwen/Qwen3.6-27B
# ๅฎ‰่ฃ…ๆŒ‡ๅฎšๅˆ†ๆ”ฏ
pip install git+https://github.com/AirRunner/mlx-lm.git@feat/mtp-batched

ๆจกๅž‹็›ฎๅฝ•็ป“ๆž„

mlx_lm.load() ่‡ชๅŠจไธ‹่ฝฝๆˆ–ๆ‰‹ๅŠจ่ฝฌๆขๅŽ๏ผŒๆจกๅž‹็›ฎๅฝ•็ป“ๆž„ๅฆ‚ไธ‹๏ผš

qwen3.6-27b-4bit-mtp/
โ”œโ”€โ”€ config.json                          # ๆจกๅž‹้…็ฝฎ๏ผˆๅŒ…ๅซ text_config.mtp_num_hidden_layers: 1๏ผ‰
โ”œโ”€โ”€ tokenizer.json                       # BPE ๅˆ†่ฏๅ™จ
โ”œโ”€โ”€ tokenizer_config.json
โ”œโ”€โ”€ chat_template.jinja                  # Qwen3.6 ๅฏน่ฏๆจกๆฟ
โ”œโ”€โ”€ model.safetensors.index.json         # ๆƒ้‡ๆ˜ ๅฐ„่กจ
โ”œโ”€โ”€ model-00001-of-00003.safetensors     # ~5.0GB๏ผˆไธปๅนฒๅฑ‚ 0-21๏ผ‰
โ”œโ”€โ”€ model-00002-of-00003.safetensors     # ~5.4GB๏ผˆไธปๅนฒๅฑ‚ 22-42 + lm_head๏ผ‰
โ””โ”€โ”€ model-00003-of-00003.safetensors     # ~4.7GB๏ผˆไธปๅนฒๅฑ‚ 43-63 + MTP ๆƒ้‡๏ผ‰

MTP ๆƒ้‡ไฝไบŽๅˆ†็‰‡ 3 ไธญ๏ผŒ้”ฎๅๅฆ‚ไธ‹๏ผˆๅฏๅœจ model.safetensors.index.json ไธญๆŸฅ็œ‹๏ผ‰๏ผš

  • language_model.mtp.fc.weight
  • language_model.mtp.layers.0.input_layernorm.weight
  • language_model.mtp.layers.0.mlp.down_proj.weight
  • language_model.mtp.layers.0.mlp.gate_up_proj.weight
  • language_model.mtp.layers.0.post_attention_layernorm.weight
  • language_model.mtp.layers.0.self_attn.k_proj.weight
  • language_model.mtp.layers.0.self_attn.o_proj.weight
  • language_model.mtp.layers.0.self_attn.q_proj.weight
  • language_model.mtp.layers.0.self_attn.v_proj.weight
  • language_model.mtp.emb.weight
  • language_model.mtp.lm_head.weight
  • ...๏ผˆๅ…ฑ 31 ไธช MTP ๆƒ้‡้”ฎ๏ผ‰

ไฝฟ็”จๆ–นๆณ•

ๅ‘ฝไปค่กŒ็”Ÿๆˆ๏ผš

python -m mlx_lm.generate \
  --model samwang0041/Qwen3.6-27B-MLX-4bit-MTP \
  --prompt "่งฃ้‡Š้‡ๅญ่ฎก็ฎ—" \
  --max-tokens 512 \
  --mtp

Python API๏ผš

from mlx_lm import load, generate

# ๅฆ‚ๆœชๆœฌๅœฐ็ผ“ๅญ˜๏ผŒ่‡ชๅŠจไปŽ HuggingFace ไธ‹่ฝฝ
model, tokenizer = load("samwang0041/Qwen3.6-27B-MLX-4bit-MTP")

response = generate(
    model, tokenizer,
    prompt="่งฃ้‡Š้‡ๅญ่ฎก็ฎ—",
    max_tokens=512,
    verbose=True,
    mtp=True,  # ๅฏ็”จ MTP ๆŠ•ๆœบ่งฃ็ 
)

ไปŽๆœฌๅœฐ่ทฏๅพ„ๅŠ ่ฝฝ๏ผš

# ๅฆ‚ๆžœไฝ ๆ‰‹ๅŠจไธ‹่ฝฝๆˆ–่ฝฌๆข่ฟ‡
model, tokenizer = load("/path/to/qwen3.6-27b-4bit-mtp")

้…ๅˆ omlx ๆœๅŠกๅ™จ๏ผš

ๅœจ ~/.omlx/model_settings.json ไธญๆทปๅŠ ๏ผš

{
  "qwen3.6-27b-4bit-mtp": {
    "mtp_enabled": true,
    "turboquant_kv_enabled": false,
    "dflash_enabled": false,
    "temperature": 1.0,
    "top_p": 0.95,
    "top_k": 20
  }
}

ๆจกๅž‹็›ฎๅฝ•ๅบ”ๆ”พ็ฝฎๅœจ๏ผš

~/.omlx/models/qwen3.6-27b-4bit-mtp/

่ฝฌๆข่ฟ‡็จ‹

ๆœฌๆจกๅž‹้€š่ฟ‡ไปฅไธ‹ๆญฅ้ชค่ฝฌๆข๏ผš

# 1. ๅฎ‰่ฃ…ๆ”ฏๆŒ MTP ็š„ mlx-lm
pip install git+https://github.com/AirRunner/mlx-lm.git@feat/mtp-batched

# 2. ไธ‹่ฝฝๅŽŸๅง‹ๆƒ้‡ๅนถ่ฟ›่กŒ้‡ๅŒ–่ฝฌๆข
python -m mlx_lm convert \
  --hf-path Qwen/Qwen3.6-27B \
  --mlx-path qwen3.6-27b-4bit-mtp \
  -q --q-bits 4 --q-group-size 64

# 3. ๅ…ณ้”ฎ็‚น๏ผšfeat/mtp-batched ๅˆ†ๆ”ฏๅœจ sanitize() ๆ—ถไฟ็•™ไบ† mtp.* ๆƒ้‡
#    ๅฎ˜ๆ–น mlx-lm ๅ‘ๅธƒ็‰ˆไผšไธขๅผƒๅฎƒไปฌ๏ผŒๅฏผ่‡ดๆŠ•ๆœบ่งฃ็ ๅคฑๆ•ˆ

่ฝฌๆขๅœจ Apple M5 Max๏ผˆ64GB ๅ†…ๅญ˜๏ผ‰ไธŠๅฎŒๆˆใ€‚ๅŽŸๅง‹ BF16 ๆƒ้‡็บฆ 54GB๏ผŒ้‡ๅŒ–ๅŽ็บฆ 14.4GBใ€‚

KV Cache ็จณๅฎšๆ€ง

็ป่ฟ‡ๆŒ็ปญๅคš่ฝฎๅฏน่ฏ็š„ๅ……ๅˆ†ๆต‹่ฏ•๏ผˆ10+ ่ฝฎ๏ผŒ15K+ tokens๏ผ‰๏ผš

  • โœ… ๆ—  KV cache ๆŸๅ
  • โœ… ๆ—  SSM ็Šถๆ€ๅ›žๆปš้”™่ฏฏ
  • โœ… ้•ฟไผš่ฏไธญ MTP ๆŽฅๅ—็އ็จณๅฎš
  • โœ… ๅฏไฝœไธบ OpenAI ๅ…ผๅฎน API ๆœๅŠกๅ™จ็”จไบŽ็”Ÿไบง็Žฏๅขƒ

้‡่ฆๆ็คบ

  1. MTP ไธŽ DFlash ไบ’ๆ–ฅ๏ผšไบŒ่€…ๅช่ƒฝ้€‰ไธ€ไธชใ€‚MTP ไฝฟ็”จๆจกๅž‹่‡ช่บซๆƒ้‡๏ผ›DFlash ไฝฟ็”จ็‹ฌ็ซ‹็š„่‰็จฟๆจกๅž‹ใ€‚
  2. MTP ไธŽ TurboQuant KV ไบ’ๆ–ฅ๏ผšMTP ้œ€่ฆ็ฒพ็กฎ็š„ๆณจๆ„ๅŠ›่ฎก็ฎ—่ทฏๅพ„๏ผ›TurboQuant ๅฏน KV cache ๅš่ฟ‘ไผผ๏ผŒไผš็ ดๅ MTP ็š„่‰็จฟ้ชŒ่ฏใ€‚
  3. ไป…ๆ”ฏๆŒ Qwen3.5/3.6 ๆžถๆž„๏ผšMTP ๆ˜ฏ Qwen3.5/3.6 ็‰นๆœ‰็š„ๅŠŸ่ƒฝ๏ผŒๅ…ถไป–ๆจกๅž‹๏ผˆLlamaใ€Gemma ็ญ‰๏ผ‰ๆฒกๆœ‰ๆญค็‰นๆ€งใ€‚
  4. ้œ€่ฆ feat/mtp-batched ๅˆ†ๆ”ฏ๏ผšPyPI ไธŠ็š„ๆญฃๅผ็‰ˆ mlx-lm ๅฐšไธๆ”ฏๆŒ MTP ๆŽจ็†ใ€‚

็›ธๅ…ณ้“พๆŽฅ

่ฎธๅฏ่ฏ

ๆœฌๆจกๅž‹้ตๅพชๅŽŸๅง‹ๆจกๅž‹ Qwen/Qwen3.6-27B ็š„่ฎธๅฏ่ฏ๏ผšApache 2.0

่ฝฌๆขๅ’ŒไธŠไผ ไป…ไพ›็คพๅŒบไฝฟ็”จ๏ผŒไธไฝœไปปไฝ•ๆ˜Ž็คบๆˆ–ๆš—็คบ็š„ๆ‹…ไฟใ€‚


Tags: mlx, qwen, qwen3.6, mtp, multi-token-prediction, speculative-decoding, mlx-lm, apple-silicon, 4bit, quantized, local-llm, inference-acceleration

Keywords: Qwen3.6 MLX conversion, native MTP weights, speculative decoding, multi-token prediction, mlx-lm mtp branch, omlx, Apple Silicon inference, Qwen 27B 4bit, local LLM deployment

Downloads last month
112
Safetensors
Model size
27B params
Tensor type
U32
ยท
BF16
ยท
MLX
Hardware compatibility
Log In to add your hardware

4-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for samwang0041/Qwen3.6-27B-MLX-4bit-MTP

Base model

Qwen/Qwen3.6-27B
Quantized
(760)
this model