昨天,Daniel Han(UnslothAI 创始人)又把完整 Qwen3.6+MTP Guide 补全了,包括需要哪个 PR 分支、怎么编译、不同模式的参数、官方 benchmarks
我感觉这是本地部署+Claude Code一个极佳选择,虽然之前介绍的已经很详细了,忍不住把整个流程串起来再分享一下
❝ Qwen3.6 27B 现在能跑到 140 tokens/s,35B-A3B 能跑到 220 tokens/s,相比原始 GGUF 直接 >1.4x 加速、精度不变MTP 是什么、为什么能更快
简单一句话:MTP(Multi Token Prediction)= 投机解码的「自带 draft model」版本
普通投机解码要你额外维护一个小模型当 draft,挺麻烦。Qwen3.6 在训练时就内置了 MTP 头:
模型一次性预测「未来几个 token」
主模型并行把这几个 token 验证一遍
接受率高的部分直接吐出去,少跑几次前向
实际跑下来:
dense 模型 (27B):draft tokens = 2 时平均 1.4x 加速
MoE 模型 (35B-A3B):平均 1.15–1.2x 加速
下图是 Unsloth 官方给出的 MTP 加速曲线和吞吐对比:
为什么 --spec-draft-n-maxcode> 卡在 2?官方测了一下:draft tokens 从 2 涨到 4 时,接受率从 **83% 直接掉到 50%**,前向开销反而把收益吃光
所以别贪心
编译:必须用特定的 llama.cpp PR 分支
这是最容易踩的坑 —— 不能直接用 master 的 llama.cpp
MTP 的支持还在合并中,要用 Aman 的 PR 分支(ggml-org/llama.cpp#22673)
完整编译命令(Linux / WSL,要 CUDA 改 -DGGML_CUDA=ON):
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone -b mtp-clean https://github.com/am17an/llama.cpp.git
cmake llama.cpp -B llama.cpp/build -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-cli llama-server
cp llama.cpp/build/bin/llama-* llama.cpp
Mac / Metal 设备改成 -DGGML_CUDA=OFF 即可,Metal 默认就开
⚠️ CUDA 13.2 千万别用,NVIDIA 自己确认有 bug,会输出乱码
跑起来:27B 与 35B-A3B 的实操命令
27B MTP(thinking 模式,通用任务):
export LLAMA_CACHE="unsloth/Qwen3.6-27B-MTP-GGUF"
./llama.cpp/llama-cli \
-hf unsloth/Qwen3.6-27B-GGUF:UD-Q4_K_XL \
--temp 1.0 --top-p 0.95 --top-k 20 \
--presence-penalty 1.5 --min-p 0.00 \
--spec-type mtp --spec-draft-n-max 2
35B-A3B MTP(non-thinking 模式起 server,方便对接 OpenAI 兼容客户端):
export LLAMA_CACHE="unsloth/Qwen3.6-35B-A3B-MTP-GGUF"
./llama.cpp/llama-server \
-hf unsloth/Qwen3.6-35B-A3B-MTP-GGUF:UD-Q4_K_XL \
--temp 0.7 --top-p 0.8 --top-k 20 \
--presence-penalty 1.5 --min-p 0.00 \
--spec-type mtp --spec-draft-n-max 2 \
--chat-template-kwargs '{"enable_thinking":false}'
一些容易忽略的参数:
thinking 模式 用
temperature=1.0, top_p=0.95, presence_penalty=1.5non-thinking 模式 用
temperature=0.7, top_p=0.8, presence_penalty=1.5精确编程任务统一压到
temperature=0.6/1.0,presence_penalty=0.0想关掉 thinking:
--chat-template-kwargs '{"enable_thinking":false}'输出乱码大概率是上下文长度太小,或者加上
--cache-type-k bf16 --cache-type-v bf16试试
按总内存(VRAM + 系统 RAM 或 unified memory)算:
模型
2-bit
4-bit (UD-Q4_K_XL)
8-bit
BF16
Qwen3.6-27B
15 GB
18 GB
30 GB
55 GB
Qwen3.6-35B-A3B
17 GB
23 GB
38 GB
70 GB
不够的话 llama.cpp 还能 SSD/HDD offload,只是会慢
⚠️ 目前 Ollama 跑不了 Qwen3.6 GGUF(mmproj 视觉文件是分开的),用 llama.cpp 路线就对了
One More Thing:用本地 Qwen3.6 驱动 Claude Code
跑起来不接 Agent 就有点亏。Unsloth 在 docs/basics/claude-code 里把整条流水线写得很完整,我把关键步骤拎出来
第一步:装 Claude Code
curl -fsSL https://claude.ai/install.sh | bash
cd ~/projects/my-project
claude
第二步:起本地 llama-server(接前面 35B-A3B 的命令)
./llama.cpp/llama-server \
--model unsloth/Qwen3.6-35B-A3B-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_XL.gguf \
--alias "unsloth/Qwen3.6-35B-A3B" \
--temp 0.6 --top-p 0.95 --top-k 20 --min-p 0.00 \
--ctx-size 16384 --port 8001
第三步:踩坑预警 —— 一个让推理慢 90% 的隐藏开关
这是文档里我觉得全网最值得抄的一条:
❝ Claude Code 最近开始往请求里加一个 Claude Code Attribution Header,这玩意儿会让 KV Cache 失效,本地模型推理直接慢 90%
而且更坑的是 export CLAUDE_CODE_ATTRIBUTION_HEADER=0不管用
必须改 ~/.claude/settings.json,在 env 段里加:
{
"env": {
"CLAUDE_CODE_ATTRIBUTION_HEADER": "0"
}
}
第四步:把 Claude Code 指向本地端口
export ANTHROPIC_BASE_URL="http://127.0.0.1:8001"
export ANTHROPIC_AUTH_TOKEN="sk-no-key-required"
export ANTHROPIC_MODEL="unsloth/Qwen3.6-35B-A3B"
再 claude 就能在终端用本地 Qwen3.6 跑 Agent 了。Unsloth Studio 那条路(带 web UI + 自带 API key + 自愈式 tool calling)也写得很清楚,喜欢图形界面的可以走那条:
总结
挑重点:
MTP 不是新模型,是一种 draft-free 的投机解码 ,靠 Qwen3.6 训练时自带的 MTP 头实现
--spec-draft-n-max 2是甜点位,多了反而慢必须用 Aman 的 PR 分支,不能用 master
CUDA 13.2 别碰
接 Claude Code 一定记得改
~/.claude/settings.json关掉 Attribution Header,不然你本地速度优化全白做
适合谁:
24GB 显存的本地玩家 :27B MTP + Q4 量化是新甜点
小作坊和私有化部署 :拿 35B-A3B 跑 server 接 Claude Code,足够日常代码 Agent
不接受 Ollama 短板的用户 :直接 llama.cpp + MTP
.6
制作不易,如果这篇文章觉得对你有用,可否点个关注。给我个三连击:点赞、转发和在看。若可以再给我加个,谢谢你看我的文章,我们下篇再见!
热门跟贴