模型发布只是开始:为什么 day-0 的 llama.cpp 支持比榜单更重要
先说结论
我现在看一个开源模型,已经不会先看它在榜单上排第几了。我会先看另一个时间:
从模型发布,到主流推理后端真正支持,中间隔了多久。
我暂时把它叫作 release-to-runtime latency。
Qwen3.8-Flash-Next 这次很典型:8 月 26 日发布,llama.cpp 的主支持 PR 在 8 月 27 日合并。一天左右,模型从「仓库里有权重」变成「普通开发者可以用熟悉的本地推理工具启动」。这比一条“超过谁”的横评标题,更接近真实的生态进展。
但「支持已合并」也不等于「所有机器都适合生产」。Qwen3.8-Flash-Next 的 n-gram embedding 很吃内存,主线之后仍有 SM110、SM121、AMD HIP、并发请求等问题在跟踪,原生 MTP 也还在单独的开放 PR 里。
所以这篇不做“Qwen 又赢了”的结论。我更想把这条链路拆开:一个模型到底怎样才算真正到达开发者手里。
这次我没有在本机下载 75GB 以上的权重,也没有伪造自己的 tokens/s。下面的硬件数据分别来自 Qwen 官方模型卡、Unsloth 运行指南、llama.cpp 的合并 PR 和公开 issue;社区结果会明确标成社区结果。
Qwen3.8-Flash-Next 到底是什么
Qwen 官方把它定位成 Qwen4 架构的早期预览,而且是 open-weight,不是一个单纯的 Qwen3 小版本。
规格先摆在这里:
| 项目 | Qwen3.8-Flash-Next |
|---|---|
| 主模型参数 | 125B |
| 每 token 激活参数 | 6B |
| n-gram embedding | 51B |
| MTP | 4B,包含在模型文件中 |
| 原生上下文 | 262,144 tokens |
| 官方描述的可扩展上下文 | 最多 1M tokens |
| 视觉 | Causal LM + Vision Encoder |
| MoE | 512 experts,10 routed + 1 shared |
它的结构有几个地方直接影响本地部署:
- Gated DeltaNet 和 Qwen Sparse Attention(QSA)混合,QSA 按 micro-block 选择上下文
- 4 路 Gated Residual
- 51B 的 n-gram embedding,官方设计上允许更多地向主机内存卸载
- 另外有 MTP draft head,后续可以用于 speculative decoding
这解释了一个容易被误解的地方:6B 激活不等于 6B 内存。
MoE 的“每 token 只计算一小部分”主要影响计算量,不会把所有权重从文件和内存需求里抹掉。尤其是这个 51B 的 n-gram embedding,更像一个很大的查表结构。它可能不需要像普通 dense 参数一样参与每一步矩阵乘法,但仍然要被加载、映射或放到别的存储层里。
目前公开的 GGUF 文件也说明了这一点。我查到的 Unsloth 仓库里:
UD-IQ1_M三个分片合计约 74.5 GB(十进制)UD-IQ4_XS三个分片合计约 93.7 GBUD-Q4_K_XL四个分片合计约 111.3 GBQ8_0六个分片合计约 188.2 GB
这只是模型文件大小,不是完整运行时需求。上下文 KV cache、临时计算 buffer、系统内存余量和视觉 projector 都还要占空间。
Unsloth 的运行指南给出的经验线是:最小量化至少需要 75GB RAM 或 unified memory,实际更建议 96GB。这个范围更像“能开始尝试”的门槛,不应该直接理解成“任何 75GB 机器都能舒服地跑”。
发布到可用,中间差了什么
我现在会把模型接入想成这样一条链:
权重 / 配置 ↓模型格式与 converter ↓计算图与特殊算子 ↓量化、分片、内存布局 ↓CPU / CUDA / Metal / HIP 等后端 ↓chat template、工具调用、视觉输入 ↓单请求正确性 ↓长上下文、并发、持续负载 ↓真正适合接入 Agent榜单通常只覆盖中间某一小段:给模型一批输入,看它输出什么。
而本地 Agent 真正会遇到的是另一组问题:
- 能不能在自己的硬件上加载
- 模型文件是不是完整的分片集合
- n-gram 表应该放 GPU、CPU 还是统一内存
- 上下文变长后速度会不会突然塌掉
- 工具调用格式是否被正确解析
- 第二个并发请求进来时会不会崩
- OOM 或请求取消之后,服务还能不能继续用
这就是为什么我觉得 day-0 runtime support 比一张 benchmark 表更重要。它不是说 benchmark 没有价值,而是说 benchmark 不能替代“模型能不能被使用”这件事。
llama.cpp 这次到底做了多少工作
Qwen 官方 README 现在直接写了 llama.cpp supports the Qwen3.8-Flash-Next (text & vision)。对应的主线支持来自 PR #27742,已经在 8 月 27 日合并。
这个 PR 不是加一个模型名称那么简单,改动涉及 28 个文件,主要包括:
- 新增
qwen4exp模型转换逻辑 - 新增 Qwen4Exp 的计算图
- 支持 QSA sparse attention
- 接入 vision 路径
- 处理 n-gram embedding 的加载和查表
- 修复量化器和 tensor type fallback
- 增加混合内存和缓存相关逻辑
- 补充模型结构 roundtrip 检查
PR 作者还给出了几类对照验证:
- wikitext-2 perplexity:实现 4.0068,对照实现 4.0126
- prose 512 tokens 的 top-1 agreement:98.0%
- QSA 在预算以下与 dense 路径 bit-identical
- CPU、CUDA、Metal 的模型结构检查通过
这些数据应该按“PR 作者在该实现上的验证”来读,不是我重新跑出的独立 benchmark,也不等于所有量化和硬件配置都已经稳定。
真正值得注意的是,llama.cpp 这次把模型的特殊结构接进了一个很多人已经熟悉的入口。对开发者来说,学习成本从“再学一套新的推理框架”降成了“更新 llama.cpp、准备一份 GGUF、调几项参数”。这就是 runtime support 的价值。
最小启动路径
如果只是想验证文本推理,建议先用一个保守的上下文长度,不要上来就挑战 262K。
1. 编译 llama.cpp
NVIDIA CUDA:
git clone https://github.com/ggml-org/llama.cppcd llama.cppcmake -B build -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ONcmake --build build --config Release -j \ --target llama-cli llama-server llama-mtmd-cli llama-gguf-split没有 NVIDIA GPU 时,去掉 -DGGML_CUDA=ON,按 CPU 或本机对应后端编译。这里故意没有写一个“万能参数”:不同硬件的后端、驱动和内存布局差异足够大,直接复制别人的 -ngl、--tensor-split 往往比少跑几 tokens/s 更危险。
2. 下载一份 GGUF
例如先下载 UD-IQ4_XS:
pip install -U "huggingface_hub[cli]"
hf download unsloth/Qwen3.8-Flash-Next-GGUF \ --local-dir ./models/qwen38 \ --include 'UD-IQ4_XS/*' 'mmproj*'这个量化大约 93.7GB,机器没有足够内存时不要直接执行。你也可以把 UD-IQ4_XS 换成更小的量化,但要接受质量和速度的变化。
视觉输入需要 mmproj。只做文本测试时可以先不加载它。
3. 先跑一个小上下文
./build/bin/llama-server \ --model ./models/qwen38/UD-IQ4_XS/Qwen3.8-Flash-Next-UD-IQ4_XS-00001-of-00003.gguf \ --alias qwen38 \ --jinja \ --ctx-size 32768 \ --host 127.0.0.1 \ --port 8000分片模型通常传第一片即可,loader 会根据分片信息继续读取其余文件。如果你的下载工具改变了目录结构,先确认第一片和其它分片在同一目录。
视觉模式再加:
--mmproj ./models/qwen38/mmproj-F16.gguf--jinja 很重要。它让 server 使用模型的 chat template;工具调用是否正常,还取决于模型模板和当前 llama.cpp 版本,不要只看服务端成功启动就认为 Agent 接入已经完成。
4. 用 OpenAI 兼容接口做第一次请求
curl http://127.0.0.1:8000/v1/chat/completions \ -H 'Content-Type: application/json' \ -d '{ "model": "qwen38", "messages": [ {"role": "user", "content": "用三句话解释 QSA 解决了什么问题。"} ], "temperature": 0.6, "max_tokens": 256 }'第一轮只验证四件事:
- 模型能否加载
- 普通文本是否连贯
- server 是否能稳定返回 OpenAI 兼容响应
- 上下文从 4K、8K 增长到 32K 时,速度和内存是否出现异常变化
不要一开始就把它接到长程 Agent 上。先把模型、后端、模板和内存问题分开,排错会快很多。
“支持已合并”后仍然要看什么
这次的后续 issue 很能说明问题。
1. 特定 GPU 可能输出乱码
Issue #27763 报告了 Jetson Thor / SM110 上的情况:
-ngl 8时输出连贯-ngl 9或更多层放到 GPU 时输出变成乱码-ngl 0纯 CPU 时恢复连贯
这说明“CUDA 支持”不是一个二值开关。GPU 架构、offload 层数、特殊 tensor 的放置方式,都可能改变结果。
2. 长上下文和后端有关
Issue #27856 记录了 AMD Strix Halo / HIP 路径上的长上下文速度下降:短上下文约 19 到 21 tok/s,超过约 1K context 后下降到约 5.5 到 6.1 tok/s,45K 时约 4.6 tok/s。
同一个 issue 里,CUDA 设备上的衰减没有表现出同样幅度。这个结果不能外推成“AMD 不行”,但足够说明:模型架构的长上下文收益,最终要经过具体后端才能兑现。
3. 单请求通过,不等于服务能扛并发
Issue #27835 报告了 CUDA 下第二个并发连接进入后 server 崩溃的问题。单请求、工具调用、结构化输出都正常,不代表两个请求同时进来仍然正常。
如果你的目标是本地 Agent 服务,至少要测:
- 两个并发请求
- 一个长请求期间插入一个短请求
- 请求取消后再发请求
- 上下文接近上限时的内存变化
- 工具调用连续失败后的恢复
4. MTP 仍是另一条线
主支持 PR 合并时,Qwen3.8-Flash-Next 自带的 MTP draft head 还没有完整接入。后续的 PR #27836 和 PR #27842 都在处理这件事,目前仍是开放/草稿状态。
其中一个公开测试结果是在 M3 Max 128GB、UD-IQ4_XS 上:
| 配置 | 接受率 | 速度 |
|---|---|---|
| 无 speculation | - | 27.43 tok/s |
--spec-draft-n-max 2 | 89.2% | 37.22 tok/s |
--spec-draft-n-max 3 | 85.7% | 38.83 tok/s |
这是 PR 作者的测试结果,不是所有机器的承诺。但它说明了一个方向:模型发布之后,推理后端还会继续围绕速度、内存和 draft head 做很长一段工程工作。
我现在会怎样评估一个新模型
以后遇到新模型,我会按下面这张表走,不再只看发布当天的榜单:
| 检查项 | 我想知道什么 |
|---|---|
| Release-to-runtime latency | 发布后多久进入 llama.cpp、vLLM、SGLang、MLX 等主流后端 |
| 最小可运行配置 | 最小量化、最低 RAM/VRAM、是否需要特殊 offload |
| 首 token 和持续解码 | 短 prompt、长 prompt、不同 context 深度分别是多少 |
| 量化覆盖 | Q4、Q5、Q8 或动态量化是否都有可用版本 |
| 工具调用 | chat template、parser、参数 JSON 是否稳定 |
| 多模态 | mmproj、图片输入、图片 token 上限是否正常 |
| 后端差异 | CUDA、Metal、HIP、CPU 是否出现明显行为分叉 |
| 长任务稳定性 | 连续几十轮、请求取消、OOM 后是否能恢复 |
| 并发 | 两个以上请求是否能稳定工作 |
| 复现成本 | 其他人能否按同一套命令复现结果 |
其中最重要的不是某一项的峰值,而是从模型权重到工作流之间的摩擦有多大。
一个分数稍低、但当天就能被 llama.cpp、MLX 和一个 OpenAI 兼容 server 接住的模型,实际影响力可能超过一个榜单更高、但只能在官方 API 里调用的模型。因为前者已经进入了别人的程序、脚本和 Agent,后者还停留在产品页面里。
最后
Qwen3.8-Flash-Next 这次真正值得记住的,不是“6B 激活”或者某个横评标题,而是它让一条判断变得更清楚:
开源模型的竞争,已经不只发生在训练和 benchmark 上,也发生在它多久能进入开发者已经在用的 runtime。
llama.cpp day-0 支持,是这个模型生态成熟度的信号;后续 issue,则提醒我们别把“能加载”误写成“能生产”。
我会继续看榜单,但以后会在旁边多记一列:release 到 runtime,花了几天。