模型发布只是开始:为什么 day-0 的 llama.cpp 支持比榜单更重要 qwen38 llama cpp LLM Qwen llama.cpp LocalAI AgentEngineering AI工程
2993 字
15 分钟

模型发布只是开始:为什么 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 embedding51B
MTP4B,包含在模型文件中
原生上下文262,144 tokens
官方描述的可扩展上下文最多 1M tokens
视觉Causal LM + Vision Encoder
MoE512 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 GB
  • UD-Q4_K_XL 四个分片合计约 111.3 GB
  • Q8_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:

Terminal window
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON
cmake --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

Terminal window
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. 先跑一个小上下文#

Terminal window
./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 会根据分片信息继续读取其余文件。如果你的下载工具改变了目录结构,先确认第一片和其它分片在同一目录。

视觉模式再加:

Terminal window
--mmproj ./models/qwen38/mmproj-F16.gguf

--jinja 很重要。它让 server 使用模型的 chat template;工具调用是否正常,还取决于模型模板和当前 llama.cpp 版本,不要只看服务端成功启动就认为 Agent 接入已经完成。

4. 用 OpenAI 兼容接口做第一次请求#

Terminal window
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 #27836PR #27842 都在处理这件事,目前仍是开放/草稿状态。

其中一个公开测试结果是在 M3 Max 128GB、UD-IQ4_XS 上:

配置接受率速度
无 speculation-27.43 tok/s
--spec-draft-n-max 289.2%37.22 tok/s
--spec-draft-n-max 385.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,花了几天。

参考资料#

模型发布只是开始:为什么 day-0 的 llama.cpp 支持比榜单更重要
https://bangwu.me/posts/qwen38-llama-cpp/
作者
棒无
发布于
2026-08-28
许可协议
CC BY-NC-SA 4.0