DeepSeek-V4 实测:谦虚的官方,靠谱的模型
起因
MNN-LFM2 这个任务已经成为我评估编程模型的固定标尺。前三篇文章里,测过的七个模型形成了清晰的三个梯队:
- 第一梯队(一次通过):Claude Opus 4.6、GPT-5.4
- 第二梯队(提醒后通过):MiMo-V2-Pro、GLM-5
- 第三梯队(未通过):Kimi-K2.5、MiniMax-M2.7、Qwen3-Max
前三篇发出后我又补测了 GLM-5.1,也是一次通过——算是国产模型第一次踏进第一梯队,但当时没有单独成文。这次 DeepSeek-V4 千呼万唤始出来,官方发布时相当谦虚:自评达到 Opus 4.6 (no think) 水平,与 Opus 4.6 (think) 还有一定差距。这种敢于把自己和国际 SOTA 放在同一把标尺上、还公开承认差距的态度,在当下的国产模型发布里已经不多见。
我第一时间跑了同一个 LFM2 任务。结果:API 30 分钟、Wall 44 分钟、实际花费 ¥12,端到端一次通过,零人工介入——在这个连第二梯队都跨不过去的真实工程任务上,DeepSeek-V4 跟 Opus 4.6 (think) 表现没有拉开差距。¥12 也是所有一次通过模型里最便宜的。
任务回顾
任务不变:在 MNN 推理引擎中从零添加 LFM2 模型支持,跨 Python 导出 + C++ 推理两端协同,理解 ShortConv(短卷积门控线性注意力)的语义并正确实现。一条指令触发全程,没有方向性引导。
从前几次测试归纳,模型在这个任务上的六大易错点:
- 架构决策:创建新算子 vs 复用 LinearAttention,前者要改 schema/converter/shape inference,错一处就崩(M2.7、Qwen3-Max)
- ONNX 导出路径:必须通过
FusedLinearAttention自定义算子桥接 Python 和 C++(Kimi-K2.5 漏了) - 卷积方向:cross-correlation 还是 convolution,搞反数值就不对(M2.7)
- 算子边界:融合算子内部已经算了
C * conv(B*x),外部不能重复乘 C(M2.7) - 状态管理:滑动窗口应保存卷积输入而非输出(M2.7)
- Python/C++ 语义一致:Python 注释”NO SiLU”,C++ 就不能加 SiLU(Kimi-K2.5)
测试结果
| 指标 | 数据 |
|---|---|
| 工具 | Claude Code |
| API 耗时 | 30m 29s |
| Wall 耗时 | 44m 4s |
| 代码变更 | +430 / -57 |
| Token 用量 | 253k input + 77.3k output + 8.82M cache read |
/cost 推算 | $7.60 |
| 实际花费 | ¥12(约 $1.65) |
| 最终结果 | 一次通过,零人工介入 |
Token 分两档:deepseek-v4-pro(164.1k/57.2k/8.2M cache,$6.35)+ deepseek-v4-flash(88.9k/20.1k/621.8k cache,$1.26)。/cost 显示的 $7.60 是按 Claude 费率推算的,并非实际扣费——DeepSeek-V4 的实际单价远低于 Claude。
值得一提的是双模型协同:pro 负责深度推理和代码生成(output 占比 74%),flash 承接轻量任务(如文件扫读、简单判断)。这种”大模型思考 + 小模型执行”的自动分工,是 ¥12 总价能打下来的结构性原因——不需要所有 token 都上 pro 档。
代码分析
DeepSeek-V4 修改 8 个文件、+331/-58 有效改动,全部命中关键路径:
source/backend/cpu/CPULinearAttention.{cpp,hpp} +137/-5
source/backend/opencl/execution/buffer/LinearAttentionBufExecution.cpp +4/-0
transformers/llm/export/utils/model_mapper.py +56/-0
transformers/llm/export/utils/transformers.py +123/-49
transformers/llm/export/utils/{config,custom_op,model}.py +11/-4
架构决策:复用 FusedLinearAttention,通过 attn_type == "short_conv" 分支区分,不创建新算子、不动 schema、不动 converter——和第一梯队其他模型一致的轻量路径。六大易错点 1、2、3、4、5、6 全部命中。
Python 侧细节:config.py 新增 linear_mix 注意力类型(LFM2 同时存在 full_attention 和 conv 层,前几次测试里所有模型都没明确处理这个分类)。transformers.py 把 LinearAttention 重构为 short_conv / gated_delta_rule 双模式的统一类,原路径代码未受污染。ONNX 导出时用 dummy gate/beta 占位以匹配融合算子签名,把切分/gate/卷积/状态全部封装进 C++。
C++ 侧细节:CPULinearAttention::short_conv_mnn 卷积方向正确(padded[l+k] * weight[k]),滑动窗口存的是卷积输入而非输出,prefill/decode 按 seqLen > 1 自动分流,多线程按 B*H channel 并行。
两个非任务核心的细节,是拉开梯队差距的关键:
-
OpenCL 显式 fallback:
FusedLinearAttention的 OpenCL 实现只支持 gated_delta_rule,DeepSeek-V4 在LinearAttentionBufExecution.cpp里加了 4 行,识别 short_conv 时返回nullptr让框架自动回退到 CPU。既没崩溃,也没写半成品 kernel。这种”知道自己不知道”的克制,其他模型都没做到。 -
Mlp 健壮性修复:原
Mlp.__init__无条件访问self.experts,LFM2 是 Dense 模型会抛 AttributeError。DeepSeek-V4 加了if self.is_moe:守卫,并给act_fn加了 silu fallback(LFM2 的 FeedForward 没有act_fn属性)。这两处都是执行测试时遇到报错后自主修复的——也是它能一次通过的直接原因。
横向对比
加入 DeepSeek-V4 和 GLM-5.1 后的完整对比:
| 模型 | 结果 | API 耗时 | 实际花费 | 有效代码 |
|---|---|---|---|---|
| Claude Opus 4.6 | 一次通过 | 14m 30s | ~¥45 | +414 |
| GPT-5.4(xhigh) | 一次通过 | 20 min | $3.34(~¥24) | +351 |
| GLM-5.1 | 一次通过 | ~30 min | - | - |
| DeepSeek-V4 | 一次通过 | 30m 29s | ¥12 | +331 |
| MiMo-V2-Pro | 提醒后通过 | 28m 40s | ¥25.68 | +297 |
| GLM-5 | 提醒后通过 | 46m 25s | $152.84 | +934 |
| Kimi-K2.5 | 推理失败 | 1h 55m | $108.57 | +486 |
| MiniMax-M2.7 | 推理失败 | 53m 31s | ¥29 | +451 |
| Qwen3-Max | 推理崩溃 | 1h 3m 39s | $117.05 | +386 |
价格维度:¥12 是目前所有一次通过模型里最低的——大约 Opus 4.6 的 1/4、GPT-5.4 的 1/2。
Token 效率维度,一次通过的四个模型形成鲜明梯度:
| 模型 | input tokens | output tokens |
|---|---|---|
| Claude Opus 4.6 | 15.5K | 40.1K |
| DeepSeek-V4 | 253K | 77.3K |
| GLM-5.1 | 9.38M | 30.6K |
| GPT-5.4 | 1.67M* | 27.1K |
*GPT-5.4 首测数据,xhigh 模式下未单独统计。
Opus 4.6 的 token 效率断崖式领先,input 少了两个数量级——几乎是”读一遍文件就知道怎么写”的水平。DeepSeek-V4 比 GLM-5.1 省了约 37 倍 input token,是目前国产模型里最精准的一档。GLM-5.1 虽然也一次通过,但 input 接近千万级,反映出它更依赖”大面积反复阅读代码”的策略——能跑通,但效率低。
耗时:DeepSeek-V4 和 GLM-5.1 都在 30 分钟左右,略慢于 Opus(14 分)和 GPT-5.4(20 分),仍在可接受范围。
顺手修 bug 维度:一次通过的四个模型里,只有 DeepSeek-V4 主动修复了非任务范围内的问题(Mlp.__init__ 对非 MoE 模型的健壮性、OpenCL 后端对 short_conv 的显式 fallback);GPT-5.4 的贡献是主动写了单元测试;Opus 4.6 和 GLM-5.1 只完成任务本身。这种”全局意识”在复杂工程任务中是很可贵的品质。
结论
梯队更新
| 梯队 | 模型 |
|---|---|
| 一次通过 | Claude Opus 4.6、GPT-5.4、GLM-5.1、DeepSeek-V4 |
| 提醒后通过 | MiMo-V2-Pro、GLM-5 |
| 未通过 | Kimi-K2.5、MiniMax-M2.7、Qwen3-Max |
从前三篇到今天,国产模型一路在逼近”一次通过”这条线:GLM-5 没过 → M2.7 失败 → MiMo-V2-Pro 提醒后通过 → GLM-5 提醒后通过 → GLM-5.1 终于一次通过 → DeepSeek-V4 再次一次通过,且价格打到 ¥12。拐点不是一个模型造成的,是接连两代模型的持续跨越。
“最后一公里”是什么
对比 MiMo-V2-Pro(提醒后通过)和 DeepSeek-V4(一次通过),两者核心架构决策几乎完全一致(都复用 LinearAttention、卷积方向都对)。差距全在 Mlp.__init__ 那种非任务核心的地方——DeepSeek-V4 跑测试时遇到 AttributeError,自己加了 is_moe 守卫、自己给 act_fn 加了 fallback;顺便识别出 OpenCL 后端的边界,显式 fallback 到 CPU。
第一梯队的本质不是把核心逻辑写对,而是把运行时遇到的所有问题都解决到代码真的能跑为止。 实现完成不等于任务完成,跑通才是。
写在最后
LFM2 的 Dense 部分已经成了一个不错的标尺。MoE / VL / Audio 三个更复杂的变体还等着被测试——目前只在 Claude Opus 4.6 上验证过全部通过,其他模型还没来得及测。第一梯队里开始出现国产选手之后,后续的加码空间也就打开了。
官方谦虚自评对标 no think,实测却和 think 打成平手——在一个充斥着夸大宣传的行业里,这种”说少做多”的姿态值得一记。
国产模型的拐点,好像真的来了。
Enjoy Reading This Article?
Here are some more articles you might like to read next: