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(短卷积门控线性注意力)的语义并正确实现。一条指令触发全程,没有方向性引导。

从前几次测试归纳,模型在这个任务上的六大易错点:

  1. 架构决策:创建新算子 vs 复用 LinearAttention,前者要改 schema/converter/shape inference,错一处就崩(M2.7、Qwen3-Max)
  2. ONNX 导出路径:必须通过 FusedLinearAttention 自定义算子桥接 Python 和 C++(Kimi-K2.5 漏了)
  3. 卷积方向:cross-correlation 还是 convolution,搞反数值就不对(M2.7)
  4. 算子边界:融合算子内部已经算了 C * conv(B*x),外部不能重复乘 C(M2.7)
  5. 状态管理:滑动窗口应保存卷积输入而非输出(M2.7)
  6. 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_attentionconv 层,前几次测试里所有模型都没明确处理这个分类)。transformers.pyLinearAttention 重构为 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 并行。

两个非任务核心的细节,是拉开梯队差距的关键

  1. OpenCL 显式 fallbackFusedLinearAttention 的 OpenCL 实现只支持 gated_delta_rule,DeepSeek-V4 在 LinearAttentionBufExecution.cpp 里加了 4 行,识别 short_conv 时返回 nullptr 让框架自动回退到 CPU。既没崩溃,也没写半成品 kernel。这种”知道自己不知道”的克制,其他模型都没做到。

  2. 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:

  • Claude有多大?从推理速度反推参数量
  • TurboQuant:一篇论文砸崩存储股价?MNN在手机上跑通了
  • Google Stitch 体验:解决 CC 写 UI 的痛
  • MNN 任务实测:七个模型,三个梯队
  • MiMo-V2-Pro 测评:同一模型,两种结局