大数跨境

Qwen3.8-27B是真能打!我们烧了7.3亿token用76个小时复测,挤掉官宣水分,Qwen27B力压比自己大十倍的DeepSeek284B!

Qwen3.8-27B是真能打!我们烧了7.3亿token用76个小时复测,挤掉官宣水分,Qwen27B力压比自己大十倍的DeepSeek284B! 象信AI
2026-09-16
24
导读:Qwen27B力压比自己大十倍的DeepSeek284B!


DeepSeek 和 Qwen 都在拿 Terminal-Bench 成绩做宣传。我们把 89 道题原样跑了一遍——两个模型都低于官方数字,但缩水幅度差了三倍多。所有原始记录已公开,欢迎来查。


342 次任务运行 · 7.34 亿 token · 76.6 小时 · 8×A800 80GB

01 / 结论:实测成绩与注水率

89 道题,每题跑一次,全部轨迹公开可查。

模型 / 脚手架
实测/声称
注水率
Qwen3.8-27B

terminus-2(原生)
68.5%/73.0%
6.1%
DeepSeek-V4-Flash-0731

DeepSeek 自家 harness
65.2%/82.7%
21.2%
DeepSeek-V4-Flash-0731

terminus-2(原生)
61.8%/82.7%
N/A

注水率 =(声称 − 实测)÷ 声称。Qwen 缩水 4.5 个百分点,DeepSeek 缩水 17.5 个百分点。哪怕让 DeepSeek 用自己家的 harness,它离 82.7 也还差得远。

两条必须说在前面的限制

一、我们只跑一次,官方通常跑多次取平均。单次采样有真实波动。同一道 configure-git-webserver,同一个模型、同一个 harness,我们在冒烟测试里跑通过了,主跑里却失败了。所以「注水率」应理解为「我们这一次没能复现出来的差距」,不是精确的虚报幅度。

二、两个模型之间的差距不显著。68.5% 和 65.2% 配对检验只净胜 3 题(p=0.68),落在噪声里。这张表能说明的是「两个模型都没到宣称水平」,不能说明 Qwen 比 DeepSeek 强。

但有一个差别是稳的:同一个 DeepSeek 模型,换个脚手架差 3 题(65.2% vs 61.8%)。脚手架对分数的影响,和模型之间的差距是同一个量级。以后看到任何 Terminal-Bench 成绩,先问一句:用的什么 harness。

02 / 方法:我们怎么判对错

判分权不在我们手里。每道题自带测试脚本,跑完由它说了算。我们不改测试、不人工判断"做得对不对"。

唯一需要我们定规则的地方,是哪些失败不该算到模型头上。三条线用同一把尺子:

基础设施故障 → 不算失败,重跑镜像挂了、容器没起来、客户端超时——这些跟模型能力无关。修好环境后真重跑一遍,以重跑结果为准。不估算、不推测。

产物正确 → 算过有些题要求起一个服务。如果 agent 把服务建对了、自己也验证通过了,只是进程没活到测试那一刻,算它过——真实场景里用户会自己把服务启起来。但必须在它自己的日志里找到证据。

90 分钟用完没做完 → 算失败这条不通融。做得慢也是能力问题。


第二条最容易被质疑"放水",所以说清楚它的实际效果:这条规则只有 DeepSeek 自家 harness 涨了 3 分,另外两条线一分没涨。原因很实在——只有它会在收尾时杀掉后台进程。

被这条规则判的三道,证据是日志里的具体某一行:

pypi-server         seq 46
  Successfully installed vectorops-0.1.0
  ← 正是测试脚本要执行的那条命令

kv-store-grpc       seq 41
  SetVal: val: 42
  GetVal: val: 42

hf-model-inference  seq 89
  200 {"sentiment":"POSITIVE"}

同样这条规则下判不过的两道:

  • mailman——服务活着,但它自己的测试显示退订没生效(member before leave? True → t+2s member=True)。产物就是错的。
  • install-windows——虚拟机检测项通过了,证明进程活得好好的;真正挂的是按键之后画面没变化,Windows 根本没进图形界面。

两条 terminus-2 线的"服务类"失败题,没有一道是进程死掉导致的,全是老实答错:虚拟机执行结果不对、棋步走错、起跳帧算成 242(正确区间 219–223)。所以它们一分没涨不是被区别对待,是确实没有符合条件的题。

03 / 错题分析:Qwen3.8-27B 错的 28 道

修完所有环境问题之后,Qwen 仍然失败 28 题。按错法分四类。

一类:压根没写出文件(6 道)

不是做错,是做到时间用完都没产出结果。测试脚本第一步就找不到文件。

任务
情况
报错
extract-moves-from-video
跑了 154 步,答案文件还是不存在。不是不会做,是在过程里迷路了,始终没收敛到"把答案写进文件"这个动作。这道最能说明问题
File /app/solution.txt does not exist
write-compressor
只走了 7 步就耗尽时间,压缩文件没生成
File /app/data.comp does not exist
path-tracing-reverse
60 步,要反推出的 C 源文件没写出来
File /app/mystery.c does not exist
dna-assembly
22 步,引物序列文件缺失
File /app/primers.fasta does not exist
feal-linear-cryptanalysis
56 步做线性密码分析,连输入的明文文件都没准备好
FileNotFoundError: '/app/plaintexts.txt'
winning-average-corewar
65 步,Corewar 战士程序没写出来
my_warrior.red file not found

二类:做到一半超时(4 道)

有产出,但没做完,卡在最后一步。

任务
情况
报错
gpt2-codegolf
要用尽量少的代码写个 GPT-2 推理。C 代码写出来了,但编译不过
Compilation failed: /app/gpt2.c
install-windows-3.11
112 步。虚拟机装起来了、核心文件检测也过了,但配套的 nginx 没起在 80 端口。四项测试过两项
nginx not listening on port 80
make-doom-for-mips
58 步,MIPS 模拟器没能跑出第一帧画面
Timeout waiting for frame.bmp
make-mips-interpreter
50 步,同上,解释器没跑到出图
Timeout waiting for frame.bmp

三类:做完了,但算错(16 道)

这类最值得看——东西都交了,就是答案不对。

任务
错在哪
raman-fitting
拟合拉曼光谱的峰位。正确答案 x0=1580.3,它给出 19196.5,差了一个数量级。不是精度问题,是拟合根本没收敛
extract-elf
从 ELF 二进制里提取数据,要求命中 75% 以上,实际命中 **0.00%**。方法整个是错的
video-processing
分析跳跃视频的起跳帧。正确区间 219–223,它算出 242。差 19 帧,思路对、判据偏了。五项过四项
model-extraction
从神经网络反推权重矩阵。30 行里错了 10 行
protein-assembly
融合蛋白的片段顺序拼错了。要求 flag-donor-dhfr-acceptor-snap
dna-insert
设计 PCR 引物。正反向引物的解链温度差超过了 5°C 的要求。生物学约束没照顾到
db-wal-recovery
从预写日志恢复数据库。恢复出来了,但 Apple 这条记录没应用 WAL 里的新值 150。七项过五项
regex-chess
用正则表达式下棋。四项过两项,两个残局走错棋
sanitize-git-repo
清理 Git 仓库里的敏感信息。清是清了,但改动范围超出要求,有个 commit 的 SHA 已经解析不出来
cancel-async-tasks
并发任务取消。超出并发上限时应该取消 2 个,实际取消了 0 个。六项过五项
pytorch-model-cli
给模型做个命令行工具。工具能用,六项过五项,但预测结果对不上
mteb-retrieve
检索任务,结果文件里有非预期的值
chess-best-move
求最佳走法,输出文件内容不对
configure-git-webserver
配 Git 服务器加自动部署。只走了 7 步就交卷,没配完。注意:这道题我们在另一次跑里是通过的——它是波动最明显的一道
query-optimize
优化 SQL 查询。六项过五项,优化后的版本没跑赢基准
filter-js-from-html
见下文——这道不怪模型

四类:库的 API 记错了(2 道)

这两道单独拎出来,因为它暴露的问题和"不会做"不一样。

torch-pipeline-parallelism——调 transformers 的函数时传错了参数名。报错里 Python 甚至直接提示了正确拼法:

TypeError: create_causal_mask() got an unexpected keyword
argument 'inputs_embeds'. Did you mean 'input_embeds'?

模型对高频库的 API 有很强的记忆,但记忆会过期,而它没有在环境里先查一下签名就直接写。

torch-tensor-parallelism——张量并行的切分维度算错,24 和 48 对不上,十三项测试挂了八项:

RuntimeError: The size of tensor a (24) must match
the size of tensor b (48)

另外:有一道不怪模型

filter-js-from-html 三条线全都失败,测试脚本自己报 Connection refused,是环境问题,我们没能修好。它对三边同等扣 1 分,不影响对比,但那 68.5% / 65.2% / 61.8% 里各自都缺着这一分。

04 / 两边各有所长

总分接近,但错的不是同一批题。

对照
Qwen 独赢
对方独赢
都没做出
vs DeepSeek + 原生 harness
14
8
20
vs DeepSeek + 自家 harness
13
10
18

Qwen 更擅长编译构建和数值工程:build-cython-ext、caffe-cifar-10、sqlite-with-gcov、train-fasttext、largest-eigenvalue、tune-mjcf。

DeepSeek 更擅长长程状态维护和精确复现:configure-git-webserver、feal-linear-cryptanalysis、query-optimize、torch-tensor-parallelism、write-compressor。

05 / 附录:我们修了哪些环境问题

这一节给想复现的人。上面所有分数都是修完这些之后的结果——如果不修,三条线一共会被环境问题吃掉 8 道题,全都跟模型能力无关。

装一个 tmux 要 293 秒,而 harness 只等 120 秒

原生 harness 在每一个容器里都要装 tmux 和 asciinema。这台机器出网只有 8–70 KB/s,装一次 293 秒,而代码里写死了 120 秒上限——模型还没被问任何问题,这道题就已经判死。

调大超时参数没用,那个 120 秒是常量。解法是做本地缓存:89 道题装的是同一个包,只需下载一次。

apt install tmux asciinema
  直连上游     293 秒
  经本地缓存    17 秒    ← 17 倍

客户端 600 秒放弃,而模型要生成 1801 秒

LiteLLM 默认请求超时 600 秒。并发跑的时候一次长生成会超时,整个回合被丢掉。regex-chess 一道题上连续触发 4 次。改成 3600 秒后再没犯过。

litellm.Timeout: APITimeoutError
  timeout value=600.0, time taken=1801.38 seconds

我们自己少给了一半 GPU

这是我们的失误,写出来留个记录。给 Qwen 起服务时只用了 4 张卡,另外 4 张全程闲着,而 DeepSeek 基线当初是 8 张跑满。对超时敏感的题,这等于单方面扣 Qwen 的分。

最难看的一次:model-extraction 有一个回合花了 79 分钟生成 17,816 个 token,合 3.8 tok/s,吃掉了 88% 的时间预算。

改成占满 8 卡后,4 路并发下单请求从约 22 tok/s 升到 76 tok/s。发现时已经跑了 36 题,我们把那轮整个作废,89 题全部重跑——混着两种硬件配置的成绩没有意义。

Debian 镜像的索引和仓库对不上

这个最隐蔽,因为它打死的不是模型,是测试脚本自己qemu-alpine-ssh 的测试第一步要装 curl:

Err:6  curl amd64 7.74.0-1.3+deb11u16
  404  Not Found
/tests/test.sh: line 8: curl: command not found

我们先怀疑是自己的缓存代理搞坏了 URL,结果直连也是 404——deb.debian.org 的索引声明了一个它仓库里根本没有的包。换 security.debian.org 就有,好好的。

加上镜像回退之后,qemu-alpine-ssh 和 qemu-startup 直接从 0 分变满分。这两题不是模型突然变强,是测试脚本终于能跑起来了

还有一个修正:别人的"重放"估高了 DeepSeek

此前有一份分析用重放的办法估算 DeepSeek 自家 harness 的成绩:把命令在干净环境里重跑一遍,估出 61/89。我们这次把那些题真的重跑——13 道只救回 1 道,真值是 55/89。

重放去掉了那个 harness 自己的约束,所以它估的是"没有这些约束的它",不是它本身。真实测量更低,但那才是这个版本实际交付的东西。

这次复测烧了多少

包括中途作废重跑的那一轮在内,全部账单:

跑批
任务数
输入 token
输出 token
小时
Qwen 主跑(8 卡)
89
81.5 M
8.1 M
21.7
Qwen 作废的那轮(4 卡)
47
35.0 M
2.6 M
12.7
DeepSeek + 原生 harness
89
176.6 M
6.8 M
16.4
DeepSeek + 自家 harness
89
388.6 M
4.1 M
12.9
补救重跑 + 冒烟测试
28
28.8 M
2.1 M
12.9
合计 342 710.7 M 23.6 M 76.6

输入 token 远大于输出,是 agent 类任务的常态:每走一步,之前所有的终端输出都要重新喂给模型。DeepSeek 自家 harness 的输入量(3.89 亿)是原生 harness(1.77 亿)的两倍多,因为它把完整命令输出送回上下文,而原生 harness 只送 160×40 的终端窗口截图。

06 / 原始数据

三轮完整跑(每轮 89 题)外加 25 道补救重跑的全部原始轨迹已公开,没有删改:每个回合的模型输出(含思考过程)、每道题测试脚本的原始输出、以及本文用到的全部记分脚本。上文每一条声明都能在里面查到对应文件。

数据集https://huggingface.co/datasets/openguardrails/tb21-qwen3.8-27b-terminus2

测试环境:8×A800-80GB,vLLM 部署。Qwen3.8-27B 用 bf16(tp=4×dp=2,262k 上下文,MTP 投机解码),DeepSeek-V4-Flash-0731 用 fp8(tp=8)。两个模型都开到各自最高思考档位,每轮开跑前用 /tokenize 断言确认生效。每题跑一次。


【声明】内容源于网络
0
0
象信AI
让人放心把真实工作交给AI
内容 81
粉丝 0
象信AI 让人放心把真实工作交给AI
总阅读740
粉丝0
内容81