整理时间:2026-10-22 06:55(GMT+8)
覆盖范围:0.1.3 预览版部署 → 版本对比 → 推理负载 → TCC 三模式矩阵 → NVLink/P2P 追查
全部数字为本机实测,来源见文末「证据索引」。V100X2数据仅在与本地对照时引用,均已标注。
windows-ninfer-V100X2 比 我的NInfer-V100-Duo-Win 早,主要是我也没发现。就这样吧。看看性能有没有差距。大概对比下,不是很专业的测试。
0. 速览
| 问题 |
结论 |
| 0.1.3 比本机 v0.1.0-win.1 快还是慢 |
慢 3.43%(计数题)/慢 2.86%(几何题),方向一致 |
| 这个差距值得升级或回退吗 |
不值得,幅度不足以支撑决策 |
| 两版输出等价吗 |
计数题逐字节一致;几何题从第 357 字符分叉,不可外推为"等价" |
| 相比V100X2数据,本地快吗 |
普通 +8.8%、MTP3 +4.5%、DFlash7 +3.7%(都是本地更快) |
| 差距是 NVLink/P2P 造成的吗 |
不是。集合通信预算上限 0.2 ms/token = 0.8%,填不上 5.5–8.7% 的差 |
| 性能真正的杠杆在哪 |
投机解码:MTP3 3.26×、DFlash7 4.99×,不在版本、不在硬件 |
| 196 tok/s 能当日常吞吐吗 |
不能。接受率 100.0%/99.9%,计数任务是最理想情形 |
| 几何难题解得出来吗 |
答案算对了,但两版都答不完(全部撞 token 上限、content 为空) |
一句话:版本之间和两台机器之间都没有本质差别;差别在解码模式(5×)和推理预算(不够用)。
1. 资产与路径
1.1 二进制
| 用途 |
路径 |
| 0.1.3 预览版(V100X2 Release) |
NInfer Windows 双 V100 0.1.3 预览版 |
| └ 服务端 |
...\bin\ninfer-serve.exe(365MB) |
| └ GUI 启动器 |
...\NInfer.exe(48KB) |
| └ 模式切换脚本 |
...\tools\set-v100-mode.ps1、restore-wddm.cmd |
| 本机 duo 版 v0.1.0-win.1 |
NInfer v0.1.0-win.1 (Windows, 2xV100 TP2) |
| └ CLI |
...\ninfer.exe |
| └ 服务端 |
...\ninfer-serve.exe |
| 保留的原始 zip |
C:\Users\lwb6\Documents\git\_ninfer_release\NInfer-Windows-V100X2-0.1.3.zip |
1.2 模型(F:\models\ninfer\)
| 文件 |
大小 |
说明 |
Qwen3.8-27B-Coder390-EfficientThink-W4A4-MTP-DFlash2.ninfer |
23,773,675,264 |
artifact v3,0.1.3 与本次全部测试使用 |
Qwen3.8-27B-Coder390-W4A4-MTP-DFlash2-NInferV2-NOT-FOR-V3.ninfer |
23,477,696,516 |
artifact v2,不能给 0.1.3 用(文件名是字面意思) |
Qwen3.8-27B-Coder390-EfficientThink-Q6_K-MTP.ninfer |
23,379,962,880 |
Q6_K,未测 |
qwen3_8_27b_nvfp4.ninfer |
23,719,715,844 |
未测 |
1.3 环境事实
| 项 |
值 |
| GPU |
2 × Tesla V100-SXM2-16GB(0,1) |
| 驱动 / CUDA |
576.57 / 12.9 |
| 驱动模型 |
TCC(Current: TCC / Pending: TCC)——一直就是,不是本次切的 |
clocks.max.sm |
1530 MHz(运行期实测就是满频) |
| 功耗上限 |
300 W(满载约 230 W,余量充足) |
| 满载温度 |
59–69 ℃,无 throttle 标志 |
| NVLink |
硬件存在(SXM2),但 Windows 下 nvidia-smi nvlink -gt d 全部 N/A,读不到计数 |
| 显示输出 |
RX550,不参与计算 |
2. 部署记录(0.1.3)
| 项 |
值 |
| Release |
v0.1.3-windows-preview |
| zip 大小 |
244,814,858 B(233.5 MB) |
| SHA256 |
c7ea054395bddf05055204d5502891c2187a3825496a1a7a258dd67beae61c36 ✅ 与官方 SUMS 一致 |
| 解压后 |
38 个文件 / 386,140,925 B(与 zip 目录表逐项吻合) |
| 两个 exe |
均为有效 PE(MZ 头) |
| 代码签名 |
无,首次运行会弹"未知发布者" |
解压位置放在 duo 仓库外面的同级目录,避免污染 git 工作树。
3. 性能:三份数据
3.1 版本对比(0.1.3 vs v0.1.0-win.1)
统一负载:从1数到300,19 输入 / 1391 输出,--no-thinking,temp 0.7 / top-p 0.8 / top-k 20 / presence 1.5 / seed 42,TP2,int8 KV,chunk 256,131072 容量,无投机。
A-B-A-B 交叉排除热漂移:
| 轮次 |
duo (tok/s) |
0.1.3 (tok/s) |
| A1 |
40.77 / 40.81 |
|
| B1 |
|
39.25 / 39.29 |
| A2 |
40.54 / 40.62 |
|
| B2 |
|
39.31 / 39.31 |
| 均值 |
40.69 |
39.29 |
| 区间 |
40.54–40.81 |
39.25–39.31 |
- 差 −1.40 tok/s = −3.43%,区间无重叠(duo 最低 40.54 > 0.1.3 最高 39.31),不是噪声。
- 自身波动:duo 0.67%、0.1.3 0.15%。
- 第二个负载(几何题,同进度前 100 个采样)复现:−2.86%,同向同量级。
- 墙钟 34.06 s vs 35.40 s;模型就绪 ~34 s vs ~36 s。
3.2 TCC 三模式矩阵(对照V100X2数据)
同一份二进制 + 同一份 v3 模型 + 同一负载,--no-prefix-reuse 显式加上(日志 cache=0 reuse=full_reset 为证),各档间空闲 180 s。
| 模式 |
V100X2 WDDM |
V100X2 TCC |
本地 TCC |
本地 vs V100X2TCC |
本地加速 |
| 普通解码 |
28.08 |
36.19 |
39.38 |
+8.8% |
1.00× |
| MTP3(optimized head) |
94.68 |
122.69 |
128.22 |
+4.5% |
3.26× |
| DFlash7(full head) |
153.70 |
189.50 |
196.49 |
+3.7% |
4.99× |
每档两发,复现性极好:
| 模式 |
两发 |
客户端耗时 |
引擎 decode |
每轮产出 |
接受率 |
| 普通 |
39.40 / 39.37 |
35.31 / 35.33 s |
39.5 |
1.00 tok |
— |
| MTP3 |
128.09 / 128.35 |
10.86 / 10.84 s |
129.3 |
4.00 tok |
100.0% |
| DFlash7 |
196.16 / 196.82 |
7.09 / 7.07 s |
199.2 |
7.99 tok |
99.9% |
3.3 那 4–9% 是怎么来的:固定每轮开销
换算成每轮 decode 延迟:
| 模式 |
本地 ms/轮 |
V100X2 ms/轮 |
差 |
| 普通 |
25.4 |
27.6 |
+2.2 ms |
| MTP3 |
31.2 |
32.6 |
+1.4 ms |
| DFlash7 |
40.7 |
42.2 |
+1.5 ms |
差额基本恒定 1.4–2.2 ms,没随每轮工作量放大(若是频率差,DFlash7 该差 3.3 ms)。运行期三档全程 1530 MHz 满频,所以本地不是"算力更强",而是每轮固定调度/同步开销略小。
按V100X2比例外推本地 WDDM(推算,未实测):普通 ~30.6、MTP3 ~98.9、DFlash7 ~159.4。
3.4 正确性
| 运行 |
输出 sha256(前 16) |
说明 |
| 普通解码(含 7 次历史运行) |
49c595ba7d648693 |
1390 字符,历史一致 |
| MTP3 / DFlash7 |
2acbb8dd9bbfd251 |
两档彼此逐字节相同 |
投机与普通版的差异只在换行位置(普通在第 10 个数后断行,投机连续排版),数字序列都是完整 1→300 升序、各 300 个、无缺漏无乱序。
4. 推理负载:平面几何题
题目:平面四边形 ABCD,AB=AC=CD=1,∠ADC=30°,∠DAB=120°,△ACD 沿 AC 翻折成 △ACP,求二面角 A-CP-B 余弦最小值。
4.1 独立 oracle(不依赖模型)
坐标法:A=(0,0,0)、C=(1,0,0),推出 AD=√3、∠ACD=120°、D=(1.5,−√3/2,0),凸四边形要求 B=(0,1,0)。θ 全周扫 200001 点:
min cos = 0.577350269 at θ = 54.736° = arccos(1/√3)
√3/3 = 0.577350269 (差 3.06e-11)
标准答案 √3/3 成立,取等在 θ*=arccos(1/√3)。
4.2 四次运行,全部答不完
| 运行 |
版本 |
presence |
max_new |
实际生成 |
decode |
算出√3/3 |
有答案 |
| A |
duo serve |
1.5 |
16384 |
16384(撞顶) |
38.61 |
是(第 24262 字符) |
否 |
| B |
0.1.3 serve |
1.5 |
4096 |
4096(撞顶) |
39.01 |
未到该步 |
否 |
| C |
duo CLI |
1.5 |
4096 |
4096(撞顶) |
40.48 |
否 |
否 |
| D |
duo CLI |
0 |
16384 |
16384(撞顶) |
38.72 |
是 |
否 |
四次全部 finish=length、content 为空。不是答错,是答不完。
失败形态是过度验证:第 24262 字符已写出 Minimum cos = √3/3. Is that answer? Need verify...,随后转去讨论"非凸情形",耗尽预算。
presence-penalty 1.5 会把过度验证升级成重复退化(连续 1524 次 c=-?);降到 0 后该循环完全消失,但改为穷举分类,16384 处仍停在 B at 90 or - 半句上——只换了一种跑不完的方式。
4.3 版本分叉(重要)
同一 seed 42、temp 0.7,两版推理文本从第 357 字符起分叉:
| duo |
Initially planar quadrilateral ABCD. Given lengths and angles. We fold triangle ACD |
| 0.1.3 |
We have initial planar quadrilateral ABCD with given sides/angles. Triangle ACD |
⇒ 两版浮点数值并非通用级一致。0.1.3 自述引入的 W8 词表头排列、NVFP4 投影、INT8 注意力优化,足以在近平分布处翻转采样;计数题分布极尖所以没翻。
「两版完全等价」的结论已撤回。
5. 差距来自 NVLink / P2P? 追查:不是原因
5.1 量级先否掉
V100X2在无 P2P 的 RTX 5090 双卡上测过集合通信预算(docs/maintainer/tp2-yarn-1m.md):
- 每 token:128 次 all-reduce + 1 次 logit all-gather
- CUDA Graph 下整套 ~0.2 ms / token
本地一轮 25.4 ms。把跨卡通信抹成零,最多省 0.8%;实测差距是 5.5–8.7%。差一个数量级。
5.2 代码本身自适应
ninfer-serve.exe 里的传输层符号:
src/core/mapped_peer_transfer.cu → 无 P2P 时的映射拷贝回退
allreduce_peer_sum_scalar_kernel → 一次性 all-reduce 内核
"CUDA cleanup failed during peer probe" → 启动时确实做 peer 探测
即"有 P2P 走 P2P、没有退映射拷贝",两端同一份二进制、同一条路径。
5.3 KV 容量也排除(实测)
--kv-capacity / --max-context |
普通解码 |
| 4096 |
39.39 / 39.36 |
| 131072 |
39.40 / 39.37 |
差 0.03%,输出哈希一致。V100X2文档里 4k 报 40.3、表里 131072 报 36.19,这个 11% 落差不能用容量解释。
5.4 反向交叉验证:0.1.0 上两台机器只差 1.2%
| 对照点 |
V100X2 |
本地 |
差 |
| 0.1.0 TCC 普通解码 |
40.3 |
40.77 |
+1.2% |
| 0.1.3 TCC 普通解码 |
36.19 |
39.38 |
+8.8% |
0.1.0 那行吻合到 1.2%,说明硬件等价。 差距只出现在 0.1.3 那次测量。
若纯属频率差,反推V100X2有效频率 ≈ 1530 × 25.39/27.63 ≈ 1406 MHz。本地已满频,没得再快。
这是目前最可能的解释,需V100X2侧用 nvidia-smi --query-gpu=clocks.sm,power.draw --format=csv -l 1 自证。
5.5 一处口径不一致(待澄清,不影响结论)
docs/performance.md:当前主机 "runs direct NVLink P2P"。
使用说明.txt 第 23 行:"TCC 不保证 P2P,本机切换后仍不支持 P2P"。
两句指向不同的构建/时点。无论哪句为准,0.2 ms/token 的上限都成立,不改变结论。
5.6 没能测到的
Windows 驱动不提供 nvidia-smi topo -m,nvlink -gt d 全部 N/A;本机无 nvcc,写不了 cudaDeviceCanAccessPeer 探测。不影响结论。
6. 踩坑清单(实操速查)
| # |
现象 |
根因 |
解法 |
| 1 |
error: failed to normalize UTF-8 text as NFC |
exe 走 ANSI argv,中文在 CreateProcess 阶段被活动代码页转坏。两版都有 |
用 --messages <UTF-8 JSON>,别传 --prompt 中文 |
| 2 |
0.1.3 跑不了 --prompt 参考命令 |
该包没有 CLI 单题入口,只有 GUI 启动器 + 服务端 |
走 HTTP;或做对比时双端都用 ninfer-serve.exe |
| 3 |
--kv-capacity 报错 |
引擎强制 kv-capacity >= max-context |
DFlash7 容量 98304 时,上下文也压到 98304 |
| 4 |
v2 模型加载失败/结果异常 |
artifact v2 NOT-FOR-V3 与 0.1.3 不配套 |
用 v3:Qwen3.8-27B-Coder390-EfficientThink-W4A4-MTP-DFlash2.ninfer |
| 5 |
.ps1 脚本拒绝执行 |
PowerShell 执行策略 |
改内联命令,不落地脚本 |
| 6 |
服务进程杀不掉、显存不释放 |
$! 拿到的是 MSYS PID,taskkill /PID 没命中 |
ps -W 找 Windows PID,或 taskkill //F //IM ninfer-serve.exe |
| 7 |
GitHub 下载 8.5 KB/s |
直连限速 |
走 ghfast.top 镜像(650 KB/s,75×) |
| 8 |
镜像频繁 429 |
并发 >2 就被限流 |
限并发 2 + 断点续传 + 卡速即切镜像 |
| 9 |
分段下载永远下不完,返回码总为空 |
curl 的 body 和 -w 写进了同一个 >> |
body 用 -o,返回码单独捕获 |
| 10 |
思考类题目永远拿不到答案 |
默认输出上限 2048 全被推理吃掉 |
提到 16384+;但这题 16384 仍不够(见 §4.2) |
| 11 |
相邻两次测量互相污染 |
显存/热状态残留 |
各档间空闲 ≥180 s,并做 A-B-A-B 交叉 |
7. 可复用命令
7.1 服务端起服务(两侧通用,只换 exe 路径)
cd "C:/Users/Public/ninfer-v100-duo-win/v0.1.0-win.1"
./ninfer-serve.exe "F:/models/ninfer/Qwen3.8-27B-Coder390-EfficientThink-W4A4-MTP-DFlash2.ninfer" \
--host 127.0.0.1 --port 18081 \
--tp 2 --devices 0,1 \
--max-context 131072 --kv-capacity 131072 --kv-dtype int8 --prefill-chunk 256 \
--no-thinking --default-max-tokens 2048 --max-concurrency 1 \
--no-prefix-reuse \
--log-stats-interval-ms 1000
7.2 三档投机模式
--spec mtp --draft-tokens 3 --lm-head-draft
--spec dflash --draft-tokens 7 --max-context 98304 --kv-capacity 98304
7.3 duo CLI(中文走文件)
./ninfer.exe "F:/models/ninfer/Qwen3.8-27B-Coder390-EfficientThink-W4A4-MTP-DFlash2.ninfer" \
--messages "C:/.../_scratch/cmp013/messages_count300.json" \
--tp 2 --devices 0,1 --max-context 131072 --kv-capacity 131072 \
--kv-dtype int8 --prefill-chunk 256 --no-thinking --max-new 2048 \
--temperature 0.7 --top-p 0.8 --top-k 20 --presence-penalty 1.5 --seed 42
messages_count300.json 形如:
[{"role":"user","content":"从1数到300"}]
7.4 计时脚本调用
bash serve_bench3.sh <tag> <port> <capacity> <runs> [额外引擎参数...]
7.5 环境复位检查
taskkill //F //IM ninfer-serve.exe
nvidia-smi --query-gpu=index,driver_model.current,memory.used --format=csv,noheader