Files
qwen38-flash-next-rtx6000d/docs/mtp-qualification.md
T

100 lines
8.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MTP 配对验证计划与结果
2026-09-18,延续 `06bcbcf` 基线。目标是评估 MTP 2 是否值得替换默认配置。不会把一次短输出计时等同于稳定性验收。
## 预设测试范围
- 无 MTP128K、FP8 KV、Graph、GPU budget 0.96。
- MTP 2:同样的镜像、权重、上下文、视觉编码器与单活动请求,GPU budget 0.985Graph 包含 3-token 验证形状。
- 两组使用同一脚本和生成资产、相同 seed 和采样参数;不会把精确逐字一致作为浮点路径变化后的唯一正确性标准。
- 12 道可精确验算的算术、精确 JSON、多轮记忆、OCR 发票与加总、4 张图片、120 秒 720p 视频顺序识别。
- 代码、中文需求、算法推理三类提示:每类一次预热、三次 2048-token 固定输出计时,xhigh 思考档;另有一次 16384-token 连续输出。
- 接近 128K 的两个位置检索,重复三次;长文本与图片混合检索;4 个客户端同时提交,验证单活动序列下的排队,不声称 GPU 并行处理。
- 两组各连续 600 秒混合负载,交替长输入、图像、视频、2048-token 解码,累计时间不包括前述功能与性能用例。
- 同时采集主机/GPU 资源、OOM、服务错误;功能失败和 HTTP 错误均保留,不能过滤失败后只汇报成功数据。
## 判定原则
默认启用必须满足:全部预设功能检查通过、无 OOM 或服务退出、长输出无中断、排队请求成功,并在多类长输出任务上有持续收益。单一 synthetic 测试不代表综合模型质量;真实业务长期运行和更大视频仍超出这次验证范围。
固定 token 计时使用 ignore_eos,可能得到截断或后续重复文本,只评估持续解码而非答案质量。精确答案用例正常使用 EOS。视频资产为六个颜色区间,每区间 20 秒,2fps、总计 240 帧;服务内部可能进一步采样。多模态能力是模型/处理器的实际输入路径测试,不代表任意时长、分辨率或帧数都可接受。
补充正常 EOS 任务:发票提取、订单去重、依赖调度、中文审批规则、合并区间和二分查找代码、工具调用参数。代码先做 AST 限制,再在独立进程中以 CPU/内存/时间上限执行固定测试用例,不执行任何外部工具操作。
预检曾使用不支持的 reasoning_effort=high,服务返回 400。查明支持 low/medium/xhigh 后改为 xhigh,两组统一使用修正脚本;原始预检错误单独保留,不混入正式统计。
状态:完整配对验证完成,MTP 2 已启用;原始记录保存在 `audit/qualification/`
## 暂停后恢复与基线诊断
按用户要求暂停后,服务器恢复了无 MTP 配置。原基线正式套件 92 个请求全部通过,其中持续混合负载 54 个请求、623.7 秒;补充 xhigh 正常 EOS 任务有一道 merge-intervals 未返回正文。
原脚本在 JSON 解析失败时没有保存完整响应,已修正记录并保留原始失败。相同基线单项复测确认:finish_reason=length8192 个输出 token 全部为 reasoning_tokenscontent=null。没有证据将其归因于 MTP,因为该请求在无 MTP 下运行。相同任务在 medium 下生成代码并通过固定测试。
两种配置都补充相同的 medium 全套质量任务。高思考档的预算耗尽按实际失败记录;最终评价同时区分基础模型/输出预算限制和 MTP 相对基线的新回归,不用切换思考档的成功掩盖 xhigh 失败。
## 最终结果
| 检查 | 无 MTP | MTP 2 |
|---|---:|---:|
| 功能、计时、长输入及持续负载请求 | 92/92 通过 | 98/98 通过 |
| 其中连续混合负载 | 54 请求 / 623.7 秒 | 60 请求 / 614.0 秒 |
| xhigh 正常 EOS 任务 | 6/7 | 7/7 |
| medium 正常 EOS 任务 | 7/7 | 7/7 |
| 2048-token 代码提示,中位数 | 77.10 token/s | 123.42 token/s |
| 2048-token 中文提示,中位数 | 77.12 token/s | 128.78 token/s |
| 2048-token 推理提示,中位数 | 77.14 token/s | 122.15 token/s |
| 16384-token 单次持续输出 | 76.62 token/s213.9 秒 | 142.32 token/s115.2 秒 |
三类 2048-token 测试提升 **58%67%**。16384-token 计时约提升 86%,但基线含 12136 个思考 token、MTP 为 16384 个思考 token,生成内容明显不同;只证明长时间解码速度和不中断,不能声称答案质量等价或完成业务更快。中文计时中两组思考/正文占比也不同。每类计时为预热后 3 次,不能外推到所有输入。
两组都通过:2048×1536 合成发票图片 OCR/加总、4 图输入、120 秒 720p 视频顺序识别、125995 token 双位置检索、111670 token 长文本加图片检索、4 客户端排队。两道生成代码在独立受限进程中通过固定用例;没有执行实际外部工具动作。
合计 1305 次资源采样:主机可用内存最低 171.95 GiB,OOM kill 最大值 0,未触发内存保护;GPU 峰值 84797 MiB / 85651 MiB,剩余约 854 MiB,温度峰值 64°C。当前容器 healthy、OOMKilled=false、restart=unless-stopped。这些为本次快照,不代表未来实时状态。
## 延迟与缓存取舍
MTP 减少可用 KV 容量,不能把解码收益直接换算成整体业务收益。本次持续负载中:
| 请求类别总耗时中位数 | 无 MTP | MTP 2 |
|---|---:|---:|
| 重复长输入检索 | 1.74 秒 | 15.17 秒 |
| 视频 | 2.08 秒 | 2.37 秒 |
| 图片 | 2.03 秒 | 1.31 秒 |
| 2048-token 解码 | 26.62 秒 | 16.70 秒 |
交替负载中的缓存状态不同。这是当前两套配置的实际混合负载表现,不能把长输入差异解读为纯计算预填充性能差异,也没有通过内核剖析证明具体缓存淘汰原因。初始基线重跑还可能复用之前预检的缓存,因此首次检索 TTFT 不作为冷启动预填充对照。独立的连续前缀复用检查两组均通过。
10 分钟内 MTP 处理 60 个混合请求、基线 54 个,说明本组混合任务的整体改善远小于解码提升。若主要业务是大段上下文反复提问、只生成很短的答案,原配置可能更合适。
## 当前采用与运行边界
按用户希望利用 MTP 提升生成速度的方向,服务器已采用 **MTP 2 + 128K + FP8 KV + 单活动请求 + 0.985 GPU 预算**,保留文字、图片、视频能力。启用自动重启;未提高并发或进一步挤占显存。没有声称通过全天运行或任意媒体大小测试。
完整测试未发现 MTP 新增的服务错误或所选任务正确性回归,因此本轮不再仅因显存余量较小就拒绝启用。仍需尊重实测边界:视觉检查为合成图/视频,代码为固定用例,10 分钟持续负载不是 24 小时压力测试,也不是通用模型质量认证。
日常代码和结构化任务建议显式指定 `reasoning_effort: medium`,并为最终正文预留输出预算;需要 xhigh 时检查 finish_reason,不能把 reasoning-only 的 length 响应当成完整答案。128K 是输入、思考和正文合计上限。
原无 MTP 配置保存在根目录 `compose.baseline.yaml`。服务器项目目录中执行以下命令可切换(会重启模型):
```bash
# 回退到无 MTP
docker compose -f compose.baseline.yaml up -d
# 恢复经本轮验证的 MTP 默认配置
docker compose -f compose.yaml up -d
```
## 复测方法
先用镜像内已有 Pillow/OpenCV/numpy 生成合成资产:
```bash
docker cp scripts/make_qualification_assets.py qwen38-flash-6000d:/tmp/make_qualification_assets.py
docker exec qwen38-flash-6000d python3 /tmp/make_qualification_assets.py --output /root/.cache/qualification
python3 scripts/qualification.py --output /data/flash-next/audit/new-qualification.jsonl --soak-seconds 600
python3 scripts/quality_tasks.py --output /data/flash-next/audit/new-quality-xhigh.jsonl
python3 scripts/quality_tasks.py --effort medium --output /data/flash-next/audit/new-quality-medium.jsonl
```
输出路径必须不存在,避免覆盖原始记录。使用相同输入和设置配对比较,分别保留失败与成功结果。汇总工具 `scripts/summarize_qualification.py` 可读取与本次相同命名的回执目录。