性能验收标准(共享 NPU 机器上的测量口径)
在共享的多卡 NPU 上做性能结论,难点从来不是"跑得快不快",而是这台机器上的数字能不能代表配置
差异。本标准回答两件事:一个优化的收益算不算成立,以及什么样的数字才允许写进总览表。
每一条都来自真实踩坑:跨窗口对比得出的"收益"是假的、日志里的 t= 会被 profiler 污染、
md5 一致被当成"没问题"却漏掉了产物本身是坏的。目标只有一个:让报表里的每个数字都能被第三方复核。
定位与双态(先把"在探索"还是"在验收"分清)
| 态 | 何时 | 允许 | 产物写法 | 能否进总览表 |
|---|
| 探索态 | 平时特性分析、方向试探、快速识别哪条路值得投全量 | 不展开(少步/单次/单臂/N=1 即可),以首步耗时这类同口径辅助量做筛选 | 产物与结论行必须标 [探索],并注明样本数与窗口 | 不得进总览表(只作识别与筛选依据) |
| 验收态 | 收益要入库、要对外宣称、要写进总览报表 | 必须同窗 ≥N 次复现(按 references/window-ab-protocol.md 的 N 与门槛),必要时 A/B/A | 给口径(窗口/卡组/步数/权重)+ 判据(地板、门槛)+ 单值 | 可以(本条是入库的唯一入口) |
- 只有验收态结果才能写入总览表:探索态的读数可以在过程记录/细分材料里出现,但不得当作
收益列进主表,也不得用"我试过好像快了一点"替代验收。
- 态要显式标注:产物里没有
[探索] 标注的少步/单次读数,一律按"未验收"处理。
- 升态(探索 → 验收)的三件事:补齐同窗控制臂、跑到规定复现次数、把三证与 md5/dump 证据备齐。
何时用
- 要判定一个优化"是否有效 / 有多少收益 / 要不要采纳",尤其是收益落在几秒甚至几百毫秒量级时;
- 用户反问"为什么变慢了""是不是我眼花了""这个数字对不对"——先别解释,先查口径;
- 要把多天的结论合并进一张总览表,或复核同事给的加速比(列契约见
../model-auto-optimization/references/report-contract.md);
- 任何需要"跑一次就下结论"的场合(共享机器上重跑很贵,越贵越要一次做对)。
一条铁律:同窗 A/B 是唯一权威
跨窗口的绝对值不可比(这是方法层面的结论,不随环境变化)。下面引用的漂移量级是同环境口径下的观测(8 卡 15 s/4 步),换机器、换负载、换形状都要重新测一次地板再下结论: 同一台机器上换个时段、换个体温/邻居负载,同一配置就能漂出与整段收益同量级的差距;
这比绝大多数优化的真实收益还大。同环境实测的实证:
| 窗口 | 臂 | e2e(热态均值) |
|---|
| 窗口 A | 交付档(旧解码器) | 基准(本窗分母) |
| 窗口 B | 官方解码器(同窗对照:旧解码器) | 与窗口 A 同量级,略高 |
| 窗口 C | 交付档(新解码器 + 修复) | 比窗口 A 略慢(同量级) |
直接把窗口 A 与窗口 C 的绝对值相减、说"变慢了"是错的。正确做法是分解:
窗口 C − 窗口 A = 总差
= forward 漂移(跨窗口) + 大头 ← 与配置无关,换窗口就会有
+ 解码器结构性代价(同窗实测) + 次大项 ← 这才是"配置差异"
+ 交付/噪声 ± 小项 ← 落在噪声内
分解的算法:拿每个窗口自己的阶段账(编码/去噪/解码/forward),逐项相减;能对上就是漂移,
对不上的部分再去找结构性原因。只有同窗口内的差值才能写进报表当收益。
推论
- 每个窗口必须有自己的控制臂;不要用历史窗口的基线当分母。
- 跨窗口数字只能用于"量级参考",必须在报表里显式标注。
- 单臂内也会漂:同环境实测同一臂逐请求
diffuse 逐次单调爬升(6 个请求,逐次 +0.1 s 量级),
另一处跨窗口 diffuse 也整体抬升、漂移量级更大。所以"跑一次就下结论"只在差值远大于漂移时成立。
A/B/A:同窗对照也分辨不出时的唯一出路
当同窗对照的差值落在噪声里,别急着写"不可分辨"就收工——用 base → arm → base 夹一次,
把前后两个 base 取均值当控制,抵消窗口内的单向漂移:
base_1 = B arm = A base_2 = B(同口径复测)
控制均值 = (base_1 + base_2)/2
净差 = arm − 控制均值 = 负值(arm 更快) ← 这才是可写进报表的收益
本例中"同窗直接对比"给出的两个值几乎相同(差值落在噪声内,判不可分辨),
而 A/B/A 校正后得到一个稳定的负净差——结论从"没效果"翻转成"有效"。判据、算法与脚本骨架见
references/window-ab-protocol.md。
判定门槛:先算噪声地板,再谈收益
- 同环境实测地板:e2e 零点几秒量级 / 相对 1% 量级;单请求粒度更差。
- 差值小于地板 ⇒ 不下结论,写"落在噪声内,需 A/B/A 或更多重复"。
- 想给"平均"就真的取多次:热态 3 次均值(第 1 次冷启动单独记录,同环境实测冷启动显著高于热态,
混在一起平均会得到无意义的数)。
- 报告里的"3 次"必须是同一窗口同一次运行的 3 个热请求,不是三次跨窗口重跑。
- 探索态放宽、验收态不放宽:探索态允许少步/单次(标
[探索]),但一旦要入库,
门槛按本节执行——不许把探索态的读数按验收态写法上报。
每个数字三条证据(三次证明)
任何写进报表的性能数字,必须同时能给出:
- HTTP 200(请求确实成功,500/超时不算数据);
- 字节数(产物大小,与预期量级一致,能发现"空响应/错误页当成了视频/张量");
- 日志行(服务端阶段账或内核计时,能解释这个数字是怎么来的)。
三缺一,这个数字就只是"感觉"。失败案例就在实测里:某次改动后 4 个请求全部 HTTP 500、
产物只有几百字节量级——如果只看 arm 脚本打印的 t= 而不看状态码与字节数,会误判成"跑完了"。
第三证(日志行)要先自证再采信:仪器本身得用负对照证明"它测得到"(故意塞一个已知坏值,
看它是否报出来)。仪器坏了不会报错,只会安静地把"没测到"报成"没发生"。口径与两种互不相干的
仪器交叉验证见 references/measurement-discipline.md §8。
证据强度阶梯(从弱到强)
| 级别 | 证据 | 能证明什么 | 态 |
|---|
| 1 | 单次运行 e2e | 只能证明"这次是这个数" | 探索 |
| 2 | 同窗 A/B 差值 | 配置差异(差值 > 地板时) | 验收 |
| 3 | A/B/A 校正 | 差值小于地板时的净收益 | 验收 |
| 4 | 产物 md5 + 关键张量 dump md5 | 优化是否改变了结果(无损声明) | 验收 |
| 5 | 与独立真值对照(另一个解码器/实现) | 产物本身是否正确(见下节盲区) | 验收 |
| 6 | 未参与实施的实例独立复核(多 agent 场景:另一 analyst 实例按判据复算,含计数契约与回执指针核对) | 结论与实施者无关的独立性(防自证偏置)——自证只算自验证,不等于复核 | 验收 |
复核独立性(多 agent 场景强制):第 6 级的复核者必须未参与该特性实施;角色、交付件
与交接单契约见 ../model-auto-optimization/references/agent-roles-and-handoff.md §2/§3/§6。
最容易骗到自己的三个坑
坑 1:md5 门禁有盲区
"各臂产物 md5 与基线一致 ⇒ 优化无损"——这句话只证明优化没改变产物,
不证明产物本身是对的:如果基线本身就走了一条有缺陷的路径,所有臂都会一致地错。
实测实例:基线与全部优化臂共用同一个预览版解码器,md5 门禁全程绿灯,
但该解码器与真值几乎不相关,交付出去观众一眼就看出"糊"。
补救:另设忠实度对照。拿一个独立实现当真值(实测用完整解码器)跑同一输入,报
MAE / Pearson r。判据示例:官方时间维解码器 vs 真值 MAE 在 0–255 尺度上很小、相关系数接近 1(忠实);
另一预览档相关系数几乎为零、且含大量冻结帧(通过门禁但与真值无关)。
("产物变了吗"的判据在精度验收标准 accuracy-gate;本节只负责"这个数字算不算证据"。)
盲区的另一半在参与度:md5 一致还可能意味着那条路径压根没跑——
md5 相同 ≠ 路径跑了、md5 变化 ≠ 路径跑了,两者都只能靠生效计数 + 远端文件 hash分开
(判据与三件套证据见 references/measurement-discipline.md §9、../remote-access/references/arm-driver-traps.md)。
坑 2:arm/服务日志里的 t= 会被污染
profiler 采集阶段、并发请求排队、共享机器上的邻居负载,都会让 curl 的 time_total 虚高。
实测实例:某臂日志 t= 被污染(读数为数十秒量级),而服务端阶段账 forward 只有十几秒、请求节拍也在十几秒量级。
判据:把日志 t= 与服务端阶段账/节拍交叉验证,冲突时以服务端为准,并在报表里标注被采样的那次请求。
坑 3:把"占比高"当成"优化空间大"
占比高 ≠ 有收益空间。先看天花板:同环境实测解码只占百分之几,即便做到零成本也只省下零点几秒量级
(落在噪声地板之内);而设备侧主导算子的利用率已经接近 100%(到屋顶线),
真正能动的是"减少工作量/降精度",不是"调 kernel"。给出占比后必须补一句"最多能省多少"。
与"上限"的关系:占比高 + 天花板低时,正确动作是先算上下限账(阶段账闭合到 ±10%),
再判"这次优化有没有把上限抬高"。设备耗时降了而 e2e 没降,不等于优化失败——那是上限提高了、
绑定约束换人了,下一步该去压新约束,而不是关掉这次优化。流程(四步规则 + device = total − host
为何禁用)见 references/measurement-discipline.md §10;点名约束的判据也在那里(§10.3):
从某资源移走的工作必须变成该资源新增的空闲 —— 空闲没等量增长,就说明不是它在卡着你。
共享机器纪律
- 开工前查占用(
npu-smi info、容器内进程表),确认哪些卡是别人的;实测中曾遇他户占卡。
- 不要并发跑多臂:臂之间会互相污染(集合通信、HBM 带宽、温度)。串行跑,每臂之间留清理时间。
- 每臂结束显式清理(杀 serve 进程、清锁文件、清端口),否则下一臂会静默复用旧服务,
测到的其实是上一个配置。
- profiler 采集会显著改变时序:被采样那一次的 e2e 不能计入均值,只用它做阶段/内核归因。
- 一次运行尽量多带信息(阶段计时 + 关键内核计时 + per-rank 分解),因为重跑很贵。
一次运行要带回来的东西
按这个清单设计 arm 脚本,避免"跑完发现缺一个数,还要再跑":
- 健康检查通过时间、每请求 HTTP 码 /
t= / 字节数 / md5 —— 并写明每个数字来自第几个请求
(先确认日志的每请求行数再切片,否则会把冷请求当基线;见 references/evidence-toolbox.md §4.1);
- 服务端阶段账(编码/去噪/解码/forward)逐请求;
- 关键子模块计时(如解码器 per-rank 拆分);
- 配置指纹:生效的权重路径、关键 env、以及"是否走了降级/回退"的日志行;
- 产物落地路径 + 关键中间量(dump md5)。
脚本骨架与判定阈值见 references/window-ab-protocol.md。
入库门:什么数字才允许写进总览表
只有验收态结果才能写入总览表(探索态一律标 [探索] 并留在过程材料里)。入库前逐条自检:
- 同窗控制臂存在,或已 A/B/A 校正;跨窗口数字只作量级参考且显式标注;
- 差值 > 噪声地板(否则写"不可分辨"或补 A/B/A);
- 三证齐(HTTP 200 + 字节数 + 日志行);被 profiler 采样的请求未计入均值;
- 无损声明有 md5 + 关键张量 dump 双证据,必要时补与独立真值的忠实度对照。
列契约与格式复核(8 列固定契约、可选 序号 列、质量列语义、主表只收已验证有效项、
格式事故清单、数值自洽审计与复核流程)见
../model-auto-optimization/references/report-contract.md——报表列契约归编排层(L1)单点持有,
本技能只给"数字可复核"的判据;跑 lint 用编排层的 model-auto-optimization/scripts/report_lint.py,
要求 error=0 才算交付。
何时读哪个文件
| 情况 | 读 |
|---|
| 要设计同窗 A/B、判定收益、决定是否用 A/B/A、要 arm 脚本骨架与复现次数 N | references/window-ab-protocol.md |
要采证据、怀疑 t= 被污染、要做忠实度对照、要统一 profiling 三张表 | references/evidence-toolbox.md |
| 要做交错对照(ABBA)与哨兵翻转、判"差异算不算 bug"前先做数值敏感度校准、要用单测替代端到端、要外推站点/阶段收益、或要按模板上报结论 | references/measurement-discipline.md |
| 要写/刷新总览报表、复核别人的数字、跑 lint 与表格审计(列契约) | ../model-auto-optimization/references/report-contract.md(编排层单点) |
| 产物"看着不对"、怀疑是静默错误而不是性能问题 | ../accuracy-gate/references/silent-failure-localization.md(判据不达标 → 排障入口) |
| 要判"优化到底生效没有"——ON 臂要证明走了新路径、OFF 臂要证明没走(生效计数分开报、回退/失败另计) | scripts/engagement_check.py(零依赖、离线、--selftest 自证;四项要求与双方向判据见 references/measurement-discipline.md §9) |
| 要交付一个验证/门禁脚本(gate、校验器、对照脚本)作为判据——它属于哪个平台、有没有跑通过一次、路径是不是写死的 | scripts/check_gate_script.py(零依赖;检查平台归属/可运行自证/路径可解析,显式列出无法机检项;--selftest 自证;判据见 references/measurement-discipline.md §11.1) |
门控纪律:每个新特性都要能"关回去"
在共享机器上做优化,可回退和可测同样重要。约定:
- 新特性一律 env-gated + 默认 OFF:默认路径必须与改动前逐字节一致,
这样"没开"就能自证不是它导致的差异;
- 门控还要可逐请求翻转(读环境变量或哨兵文件,且每次调用重新求值,而不是启动时读一次)
—— 这是交错对照(ABBA)能成立的前提,见
references/measurement-discipline.md §2;
- 提供一行回退(一个 env 或一行注释切换),并用注释写清楚回退值——半年后要复现历史产物时,
这一行就是唯一的线索;
- 改动前备份原文件并记录 md5,保证一键回退;不要改共享库(别的会话可能依赖它),
需要时用附加库方式加载新算子;
- 回归验证:改动期间反复跑基线路径,确认其输出 md5 恒定 ——
这是"门控未误伤既有路径"最有力的证据;
- 采纳后把"默认值 + 回退开关"写进报表的说明列,让读者知道怎么关掉它;
- 反过来,无效的改动要撤掉:实测中有两个补丁被证明与旧路径逐位等价
(假设被证伪),它们被显式回退,只保留真正有效的那个——否则树里会沉淀一堆"看起来在起作用"的开关,
下一个人无法判断哪个才是真的。
与既有技能的边界
model-auto-optimization:编排层(阶段推进与验收收口,持有报表列契约与 lint)。本技能是它的
性能验收口径支撑:当它要写"收益多少/是否采纳/能不能入库"时,按本技能的窗口、态与证据规则来;
本技能不负责决定流程走到哪一步。
benchmark-dev / profiling-collect / profiling-analyze:分别负责"怎么把 benchmark 跑起来"
与"怎么采/怎么读 profile"。本技能负责判定这些数据的可比性(同窗、漂移、污染、噪声地板),
以及最终入库的门槛。
accuracy-gate(精度验收标准)的 accuracy-gate/references/silent-failure-localization.md(排障入口):
当"收益"或"一致性"结论出现反常(例如产物 md5 一致但画质明显变差、或某个改动让结果"看着不对")时,
问题可能不是性能而是静默错误,转该入口排查;本技能负责先用 md5 / 张量 dump 确认"到底有没有变"。
vae-opt:当收益来自"把解码按卡切开"时,其等价性证明与交换预算由该技能给出;
本技能只负责验收(同窗差值与逐字节证据)。
结论是动态的:记判据,不记死结论
本节里的每个数字都是某次观测(同环境口径:8 卡 Ascend、15 s / 768P / 4 步),不是普适常量;
写进来是为了让你知道"该期待什么量级、该怎么判"。任何一条变了,旧结论就不再成立,必须重测:
| 会变的轴 | 为什么会推翻旧结论 | 重测方式 |
|---|
| 硬件 / 驱动 / CANN 或框架版本 | 绝对性能与噪声地板都会变 | 重测地板(同一配置重复跑几次取散布) |
| 形状 / 分辨率 / 步数 / 批大小 | 阶段占比与收益结构都随之变化 | 用真实形状重跑同窗 A/B |
| 并行拓扑与卡数 | 通信占比、瓶颈位置改变 | 重设窗口内基线 |
| 窗口 / 邻居负载 / 共享机器 | 漂移可能大于收益本身 | 同窗 A/B(必要时 A/B/A 校正) |
| 权重 / 解码器 / 量化档 | 同一门禁下语义可能不同 | 补与独立真值的忠实度对照 |
| 用户裁决(某档冻结、某档不采用) | 这是决策,不是性能结论 | 记录裁决与出处,不写成"更快/更好" |
写结论请带证据卡三件套:口径(机器、形状/步数、窗口、权重)、判据(多大差异算成立、
地板多少)、失效信号(出现什么就说明这条结论过期)。
收尾自检
维护与更新
- 复核方法:改本文件或口径文件后,用
evals/evals.json 的四类探针自检——①跨窗口相减是否被
拒绝并给出分解;②md5 一致是否被判"只证没变、不证正确";③t= 污染与"3 次必须同窗"是否成立;
④探索态产物是否被判不得进总览表。
- 失效信号:硬件/驱动/CANN/框架版本、形状/步数/批大小、并行拓扑与卡数、窗口与邻居负载、
权重与量化档任一变化 ⇒ 地板与结论都要重测(见上表)。
- 同源联动:报表列契约单点在编排层
../model-auto-optimization/references/report-contract.md(本技能只留"数字可复核"判据与指针);
测量与上报纪律单点在 references/measurement-discipline.md(与 window-ab-protocol.md /
evidence-toolbox.md 构成唯一来源);精度侧判据在 accuracy-gate(精度验收标准)。