cann-perf-ui-json-report:CANN oam-tools 交互式 UI JSON 性能报告的生成、校验与交付
【免费下载链接】oam-tools本项目为开发者提供故障定位工具,包含故障信息收集,软硬件信息展示,AI core error报错分析等能力,提升故障问题定位效率,文档可在昇腾社区搜索“故障处理简介”(选择社区版)。项目地址: https://gitcode.com/cann/oam-tools
导读
本文围绕 CANN oam-tools 开源仓库中的 Skill 3 组件cann-perf-ui-json-report(定义于 skills/cann-perf-ui-json-report/SKILL.md)展开,讲解如何将上游 Skill 2 产出的架构图、overlay 映射与 Trace 绑定等 JSON 事实,生成为可交互、可独立分发(含file://协议)的 Profiling 性能报告report/index.html。读完本文,你将掌握该 Skill 的完整 CLI 用法(--repo、--handoff、--trace、--hbm-dir、--refresh-template、--check)、四项必备确定性校验的具体检查内容、校验清单状态语义与失败路由规则,以及从源码层面理解生成器的“事务式回滚”“只读检查”与“模板漂移拦截”等工程保障机制。
Skill 3 在性能分析流水线中的定位
在 oam-tools 的模型性能分解流水线中,本 Skill 属于最下游的“报告呈现层”,其上游链条为:
- Skill 1(cann-perf-breakdown):产出后端分析 JSON(如
analysis_config_v2规范)、性能 JSON、归一化 Timeline JSON 与原始 Chrome Trace; - Skill 2(cann-perf-breakdown-to-ui-json):将后端事实投影为 UI 可消费的结构化产物,包括
model_architecture_graph.json(模型架构图)、architecture_overlay_map.json(后端节点到架构项的映射)、trace_bindings.json(归一化事件到原始 Trace 事件的绑定),并生成ui_report_handoff.v1交接清单; - Skill 3(cann-perf-ui-json-report,本文主体):以只读方式消费上述全部输入,渲染生成交互式报告,并通过确定性校验 + 浏览器人工验证双重关卡后才判定通过。
SKILL.md 开篇即给出铁律:“Render backend and source facts without inventing architecture, performance, ownership, diagnoses, or advice.”即 Skill 3 只负责呈现与交互,绝不“发明”架构边、性能数据、归属关系、诊断结论或建议;后端输入一律只读,report/目录被视为“生成的运行时”(generated runtime)。
与相邻 Skill 的关系
- 本 Skill 依赖 skills/cann-perf-breakdown-to-ui-json/ 产出的
model_architecture_graph.v1图、overlay 与 bindings;SKILL.md 明确要求skill3_adapter: generic,即对所有模型家族统一使用通用适配器,拒绝模型专属 builder; - 当修改架构投影或图形渲染时,SKILL.md 要求同时同步阅读已安装的
pto-json-architecture-graphSkill 及其架构契约,保持内置图校验器同步(源码中 generate-report.mjs 在生成前会强制检查校验器存在,缺失即报错Missing synchronized architecture validator); - 来源溯源(provenance)中声明涉及
cann-perf-breakdown与cann-perf-breakdown-to-ui-json两个上游 Skill。
事实边界原则(Preserve fact boundaries)
这是整个 Skill 的灵魂,SKILL.md 列出七条不可逾越的边界,全部在 validate-report.mjs 中有对应断言:
| 边界原则 | 校验实现(validate-report.mjs 中的断言示例) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 仅通过显式稳定身份(stable identity)拼接 analysis / performance / Timeline / raw Trace / Skill 2 产物 | 断言model_id、report_id在 analysis、performance、timeline 三份后端文件中完全一致;traceBindings.model_id/report_id与报告身份一致 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
架构图仅以model_architecture_graph.v1的 roots 与 edges 渲染,严禁从层级、源码顺序、kernel 顺序、Timeline 顺序或 Trace Flow 推断边 | 校验器要求每条边 source/target 必须能解析到声明项、必须带 tensor 与 provenance;并检测“数据流环” | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 性能与 Trace 交互仅对显式映射的后端节点开放,source-only 节点保持无指标、无 Trace | 断言 source-only 渲染项无 backendNodeId、无 metricBadge,且保留 sourceRefs 可选中 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 运行时辅助(runtime auxiliary)游离于源码模型数据流之外 | 图契约要求section/source_architecture与section/runtime_auxiliary两个独立根 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 保留原始 item/edge ID、元数据、tensor 字段、约束、provenance 与源码引用 | 断言边保留tensor与provenance数组;映射全部能解析到逻辑项且携带 evidence | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 切换 UI 语言时不得改动源码作者编写的模型标签 | 语言本地化仅作用于标题、按钮等 UI 文案 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 新报告默认中文,同时尊重已保存的中/英文偏好 | 断言index.html默认lang="zh-CN">{ "schema_version": "ui_report_handoff.v1", "model_family": "deepseek_v3_2", "skill3_adapter": "generic", "inputs": { "analysis": "../model_analysis_config.json", "performance": "../model_perf_data.json", "timeline": "../model_timeline.json", "trace": "../trace_view.json", "bindings": "./outputs/trace_bindings.json", "architecture": "./outputs/model_architecture_graph.json", "overlay": "./outputs/architecture_overlay_map.json" }, "optional_inputs": { "operator_details": "./outputs/operator_details.json", "hbm": "./outputs/hbm_series.json", "findings": "./outputs/metrics_findings.json", "expert_inventory": "./outputs/expert_inventory.json" }, "capabilities": { "repeatedLayers": true, "expertInventory": true, "expectedGraphFeatures": { "fanOutMin": 2, "fanInMin": 2, "residualEdgesMin": 2, "parallelRowsMin": 1 } }, "provenance": { "skills": ["cann-perf-breakdown", "cann-perf-breakdown-to-ui-json"], "modelSource": "models/modeling_example.py", "extractorModel": "model-name" } }校验规则( 七个必需输入
可选输入与 HBM 输入目录
此外生成器会在正常生成时发现式读取上游文件:算子详情依次尝试 当使用
注意:AICore 频率目前没有独立的通用输入文件,必须由配置好的 HBM/设备档案产物提供;粗粒度的 HBM 采样不能用于推导逐算子带宽归属。 生成命令与运行时配置标准生成命令可选输入补充: CLI 参数语义(generate-report.mjs 源码确认):
事务式生成与回滚保障生成器源码实现了一套完整的“事务”机制:
运行时配置 report-config.js
只读检查 |
| 状态 | 含义 |
|---|---|
deterministic_status: passed | 所有适用的自动化检查通过 |
| 人工检查项(browser_smoke_1440x1000 / file_protocol_smoke / visual_review) | 取值passed/failed/not_run |
overall_status: pending_manual_validation | 确定性检查通过但人工检查未完成 |
overall_status: passed | 确定性 + 全部必需人工检查通过 |
not_applicable | 仅用于能力明确缺席;绝不可替代缺失的应有证据 |
校验矩阵(validation-matrix.md)的确定性检查覆盖:生成安全、配置、模板、后端身份、架构、绑定、Layer、分支、可选数据、独立运行十个方面;并提示“避免把源码字符串出现当作行为证明”,优先纯适配器测试与 DOM/浏览器集成测试,字符串检查仅保留给静态禁用模式。
浏览器终验(Final browser validation)
确定性检查通过后,在1440 × 1000视口下用规范报告 URL 执行一次冒烟测试;若涉及独立交付,还要执行一次file://冒烟。至少验证:
- 无 console / 资源加载错误;
- 架构图、Inspector、Trace 加载的是当前数据;
- mapped / source-only / aggregate / runtime 各类选择遵守事实边界;
- 三个不相邻 Layer 切换时,图徽章、Inspector 指标、Sequence 事件与 Flow 同步更新且算子身份不变;
- 声明的分支、residual 与 Layer 选择桥保持连通;
- 热力图图例、本地化文案、tooltip、HBM 缺失态与可选专家投影符合 UI 契约;
- 空画布选择重置与 Trace 的 focus/zoom/pan 均可用。
只有把浏览器、file 协议与视觉检查结果都记入校验清单后,overall_status才能置为passed。
失败路由(Failure routing)
SKILL.md 按失败类型给出明确的归因与处理方向,且禁止直接修改后端 JSON:
| 失败类型 | 处理 |
|---|---|
| 身份、节点覆盖、Timeline owner 或 Trace 绑定不匹配 | 回退为 Skill 1/2 的数据需求,不打补丁到后端 JSON |
| 缺边/tensor/provenance、重复成员非法、fan-out/fan-in/residual 不足 | 回退为 Skill 2 的图需求 |
| Source lock 不匹配 | 停止并重新提取/评审架构,绝不盲目更新哈希 |
| 布局、样式、本地化、交互、选择或运行时传输问题 | 修 Skill 3 模板并重新生成 |
| 无法解析的事实 | 保持“不可用”呈现;严禁仅凭叶子标签相似就强行映射以提高覆盖率 |
该路由机制在生成器源码中有自动化支撑:generate-report.mjs 内置UPSTREAM_DIAGNOSTIC错误模式映射表,例如tensor.name is required→ Skill 2 的build_architecture_graph.py(补边上的 tensor 名/形状/dtype)、dataflow cycle detected→ Skill 1(analysis_config_v2)或 Skill 2(检查 children/branches 串行顺序)、repeatCount must be/instanceIndices length→ Skill 2 的build_node_index.py、residual edge but dashed is not true→ Skill 2 标记dashed=true等。子校验器退出码非零时,生成器自动打印“Upstream Skill Diagnostic”帮助定位上游归属。
模板同步与 override 机制
报告的可复用 UI 文件(index.html、app.js、design-system 等)必须与 Skill 模板哈希一致,这是validate-report.mjs的硬性检查;只有两类例外:
--refresh-template:整体重新同步模板,同时保留模型专属的report-config.js与outputs/;- 经过评审的逐报告偏差:通过
ReportRuntimeConfig.templateOverrides(或 handoff 的template_overrides)显式声明,校验器对声明文件打印OVERRIDE警告而非STALE失败。
这一机制保证了“可复用的视觉与交互行为在 Skill 内集中演进、先改模板再同步”,避免各模型报告之间出现无节制的 UI 分叉。
结语
cann-perf-ui-json-report是 CANN oam-tools 性能分析流水线的“最后一公里”:它把 Skill 1/2 沉淀的后端事实,以严格的事实边界、事务式生成、确定性校验与人工冒烟验证,交付为可直接在浏览器与file://环境下运行的中英文交互式性能报告。其工程价值不只在于“能出图”,更在于一整套可回归、可归因、防漂移的质量护栏——--check的逐字节只读保证、失败时的完整回滚、模板哈希锁定、层作用域指标的数值级验证,以及按错误模式自动路由到上游 Skill 的诊断机制。对于希望在 oam-tools 生态内构建或扩展此类报告能力的开发者,建议从本文引用的四份契约文档与各校验脚本入手,先理解“事实从哪来、边界在哪里”,再动手修改呈现层。
如需进一步深入,可继续阅读:数据契约、输入文件清单、UI 契约、校验矩阵,以及上游衔接 Skill cann-perf-breakdown-to-ui-json。
【免费下载链接】oam-tools本项目为开发者提供故障定位工具,包含故障信息收集,软硬件信息展示,AI core error报错分析等能力,提升故障问题定位效率,文档可在昇腾社区搜索“故障处理简介”(选择社区版)。项目地址: https://gitcode.com/cann/oam-tools
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考