msOpProf 算子性能调优

SkillMonitoring & ops

Use this skill when the user wants to use msOpProf (`msprof op` / `msprof op simulator`) for on-board or simulation performance tuning of Ascend AI operators, needs explanations of `aic-metrics`/`trace.json`/`visualize_data.bin`, needs to choose between the device vs simulator paths, needs to troubl

Available today. Use it from your connected AI after setup.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

Then ask your AI: use the msOpProf 算子性能调优 skill

What this skill tells your AI

The instructions your AI receives, as published by kali20gakki/msagent in skills/operator/msot-msopprof-operator-profiler/SKILL.md and read by ahel’s review.

使用本技能时,咨询和执行任务都必须先完成资料查询:在代码仓 https://gitcode.com/Ascend/msopprof 查询 msopprof 与 msopprof simulator 使用资料。下文及 references 中的参数、能力边界和命令模板按返回的相关正文核验后使用;查询失败时查找本地相关工具或本地资料参考用法回答和命令执行。

何时必须使用本技能

当用户问题包含以下任一类需求时,应优先使用本技能:

  • 明确提到 msprof op、msprof op simulator、msOpProf
  • 询问如何做 算子性能调优 / 上板调优 / 仿真调优
  • 询问如何查看或解释:
    • visualize_data.bin
    • trace.json
    • OpBasicInfo.csv
    • PipeUtilization.csv
    • MemoryDetail
    • Roofline
    • PMSampling
  • 询问如何在 device vs simulator 之间选择
  • 询问 application / config / export 三种输入形态的差别
  • 询问如何生成 固定报告 / 模板化结论 / Top 5 总结
  • 遇到以下高频故障:
    • signal 6
    • Bad address
    • --soc-version 不生效
    • --kernel-name 不生效
    • --export 目录如何组织
    • TimelineDetail / PMSampling / --core-id 为什么行为不符合预期

不要在这些场景误用本技能

  • 用户只是在问通用 CANN 安装,而不是 msOpProf 本身
  • 用户只想修一个普通编译错误,且问题与 msOpProf 调优流程无关
  • 用户只是要翻译某段文档,而不是要执行或理解调优流程
  • 用户要分析的是其他 profiling 工具(如纯 DB 分析、整机 profiler、非 msOpProf 产物)

技能目标

帮助算子开发者在 上板(device) 或 仿真(simulator) 模式下:

  1. 选对运行模式和输入形态(application / config / export)。
  2. 生成最小可用且可解释的性能数据。
  3. 根据产物类型(CSV / visualize_data.bin / trace.json)选择正确查看方式。
  4. 避免被模式差异、芯片限制、参数互斥和目录要求误导。

执行协议

每次使用本技能时,按下面顺序工作,不要跳步:

  1. 先识别用户当前模式
    • 用户到底在问 device、simulator,还是还没决定?
  2. 再识别输入形态
    • application / config / export
  3. 再识别目标
    • 采集数据、解释产物、选参数、排故、看热点图还是看流水图
  4. 只加载必要 reference
    • 若用户重点是上板路径,优先读 references/device-tuning-guide.md
    • 若用户重点是仿真路径或 dump/trace 解析,优先读 references/simulator-tuning-guide.md
    • 若用户给了 signal 6 / Bad address 等仿真拉起错误,再读 experiences/simulator-needs-sim-build.md
  5. 输出时必须显式带条件
    • 说明“这条建议适用于 device 还是 simulator”
    • 说明“这条参数是否只对 application / config / export 生效”

使用本技能时的硬规则

  1. 先分模式,再谈参数。
    • msprof op ... = 上板调优。
    • msprof op simulator ... = 仿真调优。
  2. 先分输入形态,再谈命令。
    • application:拉起可执行文件。
    • config:基于 JSON 配置和 .o 文件。
    • export:仅在 simulator 模式下,直接解析已有 dump。
  3. 不要把条件化事实说成统一结论。
    • 很多参数只在特定模式、芯片或输入形态下生效。
  4. 区分官方事实与经验。
    • 本技能的主说明以当前仓内 msopprof 参考代码和 user guide 为准。
    • experiences/ 下的内容视为经验案例,不自动提升为通用规则。
  5. 遇到文档口径差异时必须明说。
    • 例如仓内不同章节对通算流水图支持范围有不同表述;若用户追问精确支持范围,优先以当前安装版本帮助信息和对应专章为准。

禁止事项

  • 不要把 simulator 的 trace.json 和 device 的 trace.json 混成同一种语义。
  • 不要把 TimelineDetail 说成 simulator 参数。
  • 不要把 --soc-version 说成所有 simulator 场景都必选。
  • 不要把 --kernel-name 说成对 config / export 也有效。
  • 不要把经验文件中的案例说成“所有工程都必须这样”。
  • 不要在没有说明前提的情况下,直接给出一个看似通用的命令。
  • 没有实际 profiling 数据时,不要强行输出 Top 5 固定报告。
  • 数据不足 5 项时按真实数量输出,不要补齐、不造数。
  • 不要把命令指导、环境准备或经验猜测伪装成“核心瓶颈”或“优化建议”。
  • 不要给出与当前模式明显不兼容的建议(例如把 simulator 参数建议给 device)。

快速决策树

  1. 你有真实 NPU 卡,且要看真实硬件瓶颈吗?
    • 是:优先走 上板调优。
  2. 你没有卡,或者要看指令级流水 / 代码热点吗?
    • 是:优先走 仿真调优。
  3. 你的输入是什么?
    • 可执行文件:application
    • JSON + .o:config
    • 已有 dump:export(仅 simulator)
  4. 你要的是哪类结论?
    • 真实耗时 / 内存 / Cache / Roofline:优先上板
    • 指令流水 / 每核热点 / 指令级冲突:优先仿真

默认输出契约

默认按两条分支输出,不要混用:

分支 A:结果分析 / 调优结论 / 报告化输出

满足以下任一条件时,最终回复默认使用固定四段报告模板:

  • 用户已经给出 profiling 产物或结果现象,要求解释 / 总结 / 诊断 / 调优建议
  • 用户明确要求“报告”“模板化输出”“Top 5 结论”
  • 当前任务重点是解释 csv / visualize_data.bin / trace.json / 热点图 / 流水图,而不是教用户先跑命令

分支 B:命令指导 / 模式选择 / 采集前排障

满足以下场景时,不强制使用固定报告模板,继续使用 guidance-first 输出:

  • 用户还没有 profiling 数据,只是在问怎么采集
  • 用户重点是选 device / simulator / application / config / export
  • 用户处于启动失败、环境不通、参数不会配的阶段

此时优先输出:

  1. 建议路径
    • 先明确推荐 device 还是 simulator,以及原因
  2. 可直接执行的最小命令
    • 给出与用户当前场景匹配的最小正确命令
  3. 关键限制
    • 只列当前问题真正相关的 2~5 条限制
  4. 怎么看结果
    • 告诉用户跑完后看哪一个文件、用什么工具打开、重点看什么
  5. 下一步
    • 若这是首轮采集:告诉用户下一步该加什么指标
    • 若这是排障:告诉用户下一步该补什么信息或切哪条路径

固定报告模板(默认用于结果分析)

模板启用规则

  • 默认 TOPx = TOP5
  • 如果用户明确指定别的 x,可覆盖默认值
  • 数据不足 5 项时按真实数量输出,不补齐
  • 每个 Top 条目都应尽量带 数据来源
  • 如果当前模式或数据集不支持某项,写 N/A、未采集 或 不适用当前模式

固定标题

结果分析场景下,最终回复默认使用以下四段标题,不要自行改名:

## 1. 算子基本信息
## 2. 关键数据 TOP5
## 3. 核心瓶颈 TOP5
## 4. 优化建议 TOP5

1. 算子基本信息

使用短表格或键值表,不使用 Top 5。默认字段:

字段内容
模式device / simulator
输入形态application / config / export
算子名 / 目标对象当前分析对象
芯片 / 仿真器芯片型号或 simulator 类型
采集指标当前启用的 aic-metrics 或主要分析视图
主要产物当前引用的 CSV / bin / trace
数据来源文件或产物类型

缺字段时写 未提供 / 未采集,不要脑补。

2. 关键数据 TOP5

使用短表格,固定列:

排名指标/对象数值/现象意义数据来源

填充规则:

  • 只放最值得看的关键数据,不要变成全量指标列表
  • device 场景优先来自:OpBasicInfo.csv、PipeUtilization.csv、ArithmeticUtilization.csv、Memory.csv、L2Cache.csv、ResourceConflictRatio.csv
  • simulator 场景优先来自:trace.json、core*_code_exe.csv、core*_instr_exe.csv、PMSampling

3. 核心瓶颈 TOP5

使用短表格,固定列:

排名瓶颈结论判断依据影响数据来源

填充规则:

  • 必须把“结论”和“依据”分开
  • 没有足够证据时写 待确认,不要把猜测写成确定事实
  • 不要直接复述经验案例;只有当前现象匹配时,才能把经验作为辅助说明

4. 优化建议 TOP5

使用短表格,固定列:

排名建议对应瓶颈预期收益/目的前提/来源

填充规则:

  • 建议必须与“核心瓶颈 TOP5”逐项关联
  • 不要给与当前模式不兼容的建议
  • 纯命令指导、环境准备或尚未验证的假设,不应冒充优化建议

报告模板的模式差异处理

固定模板只有一套,但字段解释按 mode 变化:

  • simulator 的 trace.json = 指令流水图依据
  • device 的 trace.json = 通算 / 通信相关流水图依据
  • PMSampling 只应出现在支持的 simulator 场景
  • TimelineDetail 只应出现在支持的 device 场景

统一原则:

  • 标题和表格列固定
  • 数据来源允许按 mode 变化
  • 不适用项明确写 N/A 或 不适用当前模式

高频踩坑(优先提醒用户)

  • --kernel-name 只支持 application 模式;对 --config / --export 无效。
  • simulator 的 --config 场景应通过 LD_LIBRARY_PATH 指定仿真器;--soc-version 在该场景不生效。
  • --export 仅用于 simulator,且目录中应包含 dump 数据;如需代码行映射,还应包含 aicore_binary.o。
  • TimelineDetail 是 device 模式能力,在 simulator 模式下无效。
  • --replay-mode=range 必须配合 --mstx=on。
  • --replay-mode=range 不能与 TimelineDetail / Source / MemoryDetail 同时使用。
  • simulator 默认指标是 PipeUtilization + ResourceConflictRatio;PMSampling 默认不开启。
  • PMSampling 解析全部核,--core-id 对它不生效。
  • 输出、配置、导出目录会做权限与软链接检查;权限不对时工具会直接报错。
  • device 模式里的 --dump / --core-id 是与特定能力和芯片绑定的特殊行为,不要当成 simulator 通用参数理解。

模式与输入形态矩阵

模式输入形态是否支持备注
deviceapplicationY最常见;支持 --kernel-name、--launch-skip-before-match
deviceconfigY基于 JSON + .o,--kernel-name 不生效
deviceexportN仅 simulator 支持
simulatorapplicationY可用 --soc-version 或 LD_LIBRARY_PATH 指定仿真器
simulatorconfigY应使用 LD_LIBRARY_PATH;--soc-version 不生效
simulatorexportY只解析已有 dump,不重新仿真

常用命令模板

上板调优(application)

# 单算子默认采集
msprof op --output=./output_npu ./execute_add_op

# 采集全量基础指标 + Roofline
msprof op --aic-metrics=Roofline,Default --output=./output_npu ./execute_add_op

# 多算子:采集前 10 个匹配 Add/Sub 的算子
msprof op --launch-count=10 --kernel-name="Add|Sub" --output=./output_npu ./test

上板调优(config)

msprof op --config=./add_test.json --aic-metrics=Default --output=./output_npu

仿真调优(application)

# 方式 1:显式指定仿真器
msprof op simulator --soc-version=Ascend910B4 --output=./output_sim ./execute_add_op

# 方式 2:通过环境变量指定仿真器
export LD_LIBRARY_PATH=${INSTALL_DIR}/tools/simulator/Ascend910B4/lib:$LD_LIBRARY_PATH
msprof op simulator --output=./output_sim ./execute_add_op

仿真调优(config)

export LD_LIBRARY_PATH=${INSTALL_DIR}/tools/simulator/Ascend910B4/lib:$LD_LIBRARY_PATH
msprof op simulator --config=./add_test.json --output=./output_sim

仿真调优(export)

msprof op simulator --soc-version=Ascend910B4 --export=./dump_dir --output=./output_sim

参数边界速查

适用于两个模式,但要看输入形态

参数说明备注
--output输出目录默认当前目录,受权限与软链接限制
--launch-count最大采集算子数量默认 1,范围 [1,5000]
--mstx使能 mstxon/off
--mstx-include只使能指定 mstx message必须配合 --mstx=on
--kernel-name匹配目标算子名仅 application 模式有效

device 模式

参数说明
--aic-metrics选择上板指标能力
--replay-modekernel / application / range
--launch-skip-before-match跳过前 N 个算子不采集
--kill采集完成后自动停止程序
--warm-up预热次数,默认 5

simulator 模式

参数说明
--soc-versionapplication/export 场景可用;config 下不生效
--export解析已有 dump
--timeout超时后强制终止仿真并进入解析
--core-id只解析指定核,范围 [0,49]
--dump是否保留 dump;存在芯片和场景限制

指标与产物速查

上板 --aic-metrics

指标作用常见产物备注
Default基础 CSV 指标多个 CSV默认基础采集能力
RooflineRoofline 瓶颈分析visualize_data.bin与 Default 绑定
Occupancy核间负载分析visualize_data.bin仅部分芯片支持
Source代码热点图visualize_data.bin通常需 -g 编译
MemoryDetailL2 / 内存细节增强CSV + visualize_data.bin与 Default 绑定
TimelineDetail指令流水 + 上板热点图增强visualize_data.bindevice-only,且限制较多
PipeTimelinePipe 流水图trace.json + visualize_data.bin仅Ascend 950PR&950DT系列产品
KernelScale指定代码段采集CSV / 可视化依赖 Kernel 侧插桩 API
PcSamplingSIMT stall 信息visualize_data.bin仅Ascend 950PR&950DT系列产品
BasicInfo只采集基础信息OpBasicInfo.csv轻量模式

说明:

  • 如果用户既要 TimelineDetail 又要常规 CSV / 计算内存热力图,通常需要显式带上 Default。
  • TimelineDetail / Source / MemoryDetail 与 range replay 不能共存。

仿真 --aic-metrics

指标作用默认情况
PipeUtilization指令流水默认开启
ResourceConflictRatio同步事件 / 冲突细节默认开启
PMSampling内存通路吞吐率波形图默认关闭

输出产物结构

上板模式(单算子常见结构)

OPPROF_{timestamp}_XXX/
├── dump/
├── OpBasicInfo.csv
├── PipeUtilization.csv
├── ArithmeticUtilization.csv
├── Memory.csv
├── MemoryL0.csv
├── MemoryUB.csv
├── L2Cache.csv
├── ResourceConflictRatio.csv
├── visualize_data.bin
└── trace.json            # 仅在支持的通算/特定视图场景下生成

仿真模式(单算子常见结构)

OPPROF_{timestamp}_XXX/
├── dump/
└── simulator/
    ├── core0.veccore0/
    │   ├── core0.veccore0_code_exe.csv
    │   ├── core0.veccore0_instr_exe.csv
    │   └── trace.json
    ├── core0.veccore1/
    │   ├── core0.veccore1_code_exe.csv
    │   ├── core0.veccore1_instr_exe.csv
    │   └── trace.json
    ├── ...
    ├── visualize_data.bin
    └── trace.json        # 全核汇总流水图

多算子补充说明

  • device 多算子输出通常会按 OpName/<order>/... 组织,单算子时工具可能自动平铺整理。
  • simulator 多算子输出会按 OpName/<order>/dump|simulator 组织,且 simulator 目录中的 CSV 常带时间戳后缀。

如何看结果

  • CSV 文件:适合快速查总耗时、带宽、利用率、冲突占比。
  • visualize_data.bin:用 MindStudio Insight 查看热力图、Roofline、热点图、流水图等。
  • trace.json:
    • device:主要用于通算/通信相关流水图;
    • simulator:主要用于指令流水图(每核与全核汇总)。
  • 如果用户只说“看 trace.json”:必须先判断该文件来自 device 还是 simulator,再决定解释方式。

推荐分析流程

上板

  1. 用 Default 跑通一版,先看 OpBasicInfo.csv 和 PipeUtilization.csv。
  2. 开 Roofline 判断 Compute Bound / Memory Bound / Latency Bound。
  3. 若偏内存:继续看 Memory.csv / MemoryDetail。
  4. 若偏计算:继续看 ArithmeticUtilization.csv、必要时看 Source。
  5. 若怀疑核间不均衡:开 Occupancy。
  6. 若是通算融合算子:再看 trace.json。

仿真

  1. 先用默认指标(PipeUtilization + ResourceConflictRatio)拿到基本流水。
  2. 看 MTE 与 VECTOR/CUBE 是否并行,是否有明显 bubble。
  3. 看 SET_FLAG/WAIT_FLAG 是否造成不必要等待。
  4. 如需内存通路波形,再显式开 PMSampling。
  5. 数据太大时优先用 --timeout,热点集中到少数核时再用 --core-id 精细化。

结果解读提醒

  • Roofline 与 pipeline 占比的推断是分析线索,不是唯一真相;需要结合 CSV/热点图交叉验证。
  • simulator 提供的指令级视角更细,但它不等同于真实硬件最终耗时。
  • 上板结果更接近真实运行瓶颈,但指令级细节通常不如 simulator 丰富。

深度参考

经验沉淀

Signals

GitHub stars
31
Forks
8
Last commit
Sep 2026
Advanced
Item type
skill
Key
msot-msopprof-operator-profiler
Source
github.com/kali20gakki/msagent