CANN oam-tools 中 mstx API 使用示例:为应用添加自定义耗时打点并借助 msprof 采集

发布时间:2026/9/18 20:13:00

CANN oam-tools 中 mstx API 使用示例:为应用添加自定义耗时打点并借助 msprof 采集 CANN oam-tools 中 mstx API 使用示例为应用添加自定义耗时打点并借助 msprof 采集【免费下载链接】oam-tools本项目为开发者提供故障定位工具包含故障信息收集软硬件信息展示AI core error报错分析等能力提升故障问题定位效率文档可在昇腾社区搜索“故障处理简介”选择社区版。项目地址: https://gitcode.com/cann/oam-tools导读mstx API 是 CANN 提供给开发者的一套轻量级打点接口用于在用户程序或上层框架代码中记录特定事件发生的时间跨度帮助定位应用瓶颈。本文以 oam-tools 仓库中 mstx API使用示例 为骨架完整给出基于 AscendCL 的 mstx 打点示例代码并深入讲解 Range 与 Domain 两大核心概念、msprof 采集命令及 domain 过滤参数的源码级实现。读完本文你将掌握如何在自己的推理/训练程序中插入 mstx 打点、如何用msprof --msproftxon采集并裁剪输出数据以及这些接口在 msprof 侧的数据流转机制。一、mstx API 在 Profiling 体系中的定位在 CANN 的 Profiling 数据体系中msprof 工具支持采集多种数据。其中用户自定义事件的时间跨度数据属于msproftx 数据类别。在 采集msproftx数据 中明确给出了三种打点方式的使用建议通用场景推荐使用mstx API也可选 msproftx APIPyTorch 场景使用 TorchNPU Profiler API。即当需要定位应用程序或上层框架程序的性能瓶颈时通过特定接口记录应用程序执行期间特定事件发生的时间跨度写入性能数据文件。mstx API 是其中的首选方案其核心价值在于——用户不需要关心 msprof 的底层采集细节只需在业务代码的关键路径如模型执行前后、通信任务前后插入极简的起止打点即可获得 host 侧与 device 侧的耗时数据。二、环境准备与样例代码获取mstx API 样例代码随 Ascend-cann-toolkit 工具包一起发布使用前需要满足如下前提安装 Ascend-cann-toolkit 包确保已正确安装 CANN 软件工具包参见 《CANN 软件安装》 与 快速安装指南。定位样例代码mstx API 样例代码集成在 Ascend-cann-toolkit 包中路径为${INSTALL_DIR}/tools/mstx/samples其中${INSTALL_DIR}为 CANN 软件安装后的文件存储路径。以 root 用户安装为例默认存储路径为/usr/local/Ascend/cann按 README 使用样例进入上述samples目录后依据其中的 README 文档编译与运行样例。说明本节提供的打点代码为示例性质非完整可独立编译的工程完整样例请以上述 CANN 安装路径下的tools/mstx/samples为准。三、mstx API 核心概念Range 与 Domain在进入代码之前先理解 mstx 的两个核心抽象。仓库源码 mstx_def.h 中定义了相关数据类型using mstxRangeId uint64_t; // Range 的句柄类型为 64 位无符号整数 struct MstxDomainRegistrationSt {}; typedef struct MstxDomainRegistrationSt MstxDomainHandle; typedef MstxDomainHandle* mstxDomainHandle_t; // Domain 的句柄类型Range时间区间一次打点记录的起止区间。调用mstxRangeStartA开启一段区间并返回mstxRangeId其值为 0 表示无效 Range源码中定义为MSTX_INVALID_RANGE_ID 0随后调用mstxRangeEnd(rangeId)关闭该区间。Range 数据包含 start/end 两个时间戳msprof 据此计算该段代码的真实耗时。Domain域对打点事件进行逻辑分组的容器。默认情况下打点属于默认 domain源码中以default标识用户可调用mstxDomainCreateA创建自定义 domain并针对性地在指定 domain 内打点。Domain 的用途在于数据裁剪——msprof 采集时可以通过--mstx-domain-include/--mstx-domain-exclude只保留或过滤特定 domain 的数据从而减小输出体积、聚焦分析目标。从 mstx_def.h 的函数表枚举可以看出 mstx 接口的完整功能面核心模块MSTX_API_MODULE_CORE包含MSTX_FUNC_START、MSTX_FUNC_MARKA、MSTX_FUNC_RANGE_STARTA、MSTX_FUNC_RANGE_END等核心域模块MSTX_API_MODULE_CORE_DOMAIN包含MSTX_FUNC_DOMAIN_CREATEA、MSTX_FUNC_DOMAIN_DESTROY、MSTX_FUNC_DOMAIN_MARKA、MSTX_FUNC_DOMAIN_RANGE_STARTA、MSTX_FUNC_DOMAIN_RANGE_END等。即 mstx API 家族除本文示例用到的 Range/Domain 打点接口外还提供 Mark 标记类接口mstxMarkA、mstxDomainMarkA与 domain 销毁接口mstxDomainDestroy对应声明可见 mstx_inject.h。四、mstx API 使用示例完整代码以下是使用 mstx API 执行采集操作的示例代码完整覆盖了AscendCL 初始化 → 资源申请 → 默认 domain 打点 → 自定义 domain 打点 → 资源释放 → 去初始化的完整流程aclrtContext context_; aclrtStream stream_; // 1. AscendCL初始化 aclError ret ACL_ERROR_NONE; ret aclInit(nullptr); if (ret ! ACL_SUCCESS) { ERROR_LOG(aclInit failed); return FAILED; } // 2. 申请运行管理资源包括设置用于计算的Device、创建Context、创建Stream ret aclrtSetDevice(0); if (ret ! ACL_ERROR_NONE) { ERROR_LOG(aclrtSetDevice failed); return FAILED; } ret aclrtCreateContext(context_, 0); if (ret ! ACL_ERROR_NONE) { ERROR_LOG(acl create context failed); return FAILED; } ret aclrtCreateStream(stream_); if (ret ! ACL_ERROR_NONE) { ERROR_LOG(acl create stream failed); return FAILED; } .... // 3. 在想采集耗时的代码位置添加打点代码比如在执行模型前后打点获取模型执行耗时 mstxRangeId rangeId mstxRangeStartA(model execute, nullptr); // 第二个入参设置nullptr只记录host侧range耗时(适用于纯host侧代码段)设置有效的stream同时记录host侧和对应device侧耗时(适用于下发计算任务或通信任务) ret aclmdlExecute(modelId, input, output); // 执行模型样例代码 mstxRangeEnd(rangeId); // 4. 步骤3里的打点数据属于默认domain可调用mstx domain相关接口创建自定义domain并指定domain进行打点 mstxDomainHandle_t selfDomain mstxDomainCreateA(self_domain); mstxRangeId domainRangeId mstxDomainRangeStartA(selfDomain, model execute, nullptr); ret aclmdlExecute(modelId, input, output); // 执行模型样例代码 mstxDomainRangeEnd(selfDomain, domainRangeId); // 5. 释放运行管理资源 // 6. AscendCL去初始化4.1 逐步拆解步骤 1AscendCL 初始化。aclInit(nullptr)完成 AscendCL 运行环境的初始化是所有 AscendCL 程序的第一步需先于后续所有资源申请与 mstx 打点执行。步骤 2申请运行管理资源。依次调用aclrtSetDevice(0)设置用于计算的 Device、aclrtCreateContext(context_, 0)创建 Context、aclrtCreateStream(stream_)创建 Stream。这是执行模型推理/训练任务的前置条件mstx 打点必须运行在已初始化好的 AscendCL 环境中。步骤 3默认 domain 打点——获取模型执行耗时。这是 mstx 最基本的用法mstxRangeId rangeId mstxRangeStartA(model execute, nullptr); ret aclmdlExecute(modelId, input, output); // 执行模型 mstxRangeEnd(rangeId);mstxRangeStartA的第二个入参stream是决定采集范围的关键传入nullptr只记录 host 侧 range 耗时适用于纯 host 侧代码段传入有效的 stream同时记录 host 侧和对应 device 侧耗时适用于下发计算任务或通信任务的场景如上面的aclmdlExecute。此处的打点数据属于默认 domainmsprof 侧以default标识。步骤 4自定义 domain 打点。当业务中存在多个逻辑阶段如数据预处理、前向计算、梯度更新时可将它们归入不同 domain 以便在采集端按需裁剪mstxDomainHandle_t selfDomain mstxDomainCreateA(self_domain); mstxRangeId domainRangeId mstxDomainRangeStartA(selfDomain, model execute, nullptr); ret aclmdlExecute(modelId, input, output); mstxDomainRangeEnd(selfDomain, domainRangeId);mstxDomainCreateA(self_domain)创建名为self_domain的自定义 domain 并返回其句柄mstxDomainHandle_t后续打点均需携带该句柄以便 msprof 将事件归入对应 domain。mstxDomainRangeEnd(selfDomain, domainRangeId)在结束时同时传入 domain 句柄与 range id完成区间闭合。步骤 5/6释放资源与去初始化。打点完成后需释放步骤 2 申请的运行管理资源并调用 AscendCL 去初始化接口保证程序正常退出且数据完整落盘。4.2 打点位置的选择建议从工程实践角度看mstx 打点的信息密度取决于埋点位置的选择常见做法包括在模型执行aclmdlExecute前后打点直接得到模型推理耗时在通信任务如集合通信前后打点评估多卡并行下的通信开销在数据预处理、后处理等 host 侧代码段打点定位 host 瓶颈将不同阶段的打点归入不同 domain配合采集参数按需输出。五、采集与结果解析msprof 命令打点代码就绪后需使用 msprof 工具采集 mstx 数据。相关命令格式与参数详见 采集msproftx数据。5.1 命令格式登录运行环境执行如下命令msprof [options] app 或 msprof [options] --applicationapp采集 mstx 数据必须传入用户程序app因为打点事件产生于被采集程序的运行过程。5.2 关键参数参数必选/可选说明--msproftx必选控制 msproftx/mstx 用户程序和上层框架输出性能数据的开关可选on或off默认值为off。采集 mstx 数据时必须配置为on。--mstx-domain-include可选只输出指定 domain 的数据。填写mstxDomainCreateA接口的 name多个 domain 用逗号隔开default表示默认 domain。需搭配--msproftxon。与--mstx-domain-exclude互斥。--mstx-domain-exclude可选过滤掉指定 domain 的数据。填写规则与 include 相同需搭配--msproftxon。与--mstx-domain-include互斥。domain 参数的完整规则依据 采集msproftx数据 与 PROFILING_OPTIONS 环境变量说明若 include 与 exclude 均不配置采集所有 domain 数据若配置了程序中不存在的 domain采集结果中无该 domain 的数据include 与 exclude 不可同时配置。5.3 使用示例msprof --msproftxon /home/projects/MyApp/out/main采集完成后在--output指定的目录下生成PROF_XXX目录存放自动解析后的性能数据其中即包含 mstx Range 事件的时间跨度数据。5.4 参数约束的源码验证上述参数约束并非仅存在于文档而是有明确的源码实现。在 msprof 的命令行参数解析与校验代码 input_parser.cpp 中--msproftx、--mstx-domain-include、--mstx-domain-exclude三个参数被分别解析并写入采集参数结构体校验逻辑要求当--msproftx不为on时若配置了 include/exclude 参数则报错Argument --mstx-domain-include/--mstx-domain-exclude must be used with --msproftxon.同时校验 include 与 exclude 不能同时配置否则报错Argument --mstx-domain-include and --mstx-domain-exclude ...。此外参数注册表中对该两个 domain 参数的描述也明确了default用于过滤默认 domain、仅当--msproftxon时生效、二者不可同时设置。这与文档描述完全一致开发者在使用时可放心依赖此约束。六、源码级原理mstx 数据在 msprof 侧如何流转为了让读者对 mstx API 有更深入的理解下面结合仓库源码说明打点数据从用户程序到性能文件的流转路径。从代码结构看mstx 在 msprof 侧由三部分协作完成6.1 注入机制与函数表mstx 采用函数表注入的方式与 msprof 交互。mstx_inject.h 声明了InitInjectionMstx(MstxGetModuleFuncTableFunc)与GetModuleTableFunc(...)等注入入口mstx_def.h 中定义了模块枚举PROF_MODULE_MSPROF、PROF_MODULE_MSPTI与函数表类型MstxFuncTable。可以推断用户程序中的mstxRangeStartA等调用实际通过注入的函数表路由到 msprof 侧对应的处理函数从而将打点事件送入采集链路。6.2 Domain 管理mstx_domain_mgr.h 中的MstxDomainMgr负责 domain 的注册与管理每个 domain 以nameHash名称哈希作为内部标识CreateDomainHandle/DestroyDomainHandle管理句柄生命周期mstxDomainAttr结构体中的enabled标志默认置为true当该 domain 出现在--mstx-domain-exclude列表、或不在--mstx-domain-include列表中时会被置为false源码注释明确说明此逻辑SetMstxDomainsEnabled接收 include/exclude 配置并据此批量设置各 domain 的启用状态IsDomainEnabled在事件写入前做过滤判断。这正是--mstx-domain-include/--mstx-domain-exclude能够精确裁剪输出数据的底层实现。6.3 数据处理器与环形缓冲mstx_data_handler.h 中的MstxDataHandler是 mstx 事件的实际消费者数据类型枚举MstxDataType区分DATA_MARK标记、DATA_RANGE_START区间起点、DATA_RANGE_END区间终点内部使用容量为 512 的环形缓冲RingBufferMsprofTxInfoRING_BUFFER_DEFAULT_CAPACITY 512暂存事件由独立线程消费并上报Flush/ReportDataSaveMstxData在写入前携带domainNameHash与MstxDomainMgr::IsDomainEnabled配合完成 domain 过滤Start接口接收mstxDomainInclude/mstxDomainExclude两个字符串参数正是从 msprof 命令行参数传递而来。由此可以梳理出完整的调用链用户程序 mstx 打点注入→ msprof 采集进程 MstxDataHandler → 环形缓冲暂存 → domain 过滤 → 上报写入性能数据文件 → PROF_XXX 目录。理解这条链路有助于在实际使用中判断数据为什么没采到如未开--msproftxon、domain 被过滤、程序异常退出导致缓冲未落盘等。七、常见问题与使用注意事项采集不到 mstx 数据请确认命令中已配置--msproftxon且采集命令携带了用户程序app。未开启开关时msprof 不会采集任何 mstx/msproftx 事件。domain 数据缺失若配置了--mstx-domain-include但填写的 domain 名与mstxDomainCreateA的 name 不一致或该 domain 在程序中未创建则采集结果中不会有该 domain 的数据default关键字用于指代默认 domain。include/exclude 冲突二者不可同时配置msprof 会直接报错拒绝执行。host/device 耗时差异mstxRangeStartA第二个入参传nullptr时只记录 host 侧耗时要评估下发计算/通信任务在 device 侧的耗时必须传入有效的 stream。Range 必须成对闭合mstxRangeStartA与mstxRangeEnd、mstxDomainRangeStartA与mstxDomainRangeEnd必须配对调用未闭合的 Range 会导致耗时统计不完整。八、参考资料mstx API使用示例本文主题文档采集msproftx数据附录Profiling options参数解释PROFILING_OPTIONS 环境变量说明mstx 相关源码mstx_def.h、mstx_inject.h、mstx_domain_mgr.h、mstx_data_handler.h、input_parser.cpp【免费下载链接】oam-tools本项目为开发者提供故障定位工具包含故障信息收集软硬件信息展示AI core error报错分析等能力提升故障问题定位效率文档可在昇腾社区搜索“故障处理简介”选择社区版。项目地址: https://gitcode.com/cann/oam-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/18 20:13:00

EGM96模型校正DEM高程基准:从原理到实操的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/18 21:13:03

球面邻域匹配度:量化打车难的时空诊断模型

简介:本资源是一份面向数学建模初学者与竞赛参与者的实战型分析报告,聚焦“互联网”背景下城市出租车资源配置优化这一典型交通管理问题,旨在通过数据建模解决“打车难”这一现实痛点。报告基于2015年成都真实时空数据,构建了以“…

2026/9/18 21:13:03

变压器绕组变形试验详解:从FRA曲线到Python量化诊断

简介:变压器绕组变形试验培训PPT课件是一份面向变电检修、运维及电气试验人员的专业培训资源,针对110kV及以上电力变压器绕组变形检测方法进行了系统梳理。包内共1个PPT,单份课件体积仅707KB,方便直接下载使用。课件共37页&#x…

2026/9/18 21:13:03

RAG系统工程实战:从检索增强到可信可溯的生产级落地

1. 这不是“加个检索”那么简单:RAG早已脱离玩具阶段,进入系统工程深水区你搜“RAG实战”,刷出来的90%内容还在教你怎么用LangChain加载PDF、调个OpenAI API、跑通一个能回答“公司年报里提到多少次‘数字化转型’”的demo。这就像十年前教人…

2026/9/18 21:13:03

中国地面气候日值数据集V3.0处理指南:缺测值与格式陷阱详解

干过中国地面气候日值数据集(V3.0)的人,多少都经历过这种崩溃瞬间:明明从数据网下载了标准化产品,跑出来的气温曲线却直接飙到三千多摄氏度,降水序列里无缘无故出现一条四位数毫米的“极端暴雨”。我最早处理这批数据的时候&#…

2026/9/18 21:08:03

企业数智库建设:四层数据链路、KPI规则与知识图谱落地

简介:面向企业高层管理者、技术负责人与数字化项目骨干的《企业数智库建设指南》PDF文档,聚焦知识驱动的智能交互如何提升运营效率与决策科学性。内容从数智库内核与实现路径切入,梳理信息化提供客观数据、数字化构建实时业务模型、智能化借助…

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码