尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CANN Runtime 性能分析实战:mstx 多 Domain 打点与 msprof 按域采集过滤

CANN Runtime 性能分析实战:mstx 多 Domain 打点与 msprof 按域采集过滤 CANN Runtime 性能分析实战mstx 多 Domain 打点与 msprof 按域采集过滤【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtimemstxMindStudio Tools Extension是 CANN 提供的应用自定义打点库它允许开发者在业务代码的关键阶段插入瞬时事件Mark与范围事件Range并通过 msprof 将打点数据映射到性能时间线。本篇文章围绕 CANN Runtime 仓库中的 mstx 多 Domain 打点样例展开完整讲解默认 domain 与自定义 domain 的创建、标记、销毁方式以及 msprof 通过--mstx-domain-include/--mstx-domain-exclude按域控制采集范围的实战方法。读完本文后你将能够在自己的 Ascend 推理/训练程序中实现零侵入的业务阶段打点并按 domain 粒度灵活筛选性能数据。一、样例概览解决什么问题在性能分析中算子耗时只能回答哪段代码慢却难以回答慢发生在哪个业务阶段。mstx 打点正是在这个缺口上发挥作用你可以在数据预处理、模型执行、结果搬运等业务边界处插入自定义标记让 Profiling 工具把这些标记作为时间轴上的锚点呈现出来。CANN Runtime 仓库提供的 3_mstx_with_domain 样例 演示了两个核心能力多 Domain 打点既在系统默认 domaindefault中打点也创建自定义 domain样例中命名为DoAclAdd_Inner并在其中打点按 Domain 过滤采集通过 msprof 的--mstx-domain-include与--mstx-domain-exclude参数只采集指定 domain 的打点数据实现采集范围的精确控制。样例源码为 mstx_with_domain.cpp由 run.sh 完成编译与执行。产品支持情况根据样例 README该样例支持以下产品产品是否支持Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持二、环境准备检查 msTX 依赖mstx 接口由 MindStudio Tools Extension LibrarymsTX组件提供该组件随 CANN Toolkit 一并提供。因此在编译运行样例前需要先确认环境中存在样例所需的 msTX 头文件。1. 切换到样例目录cd ${git_clone_path}/example/5_performance/profiling/3_mstx_with_domain其中${git_clone_path}为 CANN Runtime 仓库的克隆路径。2. 设置 CANN 环境变量# ${install_root} 替换为 CANN 安装根目录默认安装在 /usr/local/Ascend 目录 source ${install_root}/cann/set_env.shset_env.sh会导出ASCEND_HOME_PATH等关键环境变量后续依赖检查、CMake 构建见 CMakeLists.txt 中对$ENV{ASCEND_HOME_PATH}的引用以及 msTX 头文件查找都依赖这些变量。3. 检查 msTX 头文件是否可用ls -l ${ASCEND_HOME_PATH}/include/mstx/ms_tools_ext.h若命令正常显示文件信息说明当前环境已包含样例所需的 msTX 头文件若命令提示文件不存在请依次排查确认ASCEND_HOME_PATH是否指向 CANN Toolkit 的实际安装目录若当前环境未安装 msTX请选择与当前 CANN 软件版本配套的 msTX 版本进行安装若已安装旧版本 msTX请升级到与 CANN 配套的版本。安装或升级完成后需重新执行source ${install_root}/cann/set_env.sh加载 CANN 环境变量并再次执行上述检查命令确认头文件可访问。从源码结构看mstx_with_domain.cpp 中直接通过#include mstx/ms_tools_ext.h引入 mstx 接口该头文件正是上文检查的目标文件这也解释了为何编译前必须先验证该依赖。三、编译与运行样例运行脚本 run.sh 的完整流程如下bash run.sh脚本内部执行的关键动作包括校验环境若ASCEND_HOME_PATH未设置脚本直接报错退出提示先 source CANN 的set_env.sh加载环境source ${ASCEND_HOME_PATH}/bin/setenv.bash并打印[INFO]: AscendHome is set to ...构建调用cmake -B build与cmake --build build -j完成编译运行执行./build/mstx_with_domain并将输出同时写入output_msg.txt。从 CMakeLists.txt 可以看到样例二进制mstx_with_domain链接了以下库链接库作用libascendcl.soCANN 运行时aclrtAPI负责设备/上下文/流管理libnnopbase.soaclnn 算子基础设施提供aclCreateTensor、aclCreateScalar等辅助接口libmsprofiler.soProfiling 能力库mstx 打点数据采集链路libopapi.soaclnn 算子 API提供aclnnAdd等算子执行入口libc_sec.so、dl安全库与动态链接库ACL 的初始化与销毁封装在 common/util_acl.h 中Init()依次执行aclInit、aclrtSetDevice、aclrtCreateContext、aclrtSetCurrentContext、aclrtCreateStreamDeInit()则对称地完成aclrtDestroyStream、aclrtDestroyContext、aclrtResetDevice、aclFinalize。四、源码剖析默认 domain 打点在 mstx_with_domain.cpp 的TestMstxWithDomain()中展示了默认 domaindefault下两类打点方式static int TestMstxWithDomain() { // range with default domain start uint64_t id mstxRangeStartA(TestMstxWithDomain, stream); ACL_CALL(aclrtSetCurrentContext(context)); // mark with default domain end mstxMarkA(DoAclAdd Start, stream); ACL_CALL(DoAclAdd(context, stream)); // range with default domain end mstxRangeEnd(id); return ACL_SUCCESS; }默认 domain 相关的 mstx 接口包括mstxMarkA(message, stream)记录一个瞬时事件Mark。它没有持续时间用于标记此刻发生了什么例如样例中的DoAclAdd Start表示算子加法即将开始mstxRangeStartA(message, stream)开启一个范围事件Range返回一个uint64_t类型的 range idmstxRangeEnd(id)关闭与 id 对应的范围事件。Range 与 Mark 的区别在于Range 有一个明确的起止区间能够覆盖一段代码/一个阶段的完整执行时间适合包裹整个业务阶段Mark 则只是一个时间点适合记录阶段内的关键事件。二者配合即可在时间线上构建出阶段 事件的层级视图。五、源码剖析自定义 domain 管理与打点除了默认 domainmstx 还支持创建任意数量的自定义 domain。自定义 domain 的生命周期管理集中体现在 mstx_with_domain.cpp 与 main 函数 中mstxDomainHandle_t domainRange; std::string g_domainRangeName DoAclAdd_Inner; ... void MstxDomainInit() { domainRange mstxDomainCreateA(g_domainRangeName.c_str()); } void MstxDomainDeInit() { mstxDomainDestroy(domainRange); }程序启动后按MstxDomainInit() → TestMstxWithDomain() → MstxDomainDeInit()的顺序执行即创建 domain → 打点 → 销毁 domain的完整生命周期。1. 创建与销毁 domainmstxDomainCreateA(name)以字符串名称创建一个自定义 domain返回mstxDomainHandle_t类型的句柄。样例中创建了名为DoAclAdd_Inner的 domainmstxDomainDestroy(handle)销毁指定 domain 句柄释放相关资源。2. 在自定义 domain 中打瞬时事件在DoAclAdd()中创建 alpha 标量之前通过mstxDomainMarkA记录了一个瞬时事件// mark with DoAclAdd_Inner domain mstxDomainMarkA(domainRange, Create alpha aclScalar, stream);mstxDomainMarkA(handle, message, stream)的语义与默认 domain 的mstxMarkA一致只是多了一个 domain 句柄参数打点数据会被归属到对应 domain 名下。3. 在自定义 domain 中记录范围事件算子下发与同步之后通过mstxDomainRangeStartA/mstxDomainRangeEnd记录了一段范围事件// range with DoAclAdd_Inner domain start uint64_t id mstxDomainRangeStartA(domainRange, After aclnnAdd, stream); ACL_CALL(aclrtSynchronizeStream(stream)); auto size GetShapeSize(outShape); std::vectorfloat resultData(size, 0); ACL_CALL(aclrtMemcpy( resultData.data(), resultData.size() * sizeof(resultData[0]), outDeviceAddr, size * sizeof(float), ACL_MEMCPY_DEVICE_TO_HOST)); for (int64_t i 0; i size; i) { LOG_PRINT(result[%ld] is: %f\n, i, resultData[i]); } ... // range with DoAclAdd_Inner domain end mstxDomainRangeEnd(domainRange, id);这段范围事件覆盖了流同步 结果回拷 打印的完整后处理过程其语义与默认 domain 的mstxRangeStartA/mstxRangeEnd一一对应仅多了 domain 句柄参数。4. 自定义 domain 接口速查表接口功能关键参数mstxDomainCreateA(name)创建自定义 domainnamedomain 名称字符串返回句柄mstxDomainMarkA(handle, message, stream)在自定义 domain 中记录瞬时事件handledomain 句柄message描述文本mstxDomainRangeStartA(handle, message, stream)在自定义 domain 中开启范围事件返回uint64_trange idmstxDomainRangeEnd(handle, id)关闭自定义 domain 中的范围事件idRangeStartA返回的 idmstxDomainDestroy(handle)销毁自定义 domainhandle待销毁的 domain 句柄与之对照的默认 domain 接口为mstxMarkA、mstxRangeStartA、mstxRangeEnd参数中不包含 domain 句柄。六、msprof 采集与按 Domain 过滤打点只是第一步真正发挥价值的是通过 msprof 把这些标记采集出来。样例 README 给出了三种典型的采集命令# 采集所有打点数据包括默认 domain 和自定义 domain msprof --msproftxon bash run.sh # 只采集 default domain 的打点数据 msprof --msproftxon --mstx-domain-includedefault bash run.sh # 采集 default domain 之外的打点数据 msprof --msproftxon --mstx-domain-excludedefault bash run.sh参数语义--msproftxon打开 mstx/msproftx 打点数据采集开关是采集 mstx 标记数据的前提--mstx-domain-include...白名单过滤只采集指定 domain 的标记数据--mstx-domain-exclude...黑名单过滤采集除指定 domain 之外的所有标记数据。使用约束--mstx-domain-include与--mstx-domain-exclude互斥不可同时配置如需指定多个 domain使用逗号分隔例如--mstx-domain-includedefault,DoAclAdd_Inner。以上过滤逻辑配合样例中默认 domain DoAclAdd_Inner自定义 domain的双域设计可以直接验证白名单/黑名单两种策略的采集差异。七、产物解读打点数据在 Profiling 产物中的呈现采集完成后打点数据会落入 Profiling 产物中。根据 profiling_artifact_analysis.md 中对产物字段的说明字段含义msproftx messageaclprofMark、aclprofPush、aclprofRangeStart或mstx 标记携带的描述用于把应用自定义阶段映射到性能时间线Domainmstx domain 名称用于按 domain 过滤或归类应用自定义打点也就是说你在mstxMarkA/mstxDomainMarkA中传入的 message 字符串会直接出现在产物的msproftx message字段中而打点所属的 domaindefault或DoAclAdd_Inner则记录在Domain字段中——这正是--mstx-domain-include/--mstx-domain-exclude能够按域过滤的数据基础。分析时建议先确认打点消息是否出现在导出结果中再按消息对应的业务阶段分析耗时。八、运行结果验证样例实际执行了一次 aclnn 加法运算out self alpha * other。其中self {0,1,2,3,4,5,6,7}、other {1,1,1,2,2,2,3,3}、alpha 1.2f。运行输出如下[INFO]: AscendHome is set to ... ... result[0] is: 1.200000 result[1] is: 2.200000 result[2] is: 3.200000 result[3] is: 5.400000 result[4] is: 6.400000 result[5] is: 7.400000 result[6] is: 9.600000 result[7] is: 10.600000以result[3] 5.4为例验证self[3] alpha * other[3] 3 1.2 × 2 5.4其余结果同理。这说明在打点之外样例的算子计算逻辑本身也是正确的输出可以作为程序正常运行、打点已执行的判定依据。完整运行流程中[INFO]: AscendHome is set to ...来自 run.sh 的环境打印计算结果则由 mstx_with_domain.cpp 的循环打印产生。九、与 msproftx 打点方案的联系与选择在 CANN Runtime 仓库中还有一套同属性能打点范畴的 msproftx 接口详见 1_msproftx 样例。msproftx 通过aclprofCreateStamp、aclprofMark、aclprofPush/aclprofPop、aclprofRangeStart/aclprofRangeStop提供打点能力且aclprofPush/aclprofPop支持嵌套范围标记更贴近 NVTX 的惯用模式。两套方案的定位差异在于msproftx 属于 acl 运行时 API 体系mstx 属于独立的 MindStudio Tools Extension 组件。mstx 的核心优势正是本样例演示的domain 机制——通过自定义 domain 将不同业务模块的打点数据隔离归类再借助 msprof 的--mstx-domain-include/--mstx-domain-exclude按域精确筛选尤其适合多模块、多阶段并存的大型应用。二者的 API 细节可进一步查阅 25-03_Operation_APIs.md 中关于 Profiling 操作接口的说明。十、小结与实战建议回顾本样例可以提炼出以下可直接复用的实战要点Domain 是 mstx 打点的组织单元使用mstxDomainCreateA按业务模块如预处理、推理、后处理创建 domain用mstxDomainDestroy释放实现打点数据的逻辑隔离瞬时事件用 Mark阶段耗时用 RangemstxDomainMarkA记录时间点mstxDomainRangeStartA/mstxDomainRangeEnd记录时间区间二者配合才能完整刻画业务时序采集时按域过滤--msproftxon是采集前提--mstx-domain-include/--mstx-domain-exclude互斥使用多 domain 用逗号分隔产物中按 message 与 Domain 字段定位打点描述对应msproftx message字段domain 归属对应Domain字段是后续自动化解析性能产物的关键锚点。按上述思路将 mstx 打点嵌入到真实业务的阶段边界处再配合 msprof 按域采集即可在不改动算子计算逻辑的前提下获得清晰的业务级性能时间线快速定位耗时所在的业务阶段。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表