CANN Runtime 算子信息 Dump 实战:基于 aclopStartDumpArgs 的单算子执行与算子参数落盘
发布时间:2026/9/19 11:36:01 作者:尧图编辑部 阅读量:1,286

CANN Runtime 算子信息 Dump 实战基于 aclopStartDumpArgs 的单算子执行与算子参数落盘【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime导读本文围绕 CANN/runtime 仓库中的0_adump_args示例README_en.md讲解在单算子Single Operator执行场景下如何通过 AscendCL Dump 机制采集算子信息。读者将掌握aclopStartDumpArgs/aclopStopDumpArgs/acldumpGetPath三件套的完整用法理解算子信息文件包含算子类型、算子属性、输入输出 format/数据类型/shape 等如何按 shape 落盘到指定目录并结合仓库源码看清 Dump 开关的底层实现链路。示例定位单算子执行场景下的算子信息采集0_adump_args是example/5_performance/adump/目录下的一个独立示例它的核心能力是在单算子执行场景下管理 Dump 算子信息Dump operator arguments将算子信息文件输出到path参数指定的目录主线程中设置 Device一个 shape 对应一个算子信息文件算子信息文件中包含算子类型、算子属性、算子输入输出的 format/数据类型/shape 等信息。该示例被组织为一段完整可运行的 C 工程目录内包含文件作用main.cpp示例主程序执行 Add 算子并演示 Dump 生命周期管理run.sh一键编译、链接、运行脚本CMakeLists.txt构建配置链接 AscendCL 与 Dump 相关动态库acl.jsonDump 配置文件README.md / README_en.md中英文示例说明产品支持情况根据示例文档该能力支持以下产品产品是否支持Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持编译与运行三步拿到算子信息文件环境安装与运行时详情以 example 目录下的 README_en.md 为准。运行步骤如下# ${install_root} 替换为 CANN 安装根目录默认安装在 /usr/local/Ascend 目录 source ${install_root}/cann/set_env.sh # 自动识别 SOC_VERSION 和 ASCENDC_CMAKE_DIR source ${git_clone_path}/example/set_sample_env.sh # 编译并运行 bash run.shrun.sh的内部逻辑见 run.sh依次完成读取环境变量ASCEND_INSTALL_PATH并加载${ASCEND_INSTALL_PATH}/bin/setenv.bash清理并重建build目录通过cmake -B build -DASCEND_CANN_PACKAGE_PATH${_ASCEND_INSTALL_PATH}配置工程随后cmake --build build -j编译、cmake --install build安装运行./build/main并将终端输出同时写入output_msg.txt用于保存运行日志。在 CMakeLists.txt 中可以看到示例依赖的运行时库这从构建层面印证了 Dump 功能属于独立的维测组件target_link_libraries(main PRIVATE ${ASCEND_CANN_PACKAGE_PATH}/lib64/libascendcl.so ${ASCEND_CANN_PACKAGE_PATH}/lib64/libnnopbase.so ${ASCEND_CANN_PACKAGE_PATH}/lib64/libopapi.so ${ASCEND_CANN_PACKAGE_PATH}/lib64/libascend_dump.so)其中libascendcl.so提供 AscendCL 运行时接口libopapi.so提供算子 APIaclnnAdd等libascend_dump.so提供 Dump 能力——这也是示例同时引入acl/acl.h、acl/acl_dump.h与aclnnop/aclnn_add.h头文件的原因。关键接口全景Dump 生命周期管理示例文档将整个示例中用到的 CANN Runtime API 归纳为五个维度对应关系如下初始化AscendCL 配置与 Dump 开关aclInit初始化 AscendCL 配置aclopStartDumpArgs使能 Dump 算子信息acldumpGetPath查询当前 Dump 输出路径aclopStopDumpArgs去使能 Dump 算子信息aclFinalizeAscendCL 去初始化。Device 管理aclrtSetDevice指定用于运算的 DeviceaclrtSynchronizeDevice阻塞等待正在运算的 Device 完成运算aclrtResetDeviceForce强制复位当前运算的 Device回收 Device 上的资源。Stream 管理aclrtCreateStream创建 StreamaclrtSynchronizeStream阻塞等待 Stream 上任务完成aclrtDestroyStream销毁 Stream。内存管理aclrtMalloc申请 Device 上的内存aclrtFree释放 Device 上的内存。数据传输aclrtMemcpy通过内存复制实现数据传输示例中用于将 Device 侧的算子结果拷回 Host 并打印。本示例新增覆盖的关键接口是acldumpGetPath用于查询当前 Dump 输出路径便于确认 Dump 结果的落盘目录。主程序逐段拆解一个 shape 一份算子信息main.cpp 的执行脉络清晰分为七个阶段1. 初始化与使能 Dump// 示例默认使用 device 0Dump 配置指向 ./acl.json落盘目录为 /tmp int32_t deviceId 0; const char* dumpCfgPath ./acl.json; const char* dumpPath /tmp; INFO_LOG(The dump data path is %s., dumpPath); CHECK_ERROR(adump::InitRuntime(deviceId, stream, dumpCfgPath)); // 使能 Dump 算子信息AICore Args 类型 CHECK_ERROR(aclopStartDumpArgs(ACL_OP_DUMP_OP_AICORE_ARGS, dumpPath)); // 查询并打印当前 Dump 路径 LogDumpPath(DATA_DUMP, dumpPath);adump::InitRuntime定义在 adump_tensor_utils.h 中它封装了通用的runtime::InitRuntimeAndCreateStream实现位于 runtime_init_utils.h负责完成aclInit、aclrtSetDevice、aclrtCreateStream以及加载 Dump 配置等初始化动作。LogDumpPath是本示例新覆盖接口acldumpGetPath的典型用法——用DATA_DUMP类型查询数据 Dump 路径查询成功则打印失败则回退到传入的fallbackPath并告警。2. 构造输入输出张量示例构建了 shape 为{4, 2}、数据类型为ACL_FLOAT的两个输入张量和一个输出张量std::vectorfloat selfHostData {0, 1, 2, 3, 4, 5, 6, 7}; std::vectorfloat otherHostData {1, 1, 1, 2, 2, 2, 3, 3}; std::vectorfloat outHostData {0, 0, 0, 0, 0, 0, 0, 0}; float alphaValue 1.0f;张量通过adump::CreateAclTensor在 Device 上分配内存aclrtMalloc并拷贝 Host 数据aclrtMemcpyH2D再以aclCreateTensor包装为aclTensor标量alpha通过aclCreateScalar创建。这正是算子信息文件里 formatACL_FORMAT_ND、数据类型ACL_FLOAT与 shape 信息的来源。3. 调用算子 API 执行 Adduint64_t workspaceSize 0; aclOpExecutor* executor; CHECK_ERROR(aclnnAddGetWorkspaceSize(self, other, alpha, out, workspaceSize, executor)); void* workspaceAddr nullptr; if (workspaceSize 0lu) { CHECK_ERROR(aclrtMalloc(workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST)); } CHECK_ERROR(aclnnAdd(workspaceAddr, workspaceSize, executor, stream));先查询 workspace 大小并按其分配 Device 内存再在指定 Stream 上异步下发 Add 算子。45. 同步等待并取回结果CHECK_ERROR(aclrtSynchronizeStream(stream)); // 将结果从 Device 内存拷回 Host 并逐个打印 CHECK_ERROR(aclrtMemcpy(resultData.data(), ..., outDeviceAddr, ..., ACL_MEMCPY_DEVICE_TO_HOST));67. 释放资源与关闭 Dumpadump::DestroyTensorResources(self, other, alpha, out); CHECK_ERROR(aclrtFree(selfDeviceAddr)); // 以及 other/out/workspace // 去使能 Dump 算子信息 CHECK_ERROR(aclopStopDumpArgs(ACL_OP_DUMP_OP_AICORE_ARGS)); CHECK_ERROR(aclrtDestroyStream(stream)); CHECK_ERROR(aclrtResetDeviceForce(deviceId)); CHECK_ERROR(aclFinalize());注意示例在aclFinalize之前先调用了aclopStopDumpArgs确保算子信息完整落盘后再做去初始化和 Device 强制复位——这是 Dump 生命周期管理的关键顺序。源码级原理Dump 开关在 Runtime 内如何落地三个 Dump 相关接口的实现在 adump_api_platform.cpp 中与头文件 acl_dump.h 一一对应。dumpType 与 acldumpType 枚举acl_dump.h中定义了 Dump 类型枚举与开启开关的宏#define ACL_OP_DUMP_OP_AICORE_ARGS 0x00000001U typedef enum acldumpType { AIC_ERR_BRIEF_DUMP 1, // lite exception dump AIC_ERR_NORM_DUMP 2, // 常规异常 dump额外记录 shape/数据类型/format/属性 AIC_ERR_DETAIL_DUMP 3, // npu coredump额外记录 AI Core 内部内存、寄存器与调用栈 DATA_DUMP 4, // 模型 dump 或单算子 dump OVERFLOW_DUMP 5 // 溢出算子 dump } acldumpType;示例中以ACL_OP_DUMP_OP_AICORE_ARGS作为aclopStartDumpArgs的 dumpType以DATA_DUMP作为acldumpGetPath的查询类型。aclopStartDumpArgs参数校验 委托 DumpManager从源码可见aclopStartDumpArgs会做两层校验后委托给Adx::DumpManagerpath nullptr时上报 EP0007 空指针错误并返回ACL_ERROR_FAILUREdumpType必须等于ACL_OP_DUMP_OP_AICORE_ARGS否则上报 EP0006 非法参数错误校验通过后调用DumpManager::Instance().StartDumpArgs(dumpPath)失败返回ACL_ERROR_FAILURE成功返回ACL_SUCCESS。aclopStopDumpArgs对称地去使能aclError aclopStopDumpArgs(uint32_t dumpType) { if ((dumpType ACL_OP_DUMP_OP_AICORE_ARGS) ACL_OP_DUMP_OP_AICORE_ARGS) { if (Adx::DumpManager::Instance().StopDumpArgs() ! 0) { return ACL_ERROR_FAILURE; } } return ACL_SUCCESS; }acldumpGetPath按类型分发路径查询const char* acldumpGetPath(acldumpType dumpType) { switch (dumpType) { case acldumpType::AIC_ERR_BRIEF_DUMP: case acldumpType::AIC_ERR_NORM_DUMP: case acldumpType::AIC_ERR_DETAIL_DUMP: return Adx::DumpManager::Instance().GetExtraExceptionDumpPath(); case acldumpType::DATA_DUMP: case acldumpType::OVERFLOW_DUMP: return Adx::DumpManager::Instance().GetDataDumpPath(); default: return nullptr; } }异常类 DumpAIC_ERR 系列查询的是异常补充信息路径数据类 DumpDATA_DUMP / OVERFLOW_DUMP查询的是数据落盘路径未知类型返回nullptr。这与示例文档“查询当前 Dump 输出路径便于确认 Dump 结果的落盘目录”的定位完全一致。从源码结构可以推断StartDumpArgs/StopDumpArgs经由DumpManager注册的模块回调如 adump_api_platform.cpp 中的AdumpRegisterCallback分发到具体落盘模块从而在算子执行期间捕获 AICore Args。Dump 配置文件 acl.json示例根目录下的 acl.json 是 Dump 功能的配置文件{dump: {dump_path: ./, dump_list: [], dump_op_switch: on, dump_data: tensor}}各字段含义如下字段取值说明dump_path./Dump 数据的落盘目录相对示例运行目录dump_list[]需要 Dump 的算子列表空列表表示不按算子名做过滤dump_op_switchonDump 开关总控开启后算子信息采集生效dump_datatensorDump 数据粒度此处为张量级数据该配置由adump::InitRuntime传入的dumpCfgPath参数./acl.json加载。需要说明的是本示例中算子信息的实际落盘目录由aclopStartDumpArgs的path参数/tmp直接指定acl.json负责的是 Dump 功能的使能配置。运行结果解读示例文档给出的标准输出如下[INFO] The dump data path is /tmp. [INFO] acldumpGetPath returned dump path: ... [INFO] result[0] is: 1.000000 [INFO] result[1] is: 2.000000 [INFO] result[2] is: 3.000000 [INFO] result[3] is: 5.000000 [INFO] result[4] is: 6.000000 [INFO] result[5] is: 7.000000 [INFO] result[6] is: 10.000000 [INFO] result[7] is: 11.000000 [INFO] Run the device_normal sample successfully. please make sure dump data has been in path: /tmp逐行解读第一行确认aclopStartDumpArgs指定的落盘路径为/tmp第二行是acldumpGetPath(DATA_DUMP)查询返回的实际路径不同版本返回格式可能带时间戳或 deviceId 子目录示例中以...示意result[0] ~ result[7]是 Add 算子的执行结果即self alpha * other的逐元素和例如011、325、639等与selfHostData、otherHostData吻合最后一行提示运行成功并提醒在/tmp目录下确认算子信息 Dump 文件已经落盘。已知问题示例文档声明该示例暂无已知 issueKnown Issues: None。在使用时建议注意以下前提Dump 算子信息能力与具体的昇腾产品形态相关参见本文“产品支持情况”小节且需要在初始化阶段加载 Dump 配置并严格按aclopStartDumpArgs→ 执行算子 →aclopStopDumpArgs的顺序使用以保证算子信息文件完整落盘。延伸阅读示例通用构建与运行说明example/README_en.md、example/README.md同目录下的其他 Dump 场景示例1_adump_callback、2_model_dump_config、3_save_exception_infoDump 公共工具adump_tensor_utils.h运行时初始化公共工具runtime_init_utils.h接口声明acl_dump.h接口实现adump_api_platform.cpp。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考