CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载CANN Runtime在应用启动阶段通过aclInit与aclrtSetDevice两个接口完成运行时环境初始化、设备资源配置、日志系统启动与资源管理初始化是后续一切内存申请、任务调度、算子执行的前提。本文以仓库文档 docs/zh/dev_guide/01_initialization.md 为主线结合 初始化与去初始化接口参考、0_device_normal 示例 与 aclInit 底层实现 源码系统讲解初始化流程、默认 Device 配置、JSON 维测配置能力、引用计数语义与去初始化最佳实践帮助读者写出健壮、可复用的 CANN Runtime 初始化代码。初始化流程总览使用 acl 接口开发应用时必须先调用aclInit接口否则可能导致后续系统内部资源初始化出错进而引发其它业务异常。典型的初始化阶段包含以下步骤初始化环境设置 CANN Runtime 运行时所需的环境参数确保所有运行时资源和配置项都被正确加载。设备资源配置初始化与硬件相关的资源如 Ascend 处理器、加速卡等并为其分配资源使后续计算任务可以在适当的设备上执行。设置日志提供日志记录的初始化确保系统的运行状态可以被实时检查与调试。资源管理初始化为后续的内存管理、任务调度、内存分配等功能提供资源准备。从源码结构看这些功能在 acl.cpp 的aclInitImpl中被串行执行初始化完成后aclInitRefCount被置为 1 且aclFinalizeFlag被复位进程进入可用状态。最小初始化示例以下代码展示初始化及指定计算设备的最小流程来源于 docs/zh/dev_guide/01_initialization.md不可直接拷贝编译运行仅供参考// 初始化 int32_t deviceId 0; aclInit(nullptr); // json配置路径为nullptr, 默认初始化 aclrtSetDevice(deviceId); // SetDevice后才可以调用其他aclrt运行时接口。 ...... // 去初始化 aclrtResetDeviceForce(deviceId); aclFinalize();关键点说明aclInit(nullptr)配置文件路径传nullptr表示使用默认配置初始化。也可以传入空 json 串即配置文件中只有{}。aclrtSetDevice(deviceId)指定用于运算的 Device。SetDevice 之后才可以调用其他 aclrt 运行时接口。aclrtResetDeviceForce(deviceId)强制复位当前运算的 Device回收 Device 上的资源。aclFinalize()释放进程内 acl 接口使用的相关资源。完整可运行样例仓库中 0_device_normal 示例 提供了完整、可运行的初始化 设备管理 向量加法算子执行流程其初始化函数如下int Init(int32_t deviceId, aclrtStream* stream) { CHECK_ERROR(aclInit(nullptr)); CHECK_ERROR(aclrtSetDevice(deviceId)); CHECK_ERROR(aclrtCreateStream(stream)); return 0; }主函数在业务执行完毕后按销毁资源 → 去初始化的顺序收尾CHECK_ERROR(aclrtDestroyStream(stream)); CHECK_ERROR(aclrtResetDeviceForce(deviceId)); CHECK_ERROR(aclFinalize());该样例还演示了后续依赖初始化结果的完整调用链aclrtMalloc申请 Device 内存 →aclrtMemcpy搬运数据 →aclnnAddGetWorkspaceSize/aclnnAdd执行算子 →aclrtSynchronizeStream同步等待 →aclrtSynchronizeDevice阻塞等待 Device 完成运算。编译与运行根据 0_device_normal/README.md编译运行步骤如下# 1. 切换到样例目录 cd ${git_clone_path}/example/1_basic_features/device/0_device_normal # 2. 设置环境变量 # ${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 # 3. 运行样例内部会执行 cmake 构建并运行 main bash run.sh样例构建依赖ASCEND_HOME_PATH环境变量与${ASCEND_CANN_PACKAGE_PATH}下安装的libacl_rt.so、libnnopbase.so、libopapi.so见 run.sh 与 CMakeLists.txt。运行成功后输出如下[INFO] Start to run device_normal sample. [INFO] result[0] is: 1.200000 [INFO] result[1] is: 2.200000 [INFO] result[2] is: 3.200000 [INFO] result[3] is: 5.400000 [INFO] result[4] is: 6.400000 [INFO] result[5] is: 7.400000 [INFO] result[6] is: 9.600000 [INFO] result[7] is: 10.600000 [INFO] Run the device_normal sample successfully.aclInit 接口深入函数原型与参数aclError aclInit(const char *configPath)参数名输入/输出说明configPath输入配置文件所在路径包含文件名的指针。配置文件内容为 json 格式json 文件内{的层级最多为 10[的层级最多为 10。初始化时可通过该配置文件配置开启 Dump、配置 Profiling 采集信息等功能。如果默认配置已满足需求无需修改可向 aclInit 接口传入 NULL或者将配置文件配置为空 json 串即只有{}。返回 0 表示成功返回其他值表示失败错误码参见 aclError。重复初始化的引用计数语义一个进程内支持多次调用aclInit接口初始化但需配合aclFinalize或aclFinalizeReference去初始化每次调用 aclInit 时配置必须保持一致否则仅首次调用的配置有效后续调用可能导致报错或配置无效。从源码看aclInitImpl会计算配置文件内容的哈希值hash_utils::CalculateSimpleHash若与首次调用不一致则返回ACL_ERROR_INVALID_PARAM见 acl.cpp。为兼容旧版本重复调用 aclInit 会返回ACL_ERROR_REPEAT_INITIALIZE错误码业务侧可以忽略该错误继续处理。aclInit aclFinalize 配对支持重复初始化/去初始化时序上仅支持顺序调用aclInit→业务→aclFinalize→aclInit→业务→aclFinalize。若调用多次 aclInit 后再去初始化仅需调用一次 aclFinalize将引用计数直接清零。aclInit aclFinalizeReference 配对需成对调用。aclInit 每次调用引用计数加一aclFinalizeReference 每次调用引用计数减一减到 0 时才真正去初始化。该组合支持顺序调用也支持并发调用。aclFinalize 与 aclFinalizeReference 的区别接口行为参数aclFinalize()去初始化将引用计数直接清零立即执行去初始化流程无aclFinalizeReference(uint64_t *refCount)引用计数减一减到 0 才真正去初始化通过 refCount 输出剩余引用计数不需要时可传nullptrrefCount输入输出接口详细说明见 初始化与去初始化接口参考。默认 Device 配置若不显式调用aclrtSetDevice接口可在aclInit接口的 json 文件中指定默认 Device{ defaultDevice:{ default_device:0 } }配置说明default_device处设置 Device ID可设置为 0 或十进制正整数。调用aclrtGetDeviceCount获取可用 Device 数量后Device ID 取值范围为[0, 可用Device数量-1]。若同时通过aclrtSetDevice接口指定 DeviceaclrtSetDevice 接口优先级更高。开启默认 Device 功能后若需要显式创建 Context仍需调用aclrtSetDevice否则可能导致业务异常。启用默认 Device 功能后可以不显式调用aclrtSetDevice直接调用运行时接口接口内部会按 json 配置文件指定的 device 进行隐式 aclrtSetDevice// 初始化 int32_t deviceId 0; aclInit(nullptr); // 启用DefaultDevice后可以不显式调用aclrtSetDevice直接调用运行时接口 // 接口中会按json配置文件指定的device进行隐式aclrtSetDevice aclrtMalloc(devPtr, size, 0); ...... // 去初始化 aclrtResetDeviceForce(deviceId); aclFinalize();源码级实现依据在 acl.cpp 中HandleDefaultDeviceAndStackSize完成默认 Device 的解析与下发aclError HandleDefaultDeviceAndStackSize(const char_t* const configPath) { // 调用批量设置函数 ACL_REQUIRES_OK(SetAllStackSizes(configPath)); // 设置默认设备 int32_t defaultDeviceId INVALID_DEFAULT_DEVICE; const auto ret acl::JsonParser::GetDefaultDeviceIdFromFile(configPath, defaultDeviceId); ... ACL_REQUIRES_RTS_OK(rtSetDefaultDeviceId(defaultDeviceId)); isEnableDefaultDevice true; ACL_LOG_INFO(set default device %d success\n, defaultDeviceId); return ACL_SUCCESS; }可见默认 Device 功能最终通过底层rtSetDefaultDeviceId生效同时置位isEnableDefaultDevice标志供后续 aclrt 接口在未显式 SetDevice 时执行隐式设备切换。该配置在 tests/ut/acl/json/testDefaultDevice/testDefaultDevice_02.json 中有对应的单测配置文件验证。aclInit JSON 配置能力全景除默认 Device 外还可以通过aclInit接口的 json 文件配置多种维测功能无需修改代码二进制。以下配置项完整继承自 初始化与去初始化接口参考。模型 Dump 与单算子 Dump 配置用于导出模型中每一层算子模型 Dump或单个算子单算子 Dump的输入/输出数据与指定模型或算子比对以定位精度问题。默认不启用。通过dump_path配置保存路径。模型 Dump 配置示例{ dump:{ dump_list:[ { model_name:ResNet-101 }, { model_name:ResNet-50, layer:[ conv1conv1_relu, res2a_branch2ares2a_branch2a_relu, res2a_branch1, pool1 ] } ], dump_path:/home/output, dump_mode:output, dump_op_switch:off, dump_data:tensor } }单算子调用场景下的 Dump 配置示例{ dump:{ dump_path:/home/output, dump_list:[{}], dump_op_switch:on, dump_data:tensor } }异常算子 Dump 配置用于导出异常算子的输入输出数据、workspace 信息、Tiling 信息等用于分析 AI Core Error 问题。默认不启用。通过dump_scene参数开启{ dump:{ dump_path:output, dump_scene:aic_err_brief_dump } }dump_scene取值说明取值含义aic_err_brief_dump轻量化 exception dump导出 AI Core 错误算子的输入输出、workspace 数据aic_err_norm_dump普通 exception dump在轻量化基础上额外导出 Shape、Data Type、Format 以及属性信息aic_err_detail_dump在轻量化基础上额外导出 AI Core 的内部存储、寄存器以及调用栈信息仅部分型号支持且需配套 25.0.RC1 或更高版本驱动lite_exception兼容旧版本效果等同于aic_err_brief_dump注意事项导出 dump 文件过程中可能影响 Device 上其它业务进程dump_path可选存储路径优先级为NPU_COLLECT_PATH环境变量 ASCEND_WORK_PATH环境变量 配置文件中的dump_path 应用程序当前执行目录。异常算子 Dump不能与模型 Dump 或单算子 Dump 同时开启。溢出算子 Dump 配置用于导出模型中溢出算子的输入和输出数据分析溢出原因、定位精度问题。默认不启用。dump_debug设置为on开启{ dump:{ dump_path:output, dump_debug:on } }约束不配置或配置为off表示不开启开启时dump_path必须配置支持绝对路径以/开头如/home或相对路径直接以目录名开始如output不能与模型/单算子 Dump 同时开启仅支持采集 AI Core 算子的溢出数据。算子 Dump Watch 模式配置用于观察指定算子输出数据。定位精度问题时若怀疑算子被其它算子踩踏内存可开启 Dump Watch 模式。dump_scene设置为watcher{ dump:{ dump_list:[ { layer:[A, B], watcher_nodes:[C, D] } ], dump_path:/home/, dump_mode:output, dump_level:op, dump_scene:watcher } }配置效果执行完 A、B 算子时会 Dump 出 C、D 算子的输出执行完 C、D 算子时也会 Dump 出 C、D 算子的输出将两次 Dump 文件对比即可排查 A、B 是否踩踏 C、D 的输出内存。约束包括layer配置可能踩踏其它算子内存的算子watcher_nodes配置可能被踩踏的算子两者都必须是静态图/静态子图中的算子dump_mode当前仅支持outputdump_level支持op算子级别/kernelkernel 级别/all默认两者都 Dump。算子 Kernel 调测信息 Dump 配置用于导出 Ascend C 算子 Kernel 的调测信息便于定位算子问题。默认不启用仅部分型号支持。通过dump_kernel_data开启{ dump:{ dump_kernel_data:printf,assert, dump_path:/home/ } }dump_kernel_data支持以英文逗号分隔多个类型all导出以下所有类型、printfAscendC::printf 输出、tensorAscendC::DumpTensor 输出、assertassert/ascendc_assert 输出、timestampAscendC::PrintTimeStamp 输出。未配置该字段但启用了模型/单算子 Dump 时默认按all导出。开启时dump_path必须配置路径优先级为ASCEND_DUMP_PATHASCEND_WORK_PATH 配置文件中的dump_path。Profiling 采集信息配置可通过配置文件开启 Profiling 采集详细配置示例与约束参见《性能调优工具用户指南》。默认不启用。建议不要同时配置 Dump 信息和 Profiling 采集信息否则 Dump 操作会影响系统性能导致采集的性能数据指标不准确。算子缓存信息老化配置通过单算子模型方式执行单个算子时aclopUpdateParams执行单算子除外可用max_opqueue_num配置算子类型-单算子模型映射队列的最大长度达到长度上限时先删除长期未使用的映射信息及缓存中的单算子模型再加载新信息以节约内存并平衡调用性能。默认最大长度为 20000{ max_opqueue_num: 10000 }约束静态加载的算子加载单算子编译的 *.om 文件如aclopSetModelDir老化配置无效在线编译的算子如aclopCompile、aclopCompileAndExecuteV2老化配置有效编译后需及时执行算子否则可能因老化需重新编译接口内部分开维护固定 Shape 和动态 Shape 算子的映射队列最大长度都为max_opqueue_num该值应大于当前进程中静态加载算子的单算子模型个数否则在线编译算子的信息无法老化。错误信息上报模式配置用于控制 aclGetRecentErrMsg 接口按进程或线程级别获取错误信息默认按线程级别{ err_msg_mode: 1 }err_msg_mode取值0 为默认值按线程级别1 表示按进程级别。AI Core 栈空间大小配置控制进程中 Kernel 执行时为每个 AI Core 分配的栈空间大小默认为 32KB{ StackSize:{ aicore_stack_size:32768 } }取值要求单位为 Byte必须是 16K 的整数倍否则向上取整最小值 32K小于 32KB 按默认 32KB 处理各产品最大值不同如 Ascend 950PR/950DT 最大 128KBAtlas A3/A2 系列最大 192KBAtlas 200I/500 A2 推理产品最大 7680KB。部分产品要求在编译 AI Core 算子时打开 O0 开关该配置才有效。SIMT 与 SIMD 维测空间配置以下配置仅部分产品如 Ascend 950PR/Ascend 950DT支持SIMT 栈空间simt_stack_size控制每个线程中 SIMT 算子的栈空间默认 1152Bytesimt_divergence_stack_size控制分支栈空间默认 1024Byte取值必须是 128 的整数倍否则自动向上取整。SIMT Printf 维测空间simt_printf_fifo_size控制 SIMT 算子 Printf 打印空间必须是 8 的整数倍默认 2MB最小 1MB最大 64MB。SIMD Printf 维测空间simd_printf_fifo_size_per_core控制每个 Core 上 SIMD 算子 Printf 空间必须是 8 的整数倍默认 32KB最小 1KB最大 64MB。初始化与去初始化回调aclInit/aclFinalize还支持注册回调函数便于在初始化/去初始化时执行自定义逻辑接口功能关键参数aclInitCallbackRegister(type, cbFunc, userData)注册初始化回调。若在 aclInit 之前调用则在初始化时触发若在 aclInit 之后调用则在注册时立即触发回调原型aclError (*aclInitCallbackFunc)(const char* configStr, size_t len, void *userData)configStr 与 aclInit 的 json 内容保持一致aclInitCallbackUnRegister(type, cbFunc)取消注册初始化回调type 见 aclRegisterCallbackTypeaclFinalizeCallbackRegister(type, cbFunc, userData)注册去初始化回调在 aclFinalize 之前调用本接口去初始化时触发回调原型aclError (*aclFinalizeCallbackFunc)(void* userData)aclFinalizeCallbackUnRegister(type, cbFunc)取消注册去初始化回调—从源码看aclInitImpl内部通过InitCallbackManager::GetInstance().NotifyInitCallback(...)依次通知ACL_REG_TYPE_ACL_MODEL、ACL_REG_TYPE_ACL_OP_EXECUTOR、ACL_REG_TYPE_ACL_DVPP、ACL_REG_TYPE_OTHER等类型的初始化回调见 acl.cpp 与 init_callback_manager.cpp。去初始化约束与最佳实践进程退出前必须去初始化应用进程退出前应确保已调用aclFinalize或aclFinalizeReference完成去初始化否则可能导致异常例如进程退出时出现异常报错。避免在析构函数中调用去初始化接口进程退出时可能因单例析构顺序未知而导致进程异常退出。日志回传延时对于涉及 Device 业务日志回传到 Host 的场景aclFinalize默认增加 2000ms 延时实际最大可达 2000ms以确保 ERROR 级别和 EVENT 级别日志完整回传。可通过环境变量ASCEND_LOG_DEVICE_FLUSH_TIMEOUT0取消该默认延时命令示例export ASCEND_LOG_DEVICE_FLUSH_TIMEOUT0。多线程场景推荐主线程调用 aclInit/aclFinalize、子线程做模型推理等业务主线程等待子线程业务处理结束再调用 aclFinalize或各子线程均成对调用 aclInit/aclFinalize否则可能导致业务异常。Dump 场景限制模型推理同步场景下开启 Dump 时建议单线程内对模型执行 Dump 操作异步场景下建议一次异步推理、一次流同步否则可能出现 Dump 数据文件路径中的序号data_index不准确导致 Dump 数据存放目录异常。源码级调用链总结综合仓库源码aclInit的完整执行链路acl.cpp可概括为加锁并递增引用计数重复调用时返回ACL_ERROR_REPEAT_INITIALIZE读取配置文件内容、计算哈希并校验与首次配置一致性初始化错误信息上报模块HandleErrorManagerConfigErrMgrInit与日志模块DlogReportInitialize依次执行 acl_model、DumpAclDump::GetInstance().HandleDumpConfig、acl_op_executor、默认 Device 与栈空间HandleDefaultDeviceAndStackSize、PrintFifo、事件模式等初始化注册 Profiling 回调MsprofRegisterCallbackHandleProfilingConfig获取 SoC 版本初始化 acl_dvpp注册 kernel launch fill 函数记录首次配置哈希与路径将引用计数置 1返回ACL_SUCCESS。去初始化链路则包括DlogReportFinalize、各回调的 Finalize 通知、引用计数清零与资源释放acl.cpp 起。建议读者将 0_device_normal 示例 作为初始化的标准模板并结合 02_initialization_and_deinitialization.md 中的各配置项按需裁剪使用。赞分享CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载相关推荐CANN Runtime aclInit 初始化失败常见原因与排查实战指南CANN Runtime aclInit 初始化失败常见原因与排查实战指南 aclInit 是使用 CANN Runtime本仓库 CANN / runtimCANNAscend人工智能任务调度GLM-5模型架构深度解析MoE混合专家系统与量化技术融合GLM 5模型架构深度解析MoE混合专家系统与量化技术融合 GLM 5模型作为Atomgit Ascend项目的核心成果创新性地融合了混合专家MoE架构大模型人工智能CANN Toolkit 自动安装全流程解析graph-autofusion 环境初始化 Skill 实战指南CANN Toolkit 自动安装全流程解析graph autofusion 环境初始化 Skill 实战指南 导读 本文围绕 graph autofusio人工智能模型优化模型编译CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考