MindStudio调试秘籍:分钟级解决算子AICore异常
算子AICore Error时,通常报错信息比较底层,难以对应到用户代码,无法查看进程崩溃时一些内存寄存器等数据,一般比较难定位,msDebug结合Runtime生成的core文件与调试信息,能快速最终到代码调用栈,协助开发者快速定位问题根因。资料链接: https://www.hiascend.com/document/detail/zh/mindstudio/830/ODtools/Opera
作者:昇腾实战派
1 算子AICore Error问题
在算子运行过程中,若出现内存地址越界、除 0 错误等问题,会抛出 aic/aiv exception ,说明算子遇到了AICore Error问题,此时需要精准定位到出错代码行。引发异常的常见根因包括:CUBE 读取 L0C 与 VEC/FIXP 同时写入 L0C 导致地址冲突、L0A/L0B 内存读写冲突、UB 读写越界等。
如下图1所示,C++程序执行算子时提示aclError错误,错误码507035,通过官方错误码查询,该错误类型为Vector core执行异常。
查询链接:
(https://www.hiascend.com/document/detail/zh/canncommercial/850/API/appdevgapi/aclpythondevg_01_0911.html)


| ACL_ERROR_RT_VECTOR_CORE_EXCEPTION = 507035 | vector core执行异常 |
|---|
2 算子AICore Error问题分析与解决思路
MindStudio 算子调试工具 msDebug 用于调试在NPU侧运行的算子程序,类似于调试CPU侧程序所需的GDB。该工具提供在昇腾设备上调试算子的手段,包括读取昇腾设备内存与寄存器、暂停与恢复程序运行状态等。
对于算子AICore Error问题,参考使用GDB定位CPU程序coredump的思路,在算子发生异常挂死时支持生成core文件,用于保存现场内存、寄存器等关键信息。msDebug工具可基于该core文件,解析并展示异常位置对应的代码调用栈,从而快速定位异常代码。
使用 msDebug 分析算子AICore Error问题时,可基于以下思路:
1. 算子发生异常挂死时,Runtime需要记录必要的内存和寄存器信息,比如输入的tensor信息,PC(Program Counter)寄存器值等,然后生成core文件落盘。
2. 由于算子运行在昇腾设备上时,指令都是通过发射异步执行的,所以算子发生AICore Error时,实际上还会往前跑几个指令,此时拿到的PC寄存器值不一定准,这里需要结合AIC_ERROR相关寄存器的值做修正,这一修正逻辑已在 msDebug工具中实现。
3. 为了精准展示出错代码行与调用栈信息,需要依赖 Kernel 可执行文件中的调试信息,因此在编译算子时必须添加 -g 编译选项。
参考链接:https://www.hiascend.com/document/detail/zh/mindstudio/830/ODtools/Operatordevelopmenttools/atlasopdev_16_0149.html?framework=mindspore
3 经典案例: Add算子异常挂死问题
3.1 问题背景
运行基于C++语言的Add算子,执行时出现如下图3所示的异常报错,错误码:507035
3.2 问题分析
查询官方错误码信息,分析该错误为Vector core异常导致,可能存在地址越界、内存踩踏、地址未对齐等问题,可以基于算子调试工具msDebug快速分析挂死根因。
3.2.1 重新运行生成core文件
默认情况下,算子执行完毕不生成core信息文件,可通过设置如下环境变量,使能core文件自动落盘:
export ASCEND_DUMP_SCENE="aic_err_detail_dump"
如下图4所示,算子执行完毕,默认在路径extra-info/data-dump/下生成core文件。
3.2.2 生成包含调试信息的算子二进制文件
算子调试前,需先启用调试-g编译选项重新编译,使算子二进制带上调试信息,不同算子工程编译选项不同,可参考如下图5所示修改编译选项。

3.2.3 使用msDebug展示分析core文件
获取到算子core信息后,通过如下命令进行加载分析:
参考命令:
msdebug --core extra-info/data-dump/0/add_custom.45.0.20260306012545343.core add.fatbin
说明:–core后的add.fatbin为kernel二进制或包含kernel二进制动态库的可执行文件路径

如图7所示,其中add_kernel.cpp是用户的算子代码文件,kernel_operator_data_copy_intf_impl.h文件是CANN里的库文件,分析时,只需关注用户算子实现文件,即add_kernel.cpp相关的代码调用栈来确定coredump的代码行。
bt 命令显示,stop reason=MTE_ERROR,表示使用了MTE搬运类指令引发的core问题,且代码行为79行,frame为#3,基于msDebug提供的frame select功能进行筛选,参考命令如下:
(msdebug)frame select 3

通过图8所示,可以看到79行为DataCopy操作,出现Vector core异常挂死,至此,异常代码行定位结束。
此外,对于多核情况,如需分析不同核的coredump位置,可通过如下命令分析:(msdebug)ascend info summary

如图9所示,当前聚焦核42,并且所有core 的 PC值都是相同的,则相关代码行位置已知,如PC值不同,可使用如下命令切换核查看(以切换核43为例)
(msdebug) ascend aiv 43

其他情况:如果stop reason是Unknown,通常为其他核挂死该核被迫停止,未遇到异常,加载core文件,工具默认展示第一个stop reason非Unknown的核。
4 总结
算子AICore Error时,通常报错信息比较底层,难以对应到用户代码,无法查看进程崩溃时一些内存寄存器等数据,一般比较难定位,msDebug结合Runtime生成的core文件与调试信息,能快速最终到代码调用栈,协助开发者快速定位问题根因。
工具链接如下:
- msDebug:https://gitcode.com/Ascend/msDebug
- 资料链接: https://www.hiascend.com/document/detail/zh/mindstudio/830/ODtools/Operatordevelopmenttools/atlasopdev_16_0149.html
MindStudio是华为面向昇腾AI开发者提供的全流程工具链,致力于提供端到端的昇腾AI应用开发解决方案,使能开发者高效完成训练开发、推理开发和算子开发。更多信息可关注MindStudio公众号
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)