目录

算子精度问题定位挑战

MindStudio算子工具技术解读

经典案例与操作指南

1 环境准备

2 算子案例介绍

3 msSanitizer异常检测

4 msDebug上板调试精度问题定位


算子精度问题定位挑战

在昇腾 NPU 算子开发过程中,精度问题的定位始终是困扰开发者的一大难题,工程师经常面临如下挑战:

  1. 并行计算逻辑精度不一致问题。Ascend C 算子依赖 NPU 的并行计算能力,通过向量计算、多核心协同等方式提升效率,但并行逻辑的设计稍有不慎就可能引发精度问题,排查过程复杂。
  2. 内存问题。如非法读写,内存踩踏、非对齐访问等内存异常现象经常出现,试错成本较高。
  3. 搬运计算流协同问题。搬运和计算本身是在不同的pipe(流)上进行的,如果计算要正确,需要添加同步保证pipe间的顺序,同步加多无法发挥硬件架构优势,加少了又容易出现异常。
  4. 调试黑箱问题。传统断点调试难以穿透 NPU 硬件壁垒,断点工具无法直接访问 NPU 内部的寄存器状态或片上存储数据,单点打印时间成本较高,精度偏差的 “黑箱” 难以打开。

传统调试手段在 NPU 环境中陷入 “多重困境”,亟需专用工具的出现。msDebug、msSanitizer工具是昇腾 AI 生态完善过程中的关键布局,通过为开发者提供适配 NPU 架构的调试利器,降低算子开发的技术门槛。

MindStudio算子工具技术解读

MindStudio 算子开发工具链面向Ascend C编程语言,提供了msSanitizer 异常检测msDebug 算子调试工具,用以诊断和修复代码错误,是算子编程体系中的重要组成部分,可以大幅度提升开发者问题定位效率。

图1. msSanitizer 技术原理图

msSanitizer工具是基于昇腾AI处理器的一个异常检测工具,包含了内存检测、竞争检测和未初始化检测三个子功能,主要特性如下:

  • 内存检测:工具可以在用户开发算子的过程中,协助定位非法读写、多核踩踏、非对齐访问、内存泄漏以及非法释放等内存问题。
  • 竞争检测:工具可以协助用户定位由于竞争风险可能导致的数据竞争问题,包含核内竞争和核间竞争问题。其中,核内竞争包含流水间竞争和流水内竞争。
  • 未初始化检测:工具可以协助用户定位由于内存未初始化可能导致的脏数据读取问题。

图2. msDebug 技术原理图

msDebug工具用于调试在NPU侧运行的算子程序。该工具向算子开发人员提供在昇腾设备上调试算子的手段,包括读取昇腾设备内存与寄存器、暂停与恢复程序运行状态等,主要功能特性如下:

  • 断点设置:在算子的运行程序上(特定行号)设置行断点。
  • 打印变量和内存:打印寄存器、Local Memory、Global Memory中变量和内存信息。
  • 单步调试:使用thread step-over命令使用示例逐行执行以进行单步调试,或执行step in命令可进入函数内部进行调试,或可执行finish命令返回函数调用点的下一行继续调试。
  • 调试信息展示:命令查询算子运行的设备信息。
  • 核切换:支持切换指定核,展示代码中断位置的信息。

经典案例与操作指南

接下来,我们通过一个CrossEntropy算子精度调试案例,带领大家快速学习算子精度定位工具使用,进一步了解工具能力。

1 环境准备

  1. 环境已安装CANN,依据指导完成配置,算子可正常编译执行;
  2. 内核调用符场景,使用msSanitizer编译阶段加入-g --cce-enable-sanitizer,链接阶段需要加入--cce-enable-sanitizer
  3. 使用msDebug,算子编译阶段加入-g -O0

详情参见产品文档:

https://www.hiascend.com/document/detail/zh/canncommercial/82RC1/devaids/optool/atlasopdev_16_0002.html

2 算子案例介绍

CrossEntropy为一个交叉熵损失函数,算子数学模型和CPU实现参考如下:

图3. 示例算子数学模型

算子编写完毕,板上执行时,出现AiCore Error问题,如下图所示:

图4. 示例算子异常plog

对于AiCore Error,常见问题原因如下:

  1. 地址未对齐,即未按照32B对齐;
  2. 地址出现越界行为,即非法读、写;
  3. 核内、核间存在竞争问题;
  4. Ascend C API 使用不当;

3 msSanitizer异常检测

Step1.  算子编译时添加异常检测编译选项

图5. 异常检测编译选项

Step2. 使用msSanitizer 进行内存检测,诊断内存问题,命令行参考:

mssanitizer <算子执行程序>

图6. 检测工具诊断内存异常

由工具检测结果可知,UB存在非对齐问题,非对齐发生在0核、1核,算子代码在第109行,非32字节对齐导致算子运行异常,109行代码如下:

图7. 算子代码行

两处UB地址空间均为算子内部Tbuf划分,使用msDebug打断点和单步调试,进一步定位问题根因。

4 msDebug上板调试精度问题定位

Step1. 算子编译时增加编译选项

图8. 调试编译信息

算子编译后可获取NPU侧可执行文件corss_entropy。

Step2. msDebug拉起算子可执行文件corss_entropy,参考命令:

msdebug ./corss_entropy

Step3.  单步调试算子程序:

1. 断点设置,对cross_entropy.cpp文件的第109行设置断点(此处仅供示范,实际调试时,可按需设置断点位置)参考命令:

b cross_entropy.cpp:109

2. 运行程序,参考命令:

r

3. 程序命中断点停止。此时可进行单步调试,参考命令:

n 

图9. 调试过程信息

通过msDebug 单步调试,可以发现在109行出现了AiCore Error,结合msSanitizer诊断信息,打印109行相关变量,参考命令:

p labelOneHotLocal

图10. 调试过程信息

打印labelOneHotLocal显示,该localTensor地址为164,非32字节对齐;因为Tbuf地址划分时,先划分了4个字节给reduceSumLocal,之后划分了32字节给labelOneHotLocal,划分时未按照32字节对齐导致了非对齐问题;代码修复后,精度正常,内存检测无其他异常信息。

图11. 优化前后代码与诊断结果

msSanitizer 与 msDebug 作为 MindStudio 算子工具链的重要能力,分别从 “异常预防” 和 “问题溯源” 两个维度发力,为昇腾 NPU 算子的精度调试提供了系统化解决方案,是提升算子开发质量与效率的关键利器,目前该工具已正式发布,更多功能请参考官方资料。

工具简介-算子开发工具-CANN商用版8.2.RC1开发文档-昇腾社区

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐