AscendCL运行时资源异常问题案例
AscendCL(Ascend Computing Language)是一套用于在昇腾平台上开发深度神经网络推理应用的C语言API库,该API库中提供运行资源管理、内存管理等基础API。
本期就分享几个关于运行资源管理、内存管理等基础API问题的典型案例,并给出原因分析及解决方法:
1、资源未释放,内存占用持续上升
2、Event数量超过上限导致aclrtRecordEvent接口返回失败
3、手动捕获进程异常信息并清理,导致应用进程异常
4、AI应用进程未退出,导致休眠唤醒失败
01 资源未释放,内存占用持续上升
问题现象描述
应用程序运行时,出现内存泄漏的现象,内存占用持续上升。如下图所示。
原因分析
一般来说,资源的申请与释放需成对出现,若出现内存泄露的现象,那么应用程序中可能存在只申请内存、不释放资源的问题。
处理步骤
排查所有的资源申请和释放的地方,保证申请与释放一一对应。例如aclrtMalloc与aclrtFree,aclrtMallocHost与aclrtFreeHost、aclrtCreateStream与aclrtDestroyStream等。
02 Event数量超过上限导致aclrtRecordEvent接口返回失败
问题现象描述
长应用类日志,调用aclrtRecordEvent接口在Stream中记录一个Event时,日志中的报错如下,红框中是关键日志信息,提示Event ID申请失败:
原因分析
一般是在多Stream之间同步等待的场景下,涉及使用aclrtRecordEvent接口,在该接口中会申请Event资源。
根据上述日志信息,可能存在以下故障原因:Event ID的数量超过上限。
处理步骤
在调用aclrtRecordEvent接口+aclrtStreamWaitEvent接口后,若指定的Event已完成,则需要及时调用aclrtResetEvent接口释放Event资源。
03 手动捕获进程异常信息并清理,导致应用进程异常
问题现象描述
用户捕获异常退出信号,并在信号处理函数中释放已申请资源,下一次执行时会报执行失败。查看应用类日志,日志中的报错信息示例如下:
进程异常时,Host侧内核态驱动会自动检测并发起对应进程Device侧资源释放的流程,不需要用户捕获进程异常的信号并主动完成清理。若用户主动释放,会影响到系统本身的资源释放流程。
处理步骤
修改应用程序,删除主动捕获进程异常的信号的代码逻辑。
04 AI应用进程未退出,导致休眠唤醒失败
问题现象描述
休眠失败。查看应用类日志,系统内部的任务分发模块hwts正处于busy状态,检查发现不满足休眠条件,日志片段示例如下:
根据休眠唤醒的流程,休眠前AI应用进程必须先退出,相关硬件资源处于idle态,才允许休眠。不满足休眠条件,会有相关报错,本案例中因为AI应用进程未退出,在休眠唤醒时检测到hwts处于busy状态,因此休眠失败。
处理步骤
用户需要确保AI应用进程已经运行结束或者优雅退出,推荐使用kill -2 PID退出相关进程,PID需按照替换为实际进程ID。
05 更多介绍
[1]昇腾文档中心:https://www.hiascend.com/zh/document
[2]昇腾社区在线课程:https://www.hiascend.com/zh/edu/courses
[3]昇腾论坛:https://www.hiascend.com/forum
- 点赞
- 收藏
- 关注作者
评论(0)