AscendCL运行时资源异常问题案例

举报
昇腾CANN 发表于 2023/06/30 16:12:33 2023/06/30
【摘要】 AscendCL(Ascend Computing Language)是一套用于在昇腾平台上开发深度神经网络推理应用的C语言API库,该API库中提供运行资源管理、内存管理等基础API。本期就分享几个关于运行资源管理、内存管理等基础API问题的典型案例,并给出原因分析及解决方法。

AscendCL(Ascend Computing Language)是一套用于在昇腾平台上开发深度神经网络推理应用的C语言API库,该API库中提供运行资源管理、内存管理等基础API。

本期就分享几个关于运行资源管理、内存管理等基础API问题的典型案例,并给出原因分析及解决方法:

1、资源未释放,内存占用持续上升

2、Event数量超过上限导致aclrtRecordEvent接口返回失败

3、手动捕获进程异常信息并清理,导致应用进程异常

4、AI应用进程未退出,导致休眠唤醒失败

01 资源未释放,内存占用持续上升

问题现象描述

应用程序运行时,出现内存泄漏的现象,内存占用持续上升。如下图所示。

源图1.JPG

原因分析

一般来说,资源的申请与释放需成对出现,若出现内存泄露的现象,那么应用程序中可能存在只申请内存、不释放资源的问题。

处理步骤

排查所有的资源申请和释放的地方,保证申请与释放一一对应。例如aclrtMalloc与aclrtFree,aclrtMallocHost与aclrtFreeHost、aclrtCreateStream与aclrtDestroyStream等。


02 Event数量超过上限导致aclrtRecordEvent接口返回失败

问题现象描述

长应用类日志,调用aclrtRecordEvent接口在Stream中记录一个Event时,日志中的报错如下,红框中是关键日志信息,提示Event ID申请失败:

[ERROR] DRV(18401,main)2023-05-29-17:53:11.569.787 [devdrv] [drvEventIdAlloc 647] error.
[ERROR] RUNTIME(18401,main)2023-05-29-17:53:11.569.804 18409 EventIdAlloc:drvEventIdAlloc:errorcode = 7
[INFO] RUNTIME(18401,main)2023-05-29-17:53:11.569.819 18409 EventIdAlloc:id = -1

原因分析

一般是在多Stream之间同步等待的场景下,涉及使用aclrtRecordEvent接口,在该接口中会申请Event资源。

根据上述日志信息,可能存在以下故障原因:Event ID的数量超过上限。

处理步骤

在调用aclrtRecordEvent接口+aclrtStreamWaitEvent接口后,若指定的Event已完成,则需要及时调用aclrtResetEvent接口释放Event资源。


03 手动捕获进程异常信息并清理,导致应用进程异常

问题现象描述

用户捕获异常退出信号,并在信号处理函数中释放已申请资源,下一次执行时会报执行失败。查看应用类日志,日志中的报错信息示例如下:

[ERROR] TSCH(-1,null):2023-01-01-02:53:45.850.781 1 (cpuid:0) task_scheduler_engine.c:707 proc_model_stream_unbind: unbind model stream failed, stream is running. stream->model_id=512, model_id=512, task.sq_id=514, task.task_id=3
原因分析

进程异常时,Host侧内核态驱动会自动检测并发起对应进程Device侧资源释放的流程,不需要用户捕获进程异常的信号并主动完成清理。若用户主动释放,会影响到系统本身的资源释放流程。

处理步骤

修改应用程序,删除主动捕获进程异常的信号的代码逻辑。


04 AI应用进程未退出,导致休眠唤醒失败

问题现象描述

休眠失败。查看应用类日志,系统内部的任务分发模块hwts正处于busy状态,检查发现不满足休眠条件,日志片段示例如下:

[ERROR] TSCH(-1,null):2023-01-01-02:53:45.850.781 1 (dieid:0,cpuid:0) device_management_plat.c:563 suspend_ack: suspend pre check fail, hwts is busy
[EVENT] TSCH(-1,null):2023-01-01-02:53:45.850.803 2 (dieid:0,cpuid:0) device_management.c:411 process_low_power_cmd: ts suspend ack ret=1.
原因分析

根据休眠唤醒的流程,休眠前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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。