简介¶
部分场景下,仅通过ACL错误码无法定位到具体错误原因,此时需要配合驱动错误码来进一步定位
驱动日志格式如下:
[N模块名称]具体错误打印
模块名称参考日志模块分类
acl层错误码参考文档《AscendCLAPI参考》11.1 aclError
日志分类¶
日志版本分类¶
AI协议栈中日志等级分为DEBUG、INFO、WARN、ERROR
AI协议栈分debug版本和release版本,debug版本中包含全量日志,release版本中仅包含WARN和ERROR日志
可以通过uapi_npu_dlog_setlevel接口来设置打印等级,接口原型如下
int32_t uapi_npu_dlog_setlevel(int moduleId, int level, int enableEvent);
moduleId为模块id,NPU的id为0x10
level为打印等级,一共有5个打印等级:0 debug;1 info;2 warning;3 error;4 null
enableEvent为是否触发event,该参数暂时不生效
使用方法如下
// 只打印error日志
uapi_npu_dlog_setlevel(0x10, 3, 0);
// 屏蔽所有日志
uapi_npu_dlog_setlevel(0x10, 4, 0);
日志模块分类¶
驱动内部日志按模块划分为AI协议栈内部逻辑相关日志(关键字NDRV),内部文件系统相关日志(关键字NFS),调用OS接口相关日志(关键字NOS)
异常场景¶
资源初始化失败¶
在驱动初始化、模型加载、创建流、模型执行等过程中,都有资源的申请和释放,驱动内部的资源申请失败时有以下打印
// 申请内存资源失败
[NDRV]***** malloc fail
// 申请其他资源失败,如从模型池中申请模型id失败
[NDRV]***** alloc fail
acl层申请的内存是通过驱动提供的hal层接口申请的,hal层提供了两个接口,分别用于申请协议栈自用内存和软硬件共享内存,申请失败时有以下打印
// 协议栈自用内存
[NDRV]halHostMemAlloc fail, size:**
// 软硬件共享内存
[NDRV]halMemAlloc fail, size:**
通过打印可以区分那个内存池内存不足,释放其他资源来保证内存池有充足的内存
OS接口调用失败¶
驱动在初始化以及申请资源的过程中,会调用一些OS相关的接口,如注册中断、内存池初始化、创建线程,当这些接口执行失败时,会有以下格式的打印
[NOS]***** fail, ret: **
需要根据ret后面的错误码来定位失败原因
文件系统相关异常¶
执行文件相关的操作,如加载模型文件、落盘ioa数据时遇到异常(文件系统未初始化、文件不存在、创建文件失败等),会打印如下格式的日志
[NFS]******
需要根据日志内容确认错误原因,同时确认模型文件路径是否正确,以及落盘的路径是否存在,文件系统空间是否充足
参数解析异常¶
在解析模型、模型推理等过程中,如果有参数解析异常的场景,会打印如下格式的日志
[NDRV]*********
根据日志内容确认错误原因,如果在加载模型过程中遇到异常,有可能是模型文件解析不对;其他情况下需要检查传入的参数是否正确
推理失败¶
同步或异步推理过程中,如果推理失败,会有如下格式的打印
[NDRV]tsdrv_*****_irq_handle, acsqid:0x*
如果推理失败的原因是超时,需要检查配置的超时时间是否过短。如果是其他原因,需要检查内存地址,是否存在NPU无法访问的地址,导致解析数据不对
如果是task error,会有额外的打印信息,格式如下
[NDRV]** err info dump,err map:0x*
可以根据err map进一步定位问题原因
访问非法地址¶
加载模型过程中,如果申请到NPU无法访问的地址,可能会导致NPU推理时报以下错误
[NDRV]tsdrv_bus_err
同时会将各个地址打印出来,需要检查地址是否合法
典型案例¶
文件系统未初始化导致无法查询模型信息¶
在调用查询接口查询模型信息过程中,报以下错误
[NFS]region not init
[NFS]file open fail
[ERROR][model_segment_load.c:24]7:ErrorNo:545000(GE_ERRORNO_STR)[GE][MODULE] [open][file] failed, file 11111.exeom
[ERROR][ge_executor.c:107]7:ErrorNo:545000(GE_ERRORNO_STR)[GE][MODULE] Load file[11111.exeom] failed, ret = [145002]
[model.c:205]7:REPORT_CALL_ERROR query partition size failed, ge ret[145002]
acl层接口返回的错误码是145002,对应错误是模型路径无效,实际上对应模型文件路径正确。从驱动错误日志可以看出,文件系统未初始化导致找不到对应的模型文件,在加载模型之前执行uapi_npu_file_sys_init即可
内存无法访问导致模型推理失败¶
在调用模型推理执行推理任务过程中,报以下错误
[NDRV]tsdrv_sqe_err_irq_handle
[ERROR][model.c:83]8 hal execute failed ret[-1].
[ERROR][ge_executor.c:132]8:ErrorNo:545000(GE_ERRORNO_STR)[GE][MODULE] [model] exec failed, model_id:1.
[ERROR][model.c:127]8:REPORT_CALL_ERROR sync execute model failed, ret[507899], modelId[1]
acl层接口返回的错误码是507899,对应错误是驱动内部错误,需要驱动日志来分析。驱动日志显示tsdrv_sqe_err_irq_handle,该异常信息说明解析模型文件中的参数不对,但模型本地调试没有问题,排除模型文件导致的错误。进一步分析内存申请,发现加载模型时,分配的一块地址,NPU从中读取数据时只能读到零,无法读到正常数据,导致解析失败
申请内存时,需注意对应的地址NPU是否可访问,避免读取的数据异常导致推理失败
地址异常错误导致模型推理失败¶
在调用模型推理执行推理任务过程中,报以下错误
[NDRV]tsdrv_task_err_irq_handle
******
[NDRV]ks pc:0xe8130d40,param:0xe812d030,workspace:0xe8117100,ioa:0xe8138300,weight:0xe8e90000,tiling:0xe812cf20,ctrl:0x0
[NDRV]mte err info dump, err map:0x20, pc:0xe8130eb0
******
[ERROR][model.c:83]8 hal execute failed ret[-1].
[ERROR][ge_executor.c:132]8:ErrorNo:545000(GE_ERRORNO_STR)[GE][MODULE] [model] exec failed, model_id:1.
[ERROR][model.c:127]8:REPORT_CALL_ERROR sync execute model failed, ret[507899], modelId[1]
acl层接口返回的错误码是507899,对应错误是驱动内部错误,需要驱动日志来分析。从驱动错误日志可以看出,推理任务失败,其中weight的地址是0xe8e90000,该地址为非法地址,导致了推理失败
在申请内存时使用aclrtMalloc接口来申请NPU可以访问的地址,可以避免推理过程中的异常
推理任务未完成导致资源释放失败¶
在调用去初始化接口过程中,报以下错误
[NDRV]wait rtsq pause fail
[NDRV]tsdrv_free_hw_rtsq failed
原因是在下发异步推理任务之后,推理任务未完成,就去尝试释放对应的资源,会导致释放失败。
在下发异步推理任务之后,需要使用查询接口对任务状态进行查询,确保推理任务完成后再释放资源,否则会因为资源释放失败导致内存泄漏
未释放资源导致申请rtsq失败¶
在调用创建流接口过程中,报以下错误
[NDRV]rtsq_request fail
原因是此前存在未释放的rtsq资源,导致硬件资源使用完后,无法申请到资源。
需要确保在释放资源过程中,有调用aclrtDestroyStream接口释放已经申请的流资源,确保下次推理流程中,可以申请到rtsq