HiSpark AI

- 软件资料
  - AMCT模型压缩工具用户指南
    - 学习向导
    - 概述
    - 准备环境
    - 快速入门
    - AMCT（PyTorch）
    - AMCT（ONNX）
    - AMCT（TensorFlow）(不支持)
    - AMCT（Caffe）(不支持)
    - 命令行参数说明
    - 样例列表
    - FAQ
    - 附录
  - ATC离线模型编译工具用户指南
    - 学习向导
    - ATC简介
    - 准备环境
    - 快速入门
    - 初级功能
    - 高级功能
    - 参数说明
    - 专题
    - 参考
    - FAQ
  - HiSpark Studio AI for VS Code使用指南
    - 前言
    - HiSpark Studio AI简介
    - 数据准备与环境搭建
    - Hi3863操作指南
    - Hi3322操作指南
  - HiSpark.AI API开发指南
    - 前言
    - 简介
    - 接口调用流程介绍
    - HiSpark.AI API参考
    - 样例使用指导
    - FAQ
  - HiSpark.AI 快速入门指南
    - 前言
    - 简介
    - 开发板准备
    - 开发环境准备
    - 样例运行
    - 常见错误
  - HiSpark.AI 转换工具使用指南
    - 前言
    - Converter_lite工具使用环境搭建
    - 快速入门
    - 基础知识
    - 初级功能
    - 参数说明
    - 算子规格参考
    - 专题
  - Nano AI应用开发指导书
    - Nano AI应用界面
    - Nano 芯片支持数据类型和典型模型性能
    - Nano AI资料清单
    - Nano AI应用开发流程
    - FAQ
  - 应用开发指南
    - 简介
    - 准备环境
    - 编程接口与调用流程
    - 初始化与去初始化
    - 运行时资源管理
    - 模型管理
    - 更多特性
    - 应用编译&运行
    - 精度/性能优化
    - acl API参考
    - FAQ案例集
    - 附录
  - 开发环境安装指南
    - 简介
    - 获取软件包
    - 安装前准备
    - 安装
    - 常用操作
    - FAQ
    - 附录
    - Compiler的库文件存在路径
  - 术语和缩略语
    - 术语和缩略语
  - 模型评估脚本使用指南
    - 简介
    - 使用前准备
    - 使用步骤
  - 精度调试工具用户指南
    - 简介
    - 使用前准备
    - GPU vs NPU（TensorFlow离线推理）-IPV350不支持
    - GPU vs NPU（ONNX离线推理）-IPV350不支持
    - NPU vs NPU（离线推理）
    - 比对结果说明
    - 比对结果分析
    - 扩展功能
    - 附录
  - 驱动日志说明文档
    - 简介
    - 日志分类
    - 异常场景
    - 典型案例

### 该页内容

- 简介
- 日志分类
  - 日志版本分类
  - 日志模块分类
- 异常场景
  - 资源初始化失败
  - OS接口调用失败
  - 文件系统相关异常
  - 参数解析异常
  - 推理失败
  - 访问非法地址
- 典型案例
  - 文件系统未初始化导致无法查询模型信息
  - 内存无法访问导致模型推理失败
  - 地址异常错误导致模型推理失败
  - 推理任务未完成导致资源释放失败
  - 未释放资源导致申请rtsq失败

# 简介

部分场景下，仅通过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