写点什么

实践分析丨 AscendCL 应用编译 & 运行案例

  • 2023-07-26
    广东
  • 本文字数:4227 字

    阅读完需:约 14 分钟

实践分析丨AscendCL应用编译&运行案例

本文分享自华为云社区《AscendCL应用编译&运行问题案例》,作者: 昇腾 CANN。


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


本期就分享几个关于编译、运行 AscendCL 应用程序的典型问题案例,并给出原因分析及解决方法。

01 编译应用样例报错,提示找不到头文件

问题现象描述


编译Ascend Sample仓中的样例应用程序源码时,报错提示找不到头文件 acl.h。


报错示例如下:


fatal error: acl/acl.h: No such file or directory
#include "acl/acl.h"
^~~~~~~~~~~
compilation terminated.
CMakeFiles/main.dir/build.make:62: recipe for target 'CMakeFiles/main.dir/main.cpp.o' failed
make[2]: *** [CMakeFiles/main.dir/main.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
复制代码

原因分析


编译应用源码依赖定义 AscendCL 接口的头文件,样例中的编译脚本是根据“{DDK_PATH}环境变量值/runtime/include/acl”目录查找编译依赖的头文件,当前报错提示找不到头文件,则可能是{DDK_PATH}环境变量配置不正确。

处理步骤


1、登录编译源码的环境,使用如下命令查看{DDK_PATH}环境变量的值。


echo $DDK_PATH
复制代码


回显信息示例如下:


/home/HwHiAiUser/Ascend/ascend-toolkit/latest
复制代码


若无回显信息,则环境变量未配置,跳转到第 3 步配置该环境变量。


2、根据第 1 步中获取到的{DDK_PATH}环境变量值,检查“{DDK_PATH}环境变量值/runtime/include/acl”路径以及该路径下的 acl.h 头文件是否存在。


检查路径是否存在时,可直接切换到该目录下看是否成功,命令示例如下:


cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/runtime/include/acl
复制代码


若目录存在,可直接执行以下命令检查 acl.h 是否存在:


ll acl.h
复制代码


若路径或头文件不存在,则需跳转到第 3 步重新配置{DDK_PATH}环境变量


3、配置环境变量。


  • 当开发环境与运行环境的操作系统架构相同时,配置示例如下所示:


export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest
复制代码


  • 当开发环境与运行环境的操作系统架构不同时,配置示例如下所示:


例如,当开发环境为 X86 架构、运行环境为 AArch64 架构时,则涉及交叉编译,需在开发环境上安装 AArch64 架构的软件包,将{DDK_PATH}环境变量的路径指向 AArch64 架构的软件包安装目录(如下所示),便于使用与运行环境架构相同的软件包中的头文件来编译代码。


export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/arm64-linux
复制代码

​​​​​

注意:


  • 您可以登录对应的环境,执行 uname -a 命令查询其操作系统的架构。

  • 如果不清楚“Ascend-cann-toolkit”包的安装路径,也可以使用 find -name "filename"命令,查找 acl.h 文件所在的路径,再配置环境变量。


若找不到 acl.h 文件,则需要重新安装“Ascend-cann-toolkit”包。


当环境上安装多个软件版本时,请根据实际情况选择版本,其中,latest 目录默认指向最后安装的软件版本。


当同一个版本下有多个 acl.h 文件时,是由于兼容旧版本的原因,其中部分文件是软链接,方便用户在旧版本下编译应用源码。

02 编译应用样例报错,提示找不到库文件

问题现象描述


编译Ascend Sample仓中的样例应用程序源码时,报错提示找不到库文件 libascendcl.so(报错中的-lascendcl,-l 表示查找库文件,ascendcl 前后分别加上 lib 和.so 组成库文件的名称 libascendcl.so)。


报错示例如下:


/usr/bin/ld: cannot find -lascendcl
collect2: error: ld returned 1 exit status
CMakeFiles/main.dir/build.make:94: recipe for target '/home/HwHiAiUser/sample/resnet50_firstapp/out/main' failed
make[2]: *** [/home/HwHiAiUser/sample/resnet50_firstapp/out/main] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
复制代码

原因分析


编译应用源码依赖定义 AscendCL 接口的库文件,样例中的编译脚本会根据{NPU_HOST_LIB}环境变量指向的路径查找编译依赖的库文件,当前报错提示找不到库文件,则可能是{NPU_HOST_LIB}环境变量配置不正确。

处理步骤


1、登录编译源码的环境,使用如下命令查看{ NPU_HOST_LIB}环境变量的值。


echo $NPU_HOST_LIB
复制代码


回显信息示例如下:


/home/HwHiAiUser/Ascend/ascend-toolkit/latest/runtime/lib64/stub
复制代码


若无回显信息,则环境变量未配置,跳转到第 3 步配置该环境变量。


2、根据第 1 步中获取到的{NPU_HOST_LIB}环境变量值,检查{NPU_HOST_LIB}环境变量指向的路径以及该路径下的 libascendcl.so 库文件是否存在。


检查路径是否存在时,可直接切换到该目录下看是否成功,命令示例如下:


cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/runtime/lib64/stub
复制代码


若目录存在,可直接执行以下命令检查 libascendcl.so 是否存在:


ll libascendcl.so
复制代码


若路径或头文件不存在,则需跳转到第 3 步重新配置{NPU_HOST_LIB}环境变量。


  1. 配置环境变量。


  • 当开发环境与运行环境的操作系统架构相同时,配置示例如下所示:


export NPU_HOST_LIB=$HOME/Ascend/ascend-toolkit/latest/runtime/lib64/stub
复制代码


  • 当开发环境与运行环境的操作系统架构不同时,配置示例如下所示:


例如,当开发环境为 X86 架构、运行环境为 AArch64 架构时,则涉及交叉编译,需在开发环境上安装 AArch64 架构的软件包,将{DDK_PATH}环境变量的路径指向 AArch64 架构的软件包安装目录(如下所示),便于使用与运行环境架构相同的软件包中的头文件来编译代码。


export NPU_HOST_LIB=$HOME/Ascend/ascend-toolkit/latest/ arm64-linux/runtime/lib64/stub
复制代码

​​​​​

注意:


  • 您可以登录对应的环境,执行 uname -a 命令查询其操作系统的架构。

  • 如果不清楚“Ascend-cann-toolkit”包的安装路径,也可以使用 find -name "filename"命令,查找 libascendcl.so 文件所在的路径,再配置环境变量。


若找不到 libascendcl.so 文件,则需要重新安装“Ascend-cann-toolkit”包。


当环境上安装多个软件版本时,请根据实际情况选择版本,其中,latest 目录默认指向最后安装的软件版本。


当同一个版本下有多个 libascendcl.so 文件时,是由于兼容旧版本的原因,其中部分文件是软链接,方便用户在旧版本下编译应用源码。

03 执行应用程序的权限不足导致 AscendCL 初始化报错

问题现象描述


用户进程报错并退出。


查看应用类日志,提示获取 Device 信息失败,最终导致 AscendCL 初始化失败,日志片段示例如下:


[ERROR] RUNTIME(89696,main):2023-03-07-17:13:27.994.635 [runtime.cc:1065]89696 CheckHaveDevice:[INIT][DEFAULT]Call halGetDeviceInfo failed: drvRet=4, module type=0, info type=1.
[ERROR] ASCENDCL(89696,main):2023-03-07-17:13:27.994.723 [acl.cpp:164]89696 aclInit: [INIT][DEFAULT][Init][Version]init soc version failed, ret = 507008
[ERROR] RUNTIME(89696,main):2023-03-07-17:13:27.994.774 [api_impl.cc:3490]89696 GetDevErrMsg:report error module_type=3, module_name=EE8888
[ERROR] RUNTIME(89696,main):2023-03-07-17:13:27.994.798 [api_impl.cc:3490]89696 GetDevErrMsg:ctx is NULL!
[ERROR] RUNTIME(89696,main):2023-03-07-17:13:27.994.827 [api_impl.cc:3546]89696 GetDevMsg:Failed to GetDeviceErrMsg, retCode=0x7070001.
[ERROR] RUNTIME(89696,main):2023-03-07-17:13:27.994.849 [logger.cc:1348]89696 GetDevMsg:GetDeviceMsg failed, getMsgType=0.
[ERROR] RUNTIME(89696,main):2023-03-07-17:13:27.994.888 [api_c.cc:3595]89696 rtGetDevMsg:ErrCode=107002, desc=[context pointer null], InnerCode=0x7070001
[ERROR] RUNTIME(89696,main):2023-03-07-17:13:27.994.910 [error_message_manage.cc:49]89696 FuncErrorReason:report error module_type=3, module_name=EE8888
[ERROR] RUNTIME(89696,main):2023-03-07-17:13:27.994.932 [error_message_manage.cc:49]89696 FuncErrorReason:rtGetDevMsg execute failed, reason=[context pointer null]
EL0003: The argument is invalid.
Solution: Try again with a valid argument.
TraceBack (most recent call last):
[Init][Version]init soc version failed, ret = 507008[FUNC:ReportInnerError][FILE:log_inner.cpp][LINE:145]
ctx is NULL![FUNC:GetDevErrMsg][FILE:api_impl.cc][LINE:3490]
rtGetDevMsg execute failed, reason=[context pointer null][FUNC:FuncErrorReason][FILE:error_message_manage.cc][LINE:49]


[ERROR] acl init failed
[ERROR] Sample init resource failed
复制代码

原因分析


可能存在以下原因:


  • Device 状态异常,未正常启动。

  • 执行应用程序的用户权限不足,无法查询 Device 信息。

处理步骤


1.先首,确认 Device 是否正常启动。


  • 以 root 用户登录安装 Driver 包的环境,执行以下命令查询其安装路径。


cat /etc/ascend_install.info
复制代码


在该文件中,Driver_Install_Path_Param 表示 Driver 包的安装路径。


  • 进入 Driver 安装路径,使用 upgrade-tool 工具查看下 Device 侧运行文件系统版本,如果能正常查询,则说明 Device 侧已经正常启动。


./upgrade-tool --device_index -1 --system_version
复制代码


正常查询返回信息类似如下:


​​​​​​

2.其次,检查运行应用程序的用户权限是否正确。


要求运行应用程序的用户,需与 Driver 运行用户在一个属组内。在“cat /etc/passwd”文件中,可查看用户属组,Driver 的默认运行用户为 HwHiAiUser。


修改用户属组的命令示例如下:


./upgrad usermod -g 组名 用户名
复制代码


3.如果以上方法解决不了问题,则需要参考如下步骤将获取日志,并在modelzoo仓通过提 Issue 反馈给华为工程师。


登录到运行应用程序的环境,执行如下命令将日志级别设置为 Debug。


export ASCEND_GLOBAL_LOG_LEVEL=0
复制代码


重新运行应用程序。


从日志存放路径下获取应用类日志,存放日志的默认路径为“$HOME/ascend/log”。


使用 msnpureport 工具,获取指定 Device 上的 Debug 日志。


命令示例如下,其中 deviceID 需要设置为指定 Device 的 ID:


msnpureport -g debug -d deviceID
复制代码

04 更多介绍


[1]昇腾文档中心:https://www.hiascend.com/zh/document

[2]昇腾社区在线课程:https://www.hiascend.com/zh/edu/courses

[3]昇腾论坛:https://www.hiascend.com/forum


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 4
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
实践分析丨AscendCL应用编译&运行案例_人工智能_华为云开发者联盟_InfoQ写作社区