实践分析丨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}环境变量。
- 配置环境变量。
- 当开发环境与运行环境的操作系统架构相同时,配置示例如下所示:
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
实践分析丨AscendCL应用编译&运行案例的更多相关文章
- Linux 性能分析调优 (四)——案例篇:系统中出现大量不可中断进程和僵尸进程怎么办
之前讲到 CPU 使用率的类型.除了上一节提到的用户 CPU 之外,它还包括系统 CPU(比如上下文切换).等待 I/O 的 CPU(比如等待磁盘的响应)以及中断 CPU(包括软中断和硬中断)等. 在 ...
- Flink 源码解析 —— 源码编译运行
更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...
- MySQL数据库企业级应用实践(多实例源码编译)
MySQL数据库企业级应用实践(多实例源码编译) 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机 ...
- 如何使用Xcode分析调试在真机运行的UE4 IOS版游戏
写本文的是因为UE4 官方文档虽然也有,但主要讲的是是用UE4Editor把游戏打成一个IPA包的形式发布的方法 而对于想通过Xcode分析UE4的渲染流程来学习或优化的朋友,那官方文档的资料还是不够 ...
- Java之路——环境配置与编译运行
本文大纲 一.开篇 二.JDK下载 三.JDK安装 四.环境配置 五.初识Java编译 六.Java与Javac 七.第一个Java程序 八.总结 九.参考资料 一.开篇 通过对之前Java之路的了解 ...
- 【原创 Hadoop&Spark 动手实践 6】Spark 编程实例与案例演示
[原创 Hadoop&Spark 动手实践 6]Spark 编程实例与案例演示 Spark 编程实例和简易电影分析系统的编写 目标: 1. 掌握理论:了解Spark编程的理论基础 2. 搭建 ...
- VsCode源码编译运行
参考链接官方文档:https://github.com/Microsoft/vscode/wiki/How-to-Contribute 一.准备环境 Git Node.js(64位,>= 8.1 ...
- brpc编译运行
自百度开源brpc后就一直在关注,看了下brpc都源码,感觉大牛写的果然不一样,由于之前我做c++游戏服务器开发,所以主要看了下网络底层代码,收益颇多,果然一天不学习就要落伍. 现在主要和大家说下我编 ...
- 《Flink 源码解析》—— 源码编译运行
更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...
- 编译运行第一个Java程序——通过示例学习Java编程3
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=13 在本教程中,我们将了解如何编写.编译和运行Ja ...
随机推荐
- itext 生成pdf ----hello world
iText是Java中用于创建和操作PDF文件的开源库.它是由Bruno Lowagie.Paulo Soares等人编写的.Ohloh报告称2001年以来[2],26个不同的贡献者进行了1万多次 ...
- Python 函数传递任意数量的实参
函数传递任意数量的实参 *形参名,形参名中的星号让python创建了一个空元组,并将收到的所有值都封装到这个元组中 # 案例 *toppings 形参名中的星号让python创建了一个空元组,并将收到 ...
- #Python基础 pandas索引设置
一:XMIND 二:设置索引 示例数据,假设我们有一个DataFrame对象,如下: import pandas as pd df = pd.DataFrame({ "name": ...
- 2020-11-20:java中,听说过CMS的并发预处理和并发可中断预处理吗?
福哥答案2020-11-20:[答案来自此链接:](http://bbs.xiangxueketang.cn/question/391)1.首先,CMS是一个关注停顿时间,以回收停顿时间最短为目标的垃 ...
- 2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7。施展魔法之后,A和B通过该边到达彼此的代价都是7。 求,允许施展一次魔法
2022-07-31:给出一个有n个点,m条有向边的图, 你可以施展魔法,把有向边,变成无向边, 比如A到B的有向边,权重为7.施展魔法之后,A和B通过该边到达彼此的代价都是7. 求,允许施展一次魔法 ...
- 2021-07-01:最长连续序列。一个未排序的arr,找出数字连续的最长序列的长度。输入:[100,4,1,20,3,2,50],输出:4。解释:最长数字连续序列是[1,2,3,4],所以长度是4。
2021-07-01:最长连续序列.一个未排序的arr,找出数字连续的最长序列的长度.输入:[100,4,1,20,3,2,50],输出:4.解释:最长数字连续序列是[1,2,3,4],所以长度是4. ...
- ESLint: More than 1 blank line not allowed. (no-multiple-empty-lines)
ESLint: More than 1 blank line not allowed. (no-multiple-empty-lines)
- 又一个开源便斩获 7k star 的新模型「GitHub 热点速览」
Star 并不能代表什么,但是绝对能表示一个项目的受欢迎程度.就像刚开源一周就有 7k+ star 的新模型,输入文本 / 图像就能获得 3D 对象.除了这个新模型,本周还有一款新的 Web 3D 渲 ...
- .NET周报 【5月第2期 2023-05-14】
国内文章 XUnit数据共享与并行测试 https://www.cnblogs.com/podolski/p/17388602.html 在单元或者集成测试的过程中,需要测试的用例非常多,如果测试是一 ...
- Express实战个人订阅号实现网站登录
今天我们来实现一个使用个人订阅号实现网站的功能,后端使用的是 express .其它框架原理基本一致,只是定义路由或返回响应数据部分代码跟 express 有所出入.先来一波效果图: 1. 前言 20 ...