linux环境安装qnn_sdk 采坑记录
这里主要是介绍 Qualcomm AI Engine Direct SDK,高通新的AI模型推理框架,又名QNN,本文是记录在Linux上搭建qnn可以运行的软件环境。如果是wsl的话,请确认一定要是为wsl2, wsl1走到最后是不能成功的。
QNX sdk 链接。
https://code.qualcomm.com/nextev-usa-inc/automotive-ai-sdk-for-qualcomm-neural-networks-zip-2-0_qti-tools_oem/tree/r23104.2
一、linux上环境的配置
1.1 基础软件环境说明
注意: 这里测试python3.8故下载qnn==2.20(及ubuntu20)。2.22以上需要python3.10和ubuntu22环境,经过测试ubuntu22环境很重要,后面会有一些底层环境受到Ubuntu版本的限制。
环境采坑记录:
-
在wsl1 使用的是ubuntu22的环境,python3.10 创建虚拟环境但是在使用check-python-dependece的时候,却提示需要python3.8, 所以又创建了python3.8的虚幻环境,但是在高通环境安装qpm的时候出现了, 所以需要升级wsl2.官网上又提到要在wsl2的环境运行。所以转战linux 服务器上配置。
解决:a. 转战服务器 b. 升级wsl1到wsl2 c. 忽视错误继续尝试。
System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
1. 选择了在服务器上运行,python3.8 和ubuntu20.04.3的环境进行运行, 但是运行qnn-net-run 的时候出现了下面的的库找不到。
qnn-net-run: error while loading shared libraries: libunwind.so.1: cannot open shared object file: No such file or directory。
原因分析:注意: 这里测试python3.8故下载qnn==2.20(及以下)。2.22以上需要python3.10和ubuntu22环境,经过测试ubuntu22环境很重要,后面会有一些底层环境受到Ubuntu版本的限制。
使用的qnn 是2.27的版本。
解决:1. 解决libunwind.so.1库的问题,那么可能后续还有其他的问题。2. 使用2.22以下的qnn sdk。
1.2 linux 服务器详细的配置过程
1. 获取qnn的SDK 软件包 官方网址可以下载,看自己需要的是linux还是android的。https://code.qualcomm.com/nextev-usa-inc/automotive-ai-sdk-for-qualcomm-neural-networks-zip-2-0_qti-tools_oem/tree/r23104.2
2. 安装pthon 依赖包
Sudo apt-get update
sudo apt-get install python3.10 python3-distutils libpython3.10 ubuntu 22.0以上使用python3.10
sudo add-apt-repository ppa:deadsnakes/ppa 可以指定安装源也可以不指定,看自己的环境。
sudo apt-get update
sudo apt-get install python3.8
3. 配置sdk的环境变量
export QNN_SDK_ROOT=/home/shengqing.liu/qnn_sdk-2-27
export QNN_SDK_ROOT=/home/lsq/qnn/qnn_sdk_tool/qaisw-2-27
source ${QNN_SDK_ROOT}/bin/envsetup.sh
这样子可以永久保存,打开新的命令终端也可以正常的加载环境变量。
echo 'export QNN_SDK_ROOT="/home/shengqing.liu/qnn_sdk-2-27"' >> ~/.bashrc
echo 'export PATH="${QNN_SDK_ROOT}:${PATH}"' >> ~/.bashrc
source ~/.bashrc
这种表示配置ok
4. 配置python虚拟环境
这个按照官网配置python3.10, 但是运行环境check的时候,提示需要的环境是3.8. 所以安装3.8的Python虚拟镜像。
sudo apt-get install python3.8-venv
sudo python3.8 -m venv qnn_vir
source bin/activate
5. 安装机器学习框架
Pip install tensorflow==2.8.0(Python3.8)
TensorFlow: tf-2.8.0
TFLite: tflite-2.3.0
PyTorch: torch-1.13.1
Torchvision: torchvision-0.14.1
ONNX: onnx-1.12.0
ONNX Runtime: onnxruntime-1.18.0
ONNX Simplifier: onnxsim-0.4.36
5. 在虚拟环境中配置python依赖
python3 -m pip install --upgrade pip ------(可能会提示安装更新失败,所以失败的话可以增加权限
sudo chmod 77 -R qnnvir-3.8
${QNN_SDK_ROOT}/bin/check-python-dependency
6. 安装linux环境中依赖的库
sudo bash ${QNN_SDK_ROOT}/bin/check-linux-dependency.sh
查看是否配置成功
qnn-net-run --verison
出现报错:
qnn-net-run: error while loading shared libraries: libunwind.so.1: cannot open shared object file: No such file or directory。
原因: libunwind.so.1没有被找到。
查看是不是有这个库。 dpkg -l |grep libunwind
显示安装的是libunwind-dev和libunwind8, 但是需要的是libunwind.so.1 。
解决方法:
-
安装libunwind1 但是安装sudo apt install libunwind1 出现失败,找不到包。
A. 更新软件源 , 还是不能下载到。
-
进行libunwind8 ru链接, 不推荐, 但是有用
# 查找已安装的库路径(通常为 /usr/lib/x86_64-linux-gnu/) find /usr/lib* -name "libunwind.so*" # 创建符号链接(假设找到 libunwind.so.8) sudo ln -s /usr/lib/x86_64-linux-gnu/libunwind.so.8 /usr/lib/x86_64-linux-gnu/libunwind.so.1 # 更新动态链接器 sudo ldconfig 再次check环境 ${QNN_SDK_ROOT}/bin/check-python-dependency sudo bash ${QNN_SDK_ROOT}/bin/check-linux-dependency.sh
问题:
x86_64-linux-clang/qnn-net-run: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by x86_64-linux-clang/qnn-net-run)
x86_64-linux-clang/qnn-net-run: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by x86_64-linux-clang/qnn-net-run)
解决:
查看系统的版本是2.3,系统是是ubuntu是20.4的,高版本的qnn(2.22以上) 需要22.04, 所以后面会出现一系列的系统问题。
手动安装glic-2.34
sudo apt-get install build-essential cmake make libtool autoconf git
mkdir -p $HOME/glibc-2.34
cd $HOME/glibc-2.34
wget http://ftp.gnu.org/gnu/libc/glibc-2.34.tar.gz
tar -xvzf glibc-2.34.tar.gz
cd glibc-2.34
mkdir build
cd build
../configure --prefix=$HOME/glibc-2.34-install
make -j$(nproc)
make install
安装在$HOME/glibc-2.34-install 目录。
加入临时的环境变量:
export LD_LIBRARY_PATH=$HOME/glibc-2.34-install/lib:$LD_LIBRARY_PATH
x86_64-linux-clang/qnn-net-run
如果可行,加入配置文件,永久生效。
echo 'export LD_LIBRARY_PATH=$HOME/glibc-2.34-install/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
再次check环境。
${QNN_SDK_ROOT}/bin/check-python-dependency
sudo bash ${QNN_SDK_ROOT}/bin/check-linux-dependency.sh
qnn_2.27 版本太高了,需要glibc-2.33以上,这个是和linux版本绑定的),手动安装没有用安装。
没办法切换qnn低版本,使用qnn_2.12版本,成功了。
7. 配置android sdk的路径和环境变量
官方文档说,如果是wsl的环境,那么android sdk 一定需要在home 目录下解压,放置在这里,也不知道真假,所以只能重新下载一个配置路径。
sudo wget https://dl.google.com/android/repository/android-ndk-r26c-linux.zip
echo 'export ANDROID_NDK_ROOT="/home/android-ndk-r26c"' >> ~/.bashrc
echo 'export PATH="${ANDROID_NDK_ROOT}:${PATH}"' >> ~/.bashrc
source ~/.bashrc
这样子表示设置android ndk OK了。
这里面有check 各个环境的指令。
envcheck -a. 全部成功。
到这里,qnn_sdk就算安装成功了。