ONNX Runtime QNN 快速参考
前言:MicorSoft/onnxruntime原生只支持CUDA,TensorRT,CPU进行模型部署以及运算,本文阐述的是如何将onnx格式的模型部署在高通硬件平台并使用高通后端,例如:GPU,DSP等资源实现数据运算,跟着小编带大家一起构建ONNXRuntime-QNN
关注公众号“CrazyNET”,回复“ort-qnn-building”获取qnnbase项目,回复“qnn-sdk”获取高通最新QNN SDK
环境设置 (一次性)
# 1. 访问公众号获取项目
# 2. Python安装
add-apt-repository ppa:deadsnakes/ppa
apt update
apt install python3.11 -y
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
update-alternatives --config python3
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3.11 get-pip.py
# 3. 编译环境安装
apt update
apt install gcc g++ make git wget build-essential -y (cmake版本需要3.28及以上)
# 4.编译安装cmake_3.28.0
cd qnnbase/cmake-3.28.0 (由于小编已经构建过所有请删除CMakeCache.txt再重新构建)
echo 'export LD_LIBRARY_PATH=/your/path/to/gcc/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
strings /your/path/to/gcc/lib64/libstdc++.so | grep GLIBCXX_3.4.29
./bootstrap
make -j$(nproc)
make install
# 5. 设置 QNN SDK作者使用的是QNN v2.35.3.250617版本,这个版本包含Genie库是专门针对LLM模型的推理库
mkdir -p /opt/qcom/aistack/
unzip v2.35.3.250617.zip -D /opt/qcom/aistack/
vim /opt/qcom/aistack/qairt/2.35.3.250617/bin/envsetup.sh # 将文件中所有包含x86_64-linux-clang的字段替换为aarch64-oe-linux-gcc11.2
echo "source /opt/qcom/aistack/qairt/2.35.3.250617/bin/envsetup.sh" >> ~/.bashrc
source ~/.bashrc
# 6. 自动脚本构建编译“onnxruntime-qnn”whl库
# 参考“常用构建命令”章节
常用构建命令
# 基础构建
./auto_build.sh
# 指定 Python 版本
./auto_build.sh --python 3.9
# Debug 模式
./auto_build.sh --config Debug
# 清理构建
./auto_build.sh --clean
# 详细输出
./auto_build.sh --verbose
# 自定义并行数
./auto_build.sh --parallel 16
# 运行测试
./auto_build.sh --run-tests
Wheel 包位置
# 默认位置
onnxruntime/build/Linux/Release/dist/onnxruntime_qnn-*.whl
# 查找 wheel 文件
find onnxruntime/build -name "*.whl"
安装和使用
# 安装
pip install onnxruntime/build/Linux/Release/dist/onnxruntime_qnn-*.whl
# 验证
python -c "import onnxruntime; print(onnxruntime.get_available_providers())"
Python 示例代码
import onnxruntime as ort
import numpy as np
# QNN 配置
providers = ['QNNExecutionProvider']
provider_options = [{
'backend_path': f'{os.environ["QNN_SDK_ROOT"]}/lib/x86_64-linux-clang/libQnnCpu.so',
}]
# 创建会话
session = ort.InferenceSession('model.onnx', providers=providers, provider_options=provider_options)
# 推理
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
output = session.run(None, {session.get_inputs()[0].name: input_data})
日志和调试
# 查看构建日志
ls -lt logs/
tail -f logs/build_*.log
# 查看最新日志
tail -f logs/$(ls -t logs/ | head -1)
常见错误快速修复
错误 | 解决方案 |
---|---|
QNN_SDK_ROOT not set | export QNN_SDK_ROOT=/path/to/qnn-sdk |
CMake version too old | 安装新版 CMake (>= 3.26) |
Python.h not found | sudo apt-get install python3-dev |
Permission denied | 使用 sudo 或检查文件权限 |
Out of memory | 减少并行数: --parallel 4 |
构建选项速查
选项 | 说明 | 示例 |
---|---|---|
-h, --help | 显示帮助 | ./auto_build.sh -h |
-j, --parallel | 并行任务数 | ./auto_build.sh -j 8 |
-c, --config | 构建类型 | ./auto_build.sh -c Debug |
-d, --build-dir | 构建目录 | ./auto_build.sh -d build/custom |
-p, --python | Python 版本 | ./auto_build.sh -p 3.10 |
--qnn-home | QNN SDK 路径 | ./auto_build.sh --qnn-home /opt/qnn |
--clean | 清理构建 | ./auto_build.sh --clean |
--run-tests | 运行测试 | ./auto_build.sh --run-tests |
--verbose | 详细输出 | ./auto_build.sh --verbose |