基于高通QNN SDK的ONNXRuntime推理引擎重编

部署运行你感兴趣的模型镜像

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 setexport QNN_SDK_ROOT=/path/to/qnn-sdk
CMake version too old安装新版 CMake (>= 3.26)
Python.h not foundsudo 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, --pythonPython 版本./auto_build.sh -p 3.10
--qnn-homeQNN 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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,用户现在想了解如何使用高通QNN SDK进行模型转换,并在C++中部署和执行推理。我需要根据他们之前的问题和现有的引用来组织回答。 首先,用户之前的问题已经涉及到了QNNC++推理设置,现在他们更关注模型转换和部署的具体步骤。我需要确保回答的结构清晰,分步骤进行,并且提供示例代码。 引用[1]提到QNN SDK支持模型转换和优化,所以需要详细说明模型转换工具的使用,比如如何将ONNX模型转换为QNN支持的格式。引用[3]提到了安装Visual Studio和VCPKG,这部分可以作为开发环境配置的内容。 接下来,用户可能需要具体的步骤,比如模型转换的命令行示例,C++代码的初始化、输入处理、推理执行等。此外,潜在的问题处理也很要,比如模型不支持时的解决方法,或者性能调优的方法。 需要确保回答中包含代码示例,并且代码符合用户之前提到的格式要求,比如使用$...$的行内数学表达式,但这里可能更多是代码块。同时,问题部分需要生成相关问题,帮助用户进一步探索。 还要注意引用来源,比如在模型转换部分引用[1],在环境配置引用[3]。错误处理部分可以参考之前提到的DXGI_ERROR_UNSUPPORTED的情况,可能需要引用之前的回答或现有引用。 最后,确保语言简洁,步骤明确,示例代码正确,并且覆盖用户的需求点:模型转换、C++部署、推理执行。</think>### 高通 QNN SDK 模型转换与 C++ 部署推理教程 以下是基于 QNN SDK 的模型转换、C++ 部署及推理的完整流程,结合官方文档和实践经验整理。 --- #### **1. 模型转换(ONNX → QNN 格式)** QNN SDK 提供 `qnn-onnx-converter` 工具,可将 ONNX 模型转换为 QNN 支持的二进制格式(*.bin)和配置文件(*.cpp),需通过命令行操作: ```bash qnn-onnx-converter \ --input_model model.onnx \ --output_path ./qnn_model \ --input_list input_shapes.json \ --quantize float32 \ # 量化类型(可选int8/uint8) --backend QNN_CPU # 指定目标后端(如QNN_DSP/QNN_GPU) ``` **关键参数说明**: - **input_list**:定义输入张量形状的 JSON 文件,例如: ```json {"input": [1, 3, 224, 224]} // 输入名称与形状对应 ``` - **quantize**:量化模式可提升性能(需配合校准数据集使用)[^1]。 --- #### **2. C++ 部署与推理代码** 以下代码展示如何加载转换后的 QNN 模型并执行推理: ```cpp #include <qnn/qnn.h> #include <vector> int main() { try { // Step 1: 初始化 QNN 上下文 qnn::Context context(qnn::BackendType::CPU); // 选择后端类型 // Step 2: 加载转换后的 QNN 模型 const std::string modelPath = "./qnn_model/model.bin"; auto model = context.loadModel(modelPath); // Step 3: 准备输入数据 std::vector<float> inputData(1*3*224*224, 0.0f); // 输入张量形状与转换时一致 // 填充数据(例如归一化后的图像像素值) // inputData[...] = ...; // Step 4: 绑定输入/输出 auto ioConfig = model.createIOConfig(); ioConfig.bindInput("input", inputData.data(), inputData.size() * sizeof(float)); std::vector<float> outputData(1000); // 假设输出为1000类概率 ioConfig.bindOutput("output", outputData.data(), outputData.size() * sizeof(float)); // Step 5: 执行推理 model.run(ioConfig); // Step 6: 处理输出结果 for (size_t i = 0; i < outputData.size(); ++i) { if (outputData[i] > 0.5) { // 示例:输出概率大于0.5的类别 std::cout << "Class " << i << ": " << outputData[i] << std::endl; } } } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; } ``` --- #### **3. 环境配置与译** 1. **依赖安装**: - 通过 **vcpkg** 安装 QNN SDKC++ 依赖: ```bash vcpkg install qnn-sdk:x64-windows ``` - 在 Visual Studio 项目中配置包含路径和库文件(`qnn_api.h`、`QnnCpu.lib`)[^3]。 2. **译命令示例**(CMake): ```cmake cmake_minimum_required(VERSION 3.12) project(QNN_Demo) find_package(QNNSDK REQUIRED) add_executable(qnn_inference main.cpp) target_link_libraries(qnn_inference PRIVATE QNN::CPU) ``` --- #### **4. 常见问题与优化** 1. **模型兼容性**: - 若遇到错误代码 `0x887A0004`(不支持的算子),使用 QNN SDK 的 **`qnn-op-package-generator`** 工具自定义算子实现。 2. **性能优化**: - 启用 **DSP/GPU 后端**(需修改 `qnn::BackendType` 和 `backend_path`)。 - 使用 **量化模型**(需在转换时提供校准数据集): ```bash qnn-onnx-converter --quantize int8 --calibration_data calibration_images/ ``` --- ### 相关问题 1. 如何验证 QNN 模型转换后的精度损失是否在可接受范围内? 2. 在异构计算环境下(CPU+DSP),如何分配不同层的计算任务以优化延迟? 3. 如何通过 QNN Profiler 工具分析推理过程中的性能瓶颈?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值