0x13 - SNPE 的安装和简单使用

SNPE 是什么

Snapdragon Neural Processing Engine (SNPE)
专为高通骁龙系列设计的 DNN 深度学习加速运行库
https://developer.qualcomm.com/sites/default/files/docs/snpe/overview.html

可以理解为一个在骁龙环境下可执行的机器学习后端,类比于 TensoRT 或 ONNX。

本文将简单介绍下 SNPE 的使用

Step.0 环境准备

为了避免影响外部环境,这里使用 docker 环境来进行搭建。
考虑到我手头的模型大多都是用 GPU 导出的,不推荐直接用非 CUDA 环境进行以下工作,仅作参考。

1
2
3
4
5
6
7
docker pull nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04

docker run -it \
--network host \
--name SNPE_test \
nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 \
/bin/bash

安装系统包依赖

1
2
apt-get update \
&& apt-get -y install bc sudo systemctl libicu-dev librtmp-dev libsasl2-dev

Step.1 安装 QPM

SNPE 现在的安装需要骁龙官方的包管理工具,因此首先需要安装 QPM。

到这个网址找对应的 QPM 包进行下载
https://qpm.qualcomm.com/#/main/tools/details/QPM3

安装 QPM

1
dpkg -i QualcommPackageManager3.3.0.88.3.Linux-x86.deb

Step.2 安装 SNPE

相关步骤可以参照官网链接
https://qpm.qualcomm.com/#/main/tools/details/qualcomm_neural_processing_sdk

按上述链接的下载会给予一个.qik文件,将其放置到环境内。

按照官方的说明需要 –login 和 –licence 操作,但我这边测试下来跳过这步也不会有什么影响。
执行下面的命令。

1
2
# 具体的 qik 文件名可能会有些许异同,请根据具体情况进行更改
qpm-cli --extract qualcomm_neural_processing_sdk.2.16.0.231029.Linux-AnyCPU.qik

SNPE 大部分的环境以及默认的安装位置可以参考运行过程中的 log

1
2
3
4
5
6
7
8
9
10
11
Accept and continue with installation [y/n] : y

[Info] : Config File Present
[Info] : Checking environment
[Info] : Checking previous version
[Info] : Checking dependencies
[Info] : Preparing system
[Info] : Extracting files
[Info] : Configuring system
[Info] : Finishing
[Info] : SUCCESS: Installed qualcomm_neural_processing_sdk.Core at /opt/qcom/aistack/snpe/2.16.0.231029

Step.4 SNPE 运行方法以及相关环境依赖

我们不仅需要安装 SNPE,还需要让 python 或者本地的包管理工具找到 SNPE 库的位置。
首先需要找到上文记录下来的 SNPE 的安装目录并执行下面的命令。

1
2
3
4
5
6
apt-get install -y wget curl

cd /opt/qcom/aistack/snpe/2.16.0.231029/bin # 请根据自己的情况调整路径
bash check-linux-dependency.sh
# 如果 node 安装过于缓慢,可以考虑这样指定镜像
# NODE_MIRROR=https://mirrors.bfsu.edu.cn/nodejs-release/ bash check-linux-dependency.sh

如果需要使用 python 环境,需要准备好 python 3.8 + torch 的环境

1
2
3
4
5
6
7
8
# 以 torch 1.11.0 为例
conda create -n SNPE_test python=3.8
conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch

# 换源,如果有需要
# pip config set global.index-url https://mirrors.bfsu.edu.cn/pypi/web/simple
cd /opt/qcom/aistack/snpe/2.16.0.231029/bin
./check-python-dependency

最后,在执行 binary 前,需要引入环境变量

1
source /opt/qcom/aistack/snpe/2.16.0.231029/bin/envsetup.sh

Step.5 导出模型以及测试

这部分的详细信息最好参考官方的使用说明或使用 --help 选项来获取完整的帮助
这里只附上一个我自己的使用 jit 导出的例子。

1
2
3
4
5
6
7
# 模型必须是 trace 的静态图
# jit script 使用动态图,是不可以的。
# 因此,当需要使用 SNPE 时 “必须” 重新以静态图方式导出模型
snpe-pytorch-to-dlc \
-i my_model_jit.tar \
--input_dim input "1, 21, 256, 256" \
--validation_target cpu snapdragon_820