SBC-sig/documents/rockchip/在openEuler上使用RKNPU.md

465 lines
18 KiB
Markdown
Raw Normal View History

- [描述](#描述)
- [在 openEuler 上安装 RKNPU 并运行推理](#在-openeuler-上安装-rknpu-并运行推理)
- [安装 RKNPU 运行环境](#安装-rknpu-运行环境)
- [测试 RKNPU](#测试-rknpu)
- [安装 rknn-toolkit-lite2 Python 环境](#安装-rknn-toolkit-lite2-python-环境)
- [运行 ResNet18 模型推理](#运行-resnet18-模型推理)
- [测试 Dynamic Shape](#测试-dynamic-shape)
# 描述
本文档介绍如何在 openEuler 的 Rockchip 设备上使用 RKNPU。
参考的官方文档:
https://github.com/airockchip/rknn-toolkit2/blob/master/doc/02_Rockchip_RKNPU_User_Guide_RKNN_SDK_V2.3.2_CN.pdf
内核需求:需要支持 RKNPU 的内核
测试设备Armsom Sige5 (RK3576)
openEuler 版本openEuler 22.03 LTS SP3
镜像构建命令如下:
```
sudo bash build.sh --board armsom-sige5 \
-n openEuler-22.03-LTS-SP3-Armsom-Sige5-aarch64-alpha1 \
-k https://github.com/armbian/linux-rockchip.git \
-b rk-6.1-rkr5.1 \
-c rockchip_linux_defconfig \
2026-01-04 11:41:06 +00:00
-r https://raw.atomgit.com/src-openeuler/openEuler-repos/raw/openEuler-22.03-LTS-SP3/generic.repo \
-s headless
```
将上面构建成功的 openEuler 镜像刷写到 Armsom Sige5 (RK3576) 开发板,之后就可以按照下面的文档安装 RKNPU 并运行推理。
# 在 openEuler 上安装 RKNPU 并运行推理
## 安装 RKNPU 运行环境
安装所需要的软件包
```
dnf update && dnf install git python3-pip screen gcc g++ make cmake -y
```
下载 RKNPU 代码及软件包仓库
```
cd ~
git clone --depth=1 https://github.com/airockchip/rknn-toolkit2.git
```
安装 RKNPU 运行环境到系统
```
cd rknn-toolkit2
cp rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so /usr/lib64
cp rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so /usr/lib
cp rknpu2/runtime/Linux/rknn_server/aarch64/usr/bin/* /usr/bin
```
添加文件权限
```
chmod +x /usr/bin/start_rknn.sh
chmod +x /usr/bin/restart_rknn.sh
chmod +x /usr/bin/rknn_server
```
使用 `screen` 来保持 `rknn_server` 后台运行,这里也可以使用其他软件来实现,例如 `nohup`
```
screen -S rknn_server
```
然后输入以下命令来启动 `rknn_server`
```
start_rknn.sh
```
运行结果如下:
```
bash-5.1# start_rknn.sh
start rknn server, version:2.3.2 (1842325 build@2025-03-30T09:54:34)
I NPUTransfer(995): Starting NPU Transfer Server, Transfer version 2.2.2 (@2024-06-18T03:50:51)
```
如果使用 `screen` 命令使 `rknn_server` 保持后台运行的话,此时使用 `Ctrl A + Z` 来退出当前终端(按住 `Ctrl` 的同时,先按 `A` 再按 `Z`),让 `rknn_server` 保持后台运行。如需恢复 `rknn_server` 终端,使用 `screen -r rknn_server`
## 测试 RKNPU
### 运行 rknn_benchmark 基准测试
进入 `rknn_benchmark` 目录
```
cd ~/rknn-toolkit2/rknpu2/examples/rknn_benchmark
```
编译并运行 `rknn_benchmark`
```
export GCC_COMPILER=/usr/bin/aarch64-linux-gnu
bash build-linux.sh -t rk3576 -a aarch64 -b Release
```
这里使用的设备是 `rk3576`,如果使用 `rk3588` 平台,将这里的 `rk3576` 改为 `rk3588` 即可。
编译过程如下:
```
[root@openEuler rknn_benchmark]# bash build-linux.sh -t rk3576 -a aarch64 -b Release
build-linux.sh -t rk3576 -a aarch64 -b Release
/usr/bin/aarch64-linux-gnu
===================================
TARGET_SOC=RK3576
TARGET_ARCH=aarch64
BUILD_TYPE=Release
BUILD_DIR=/root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/build/build_RK3576_linux_aarch64_Release
CC=/usr/bin/aarch64-linux-gnu-gcc
CXX=/usr/bin/aarch64-linux-gnu-g++
===================================
-- The CXX compiler identification is GNU 10.3.1
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/build/build_RK3576_linux_aarch64_Release
[ 33%] Building CXX object CMakeFiles/rknn_benchmark.dir/src/cnpy/cnpy.cpp.o
[ 66%] Building CXX object CMakeFiles/rknn_benchmark.dir/src/rknn_benchmark.cpp.o
[100%] Linking CXX executable rknn_benchmark
[100%] Built target rknn_benchmark
Consolidate compiler generated dependencies of target rknn_benchmark
[100%] Built target rknn_benchmark
Install the project...
-- Install configuration: "Release"
-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/install/rknn_benchmark_Linux/./rknn_benchmark
-- Set runtime path of "/root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/install/rknn_benchmark_Linux/./rknn_benchmark" to "lib"
-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_benchmark/install/rknn_benchmark_Linux/lib/librknnrt.so
```
进入编译完成的目录:
```
cd ~/rknn-toolkit2/rknpu2/examples/rknn_benchmark/install/rknn_benchmark_Linux/
```
使用 `MobileNet v1` 运行基准测试
```
./rknn_benchmark ../../../rknn_mobilenet_demo/model/RK3576/mobilenet_v1.rknn
```
测试结果如下:
```
[root@openEuler rknn_benchmark_Linux]# ./rknn_benchmark ../../../rknn_mobilenet_demo/model/RK3576/mobilenet_v1.rknn
rknn_api/rknnrt version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27), driver version: 0.9.8
total weight size: 4465024, total internal size: 2157568
total dma used size: 11530240
model input num: 1, output num: 1
input tensors:
index=0, name=input, n_dims=4, dims=[1, 224, 224, 3], n_elems=150528, size=150528, w_stride = 224, size_with_stride=150528, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=0, scale=0.007812
output tensors:
index=0, name=MobilenetV1/Predictions/Reshape_1, n_dims=2, dims=[1, 1001], n_elems=1001, size=2002, w_stride = 0, size_with_stride=2002, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
custom string:
Warmup ...
0: Elapse Time = 4.98ms, FPS = 200.72
1: Elapse Time = 4.61ms, FPS = 216.92
2: Elapse Time = 4.44ms, FPS = 225.17
3: Elapse Time = 4.39ms, FPS = 228.05
4: Elapse Time = 4.39ms, FPS = 227.74
Begin perf ...
0: Elapse Time = 4.36ms, FPS = 229.62
1: Elapse Time = 4.29ms, FPS = 232.88
2: Elapse Time = 4.34ms, FPS = 230.68
3: Elapse Time = 4.47ms, FPS = 223.71
4: Elapse Time = 4.53ms, FPS = 220.95
5: Elapse Time = 4.51ms, FPS = 221.68
6: Elapse Time = 4.51ms, FPS = 221.48
7: Elapse Time = 4.64ms, FPS = 215.75
8: Elapse Time = 4.91ms, FPS = 203.79
9: Elapse Time = 2.60ms, FPS = 384.91
Avg Time 4.31ms, Avg FPS = 231.771
Save output to rt_output0.npy
---- Top5 ----
0.049622 - 620
0.044678 - 645
0.032288 - 627
0.021011 - 819
0.016953 - 790
```
可以看到,在使用 `MobileNet v1` 模型进行基准测试时,推理平均时延为 4.31ms,推理平均 FPS 为 231.771。
### 测试 MobileNet 模型推理
进入 `MobileNet Demo` 目录:
```
cd rknn_mobilenet_demo
```
编译 `MobileNet Demo` 推理程序:
```
bash build-linux.sh -t rk3576 -a aarch64 -b Release
```
编译过程如下:
```
[root@openEuler rknn_mobilenet_demo]# bash build-linux.sh -t rk3576 -a aarch64 -b Release
build-linux.sh -t rk3576 -a aarch64 -b Release
/usr/bin/aarch64-linux-gnu
===================================
TARGET_SOC=RK3576
TARGET_ARCH=aarch64
BUILD_TYPE=Release
BUILD_DIR=/root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/build/build_RK3576_linux_aarch64_Release
CC=/usr/bin/aarch64-linux-gnu-gcc
CXX=/usr/bin/aarch64-linux-gnu-g++
===================================
-- The C compiler identification is GNU 10.3.1
-- The CXX compiler identification is GNU 10.3.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/aarch64-linux-gnu-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /root/rknn-toolkit2/rknpu2/examples/3rdparty/opencv/opencv-linux-aarch64 (found version "3.4.5")
-- target_soc = RK3576
-- Configuring done
-- Generating done
-- Build files have been written to: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/build/build_RK3576_linux_aarch64_Release
[ 50%] Building CXX object CMakeFiles/rknn_mobilenet_demo.dir/src/main.cc.o
[100%] Linking CXX executable rknn_mobilenet_demo
[100%] Built target rknn_mobilenet_demo
Consolidate compiler generated dependencies of target rknn_mobilenet_demo
[100%] Built target rknn_mobilenet_demo
Install the project...
-- Install configuration: "Release"
-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./rknn_mobilenet_demo
-- Set runtime path of "/root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./rknn_mobilenet_demo" to "lib"
-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./model/RK3576
-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./model/RK3576/mobilenet_v1.rknn
-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./model/cat_224x224.jpg
-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/./model/dog_224x224.jpg
-- Installing: /root/rknn-toolkit2/rknpu2/examples/rknn_mobilenet_demo/install/rknn_mobilenet_demo_Linux/lib/librknnrt.so
```
进入编译输出文件目录:
```
cd install/rknn_mobilenet_demo_Linux
```
使用 `MobileNet` 模型运行推理,测试输入 `cat_224x224.jpg` 图片:
```
./rknn_mobilenet_demo ../../model/RK3576/mobilenet_v1.rknn ../../model/cat_224x224.jpg
```
推理结果如下:
```
[root@openEuler rknn_mobilenet_demo_Linux]# ./rknn_mobilenet_demo ../../model/RK3576/mobilenet_v1.rknn ../../model/cat_224x224.jpg
model input num: 1, output num: 1
input tensors:
index=0, name=input, n_dims=4, dims=[1, 224, 224, 3], n_elems=150528, size=150528, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=0, scale=0.007812
output tensors:
index=0, name=MobilenetV1/Predictions/Reshape_1, n_dims=2, dims=[1, 1001, 0, 0], n_elems=1001, size=2002, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
rknn_run
--- Top5 ---
283: 0.415283
282: 0.175781
286: 0.158813
278: 0.060303
279: 0.043427
```
使用 `MobileNet` 模型运行推理,测试输入 `dog_224x224.jpg` 图片:
```
./rknn_mobilenet_demo ../../model/RK3576/mobilenet_v1.rknn ../../model/dog_224x224.jpg
```
推理结果如下:
```
[root@openEuler rknn_mobilenet_demo_Linux]# ./rknn_mobilenet_demo ../../model/RK3576/mobilenet_v1.rknn ../../model/dog_224x224.jpg
model input num: 1, output num: 1
input tensors:
index=0, name=input, n_dims=4, dims=[1, 224, 224, 3], n_elems=150528, size=150528, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=0, scale=0.007812
output tensors:
index=0, name=MobilenetV1/Predictions/Reshape_1, n_dims=2, dims=[1, 1001, 0, 0], n_elems=1001, size=2002, fmt=UNDEFINED, type=FP16, qnt_type=AFFINE, zp=0, scale=1.000000
rknn_run
--- Top5 ---
156: 0.935059
155: 0.057037
205: 0.003881
284: 0.003119
285: 0.000172
```
## 安装 rknn-toolkit-lite2 Python 环境
进入 rknn-toolkit-lite2 Python 软件包目录:
```
cd ~/rknn-toolkit2/rknn-toolkit-lite2/packages
```
查看 `Python` 版本:
```
[root@openEuler packages]# python3 -V
Python 3.9.9
```
根据相应的版本应该安装仓库提供的对应 `cp39``rknn_toolkit_lite2` Python 软件包 `rknn_toolkit_lite2-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl`,运行以下命令:
```
pip3 install rknn_toolkit_lite2-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
```
安装过程如下:
```
[root@openEuler packages]# pip3 install rknn_toolkit_lite2-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./rknn_toolkit_lite2-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Collecting ruamel.yaml
Downloading ruamel.yaml-0.18.14-py3-none-any.whl (118 kB)
|████████████████████████████████| 118 kB 644 kB/s
Collecting numpy
Downloading numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (13.9 MB)
|████████████████████████████████| 13.9 MB 61 kB/s
Collecting psutil
Downloading psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (279 kB)
|████████████████████████████████| 279 kB 31.8 MB/s
Collecting ruamel.yaml.clib>=0.2.7
Downloading ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl (636 kB)
|████████████████████████████████| 636 kB 23.4 MB/s
Installing collected packages: ruamel.yaml.clib, ruamel.yaml, psutil, numpy, rknn-toolkit-lite2
Successfully installed numpy-2.0.2 psutil-7.0.0 rknn-toolkit-lite2-2.3.2 ruamel.yaml-0.18.14 ruamel.yaml.clib-0.2.12
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
```
还需要安装 `opencv-python` Python 软件包:
```
[root@openEuler packages]# pip3 install opencv-python
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting opencv-python
Downloading opencv_python-4.12.0.88-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (45.9 MB)
|████████████████████████████████| 45.9 MB 6.0 kB/s
Requirement already satisfied: numpy<2.3.0,>=2 in /usr/local/lib64/python3.9/site-packages (from opencv-python) (2.0.2)
Installing collected packages: opencv-python
Successfully installed opencv-python-4.12.0.88
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
```
## 运行 ResNet18 模型推理
进入 ResNet18 Demo 目录:
```
cd ~/rknn-toolkit2/rknn-toolkit-lite2/examples/resnet18
```
运行推理:
```
[root@openEuler resnet18]# python3 test.py
W rknn-toolkit-lite2 version: 2.3.2
--> Load RKNN model
done
--> Init runtime environment
I RKNN: [16:56:45.369] RKNN Runtime Information, librknnrt version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27)
I RKNN: [16:56:45.369] RKNN Driver Information, version: 0.9.8
I RKNN: [16:56:45.369] RKNN Model Information, version: 6, toolkit version: 2.3.2(compiler version: 2.3.2 (839b70f037@2025-04-03T10:34:04)), target: RKNPU f2, target platform: rk3576, framework name: PyTorch, framework layout: NCHW, model inference type: static_shape
W RKNN: [16:56:45.400] query RKNN_QUERY_INPUT_DYNAMIC_RANGE error, rknn model is static shape type, please export rknn with dynamic_shapes
W Query dynamic range failed. Ret code: RKNN_ERR_MODEL_INVALID. (If it is a static shape RKNN model, please ignore the above warning message.)
done
--> Running model
resnet18
-----TOP 5-----
[812] score:0.999638 class:"space shuttle"
[404] score:0.000281 class:"airliner"
[657] score:0.000014 class:"missile"
[833] score:0.000010 class:"submarine, pigboat, sub, U-boat"
[466] score:0.000010 class:"bullet train, bullet"
done
```
## 测试 Dynamic Shape
进入 Dynamic Shape Demo 目录:
```
cd ~/rknn-toolkit2/rknn-toolkit-lite2/examples/dynamic_shape
```
运行推理:
```
[root@openEuler dynamic_shape]# python3 test.py
W rknn-toolkit-lite2 version: 2.3.2
--> Load RKNN model
done
--> Init runtime environment
I RKNN: [16:57:46.389] RKNN Runtime Information, librknnrt version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27)
I RKNN: [16:57:46.389] RKNN Driver Information, version: 0.9.8
I RKNN: [16:57:46.390] RKNN Model Information, version: 6, toolkit version: 2.3.2(compiler version: 2.3.2 (839b70f037@2025-04-03T10:34:04)), target: RKNPU f2, target platform: rk3576, framework name: Caffe, framework layout: NCHW, model inference type: dynamic_shape
done
--> Running model
model: mobilenet_v2
input shape: 1,3,224,224
W The input[0] need NHWC data format, but NCHW set, the data format and data buffer will be changed to NHWC.
-----TOP 5-----
[155] score:0.937500 class:"Shih-Tzu"
[204] score:0.002548 class:"Lhasa, Lhasa apso"
[154] score:0.001890 class:"Pekinese, Pekingese, Peke"
[283] score:0.000659 class:"Persian cat"
[284] score:0.000172 class:"Siamese cat, Siamese"
input shape: 1,3,160,160
W The input[0] need NHWC data format, but NCHW set, the data format and data buffer will be changed to NHWC.
-----TOP 5-----
[155] score:0.634766 class:"Shih-Tzu"
[154] score:0.295166 class:"Pekinese, Pekingese, Peke"
[204] score:0.030182 class:"Lhasa, Lhasa apso"
[194] score:0.001085 class:"Dandie Dinmont, Dandie Dinmont terrier"
[219] score:0.000291 class:"cocker spaniel, English cocker spaniel, cocker"
input shape: 1,3,256,256
W The input[0] need NHWC data format, but NCHW set, the data format and data buffer will be changed to NHWC.
-----TOP 5-----
[155] score:0.926758 class:"Shih-Tzu"
[154] score:0.008347 class:"Pekinese, Pekingese, Peke"
[204] score:0.004559 class:"Lhasa, Lhasa apso"
[193] score:0.001019 class:"Australian terrier"
[283] score:0.000481 class:"Persian cat"
done
```