1. NPU使用

RK3576 内置 NPU 模块, 处理性能最高可达6TOPS。使用该NPU需要下载RKNN SDK,RKNN SDK 为带有 NPU 的 RK3588S/RK3588 芯片平台提供编程接口,能够帮助用户部署使用 RKNN-Toolkit2 导出的 RKNN 模型,加速 AI 应用的落地

1.1. RKNN 模型

RKNN 是 Rockchip NPU 平台使用的模型类型,以.rknn后缀结尾的模型文件。用户可以通过RKNN SDK提供的工具将自主研发的算法模型转换成 RKNN 模型

RKNN 模型可以直接运行在 RK3576 平台上,在rknpu2/examples中有例子,根据README.md编译生成 Android 或 Linux Demo(需要交叉编译环境)。也可以直接下载编译好的 Demo

在 AIO-3576JD4 上运行demo如下:

:/ # cd /data/rknn_ssd_demo_Android/    (Linux 系统使用 rknn_ssd_demo_Linux 即可)
:/data/rknn_ssd_demo_Android # chmod 777 rknn_ssd_demo
:/data/rknn_ssd_demo_Android # export LD_LIBRARY_PATH=./lib
:/data/rknn_ssd_demo_Android # ./rknn_ssd_demo model/RK3588/ssd_inception_v2.rknn model/road.bmp
Loading model ...
rknn_init ...
model input num: 1, output num: 2
input tensors:
  index=0, name=Preprocessor/sub:0, n_dims=4, dims=[1, 300, 300, 3], n_elems=270000, size=270000, fmt=NHWC, type=INT8, qnt_type=AFFINE, zp=0, scale=0.007812
output tensors:
  index=0, name=concat:0, n_dims=4, dims=[1, 1917, 1, 4], n_elems=7668, size=7668, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=53, scale=0.089455
  index=1, name=concat_1:0, n_dims=4, dims=[1, 1917, 91, 1], n_elems=174447, size=174447, fmt=NCHW, type=INT8, qnt_type=AFFINE, zp=53, scale=0.143593
rknn_run
loadLabelName
ssd - loadLabelName ./model/coco_labels_list.txt
loadBoxPriors
person @ (12 124 60 209) 0.982374
person @ (110 119 153 195) 0.973138
bicycle @ (172 163 277 233) 0.973138
person @ (207 113 258 218) 0.969119
car @ (148 133 215 170) 0.953267
person @ (83 134 92 158) 0.639771
person @ (49 133 58 156) 0.606060
person @ (96 134 105 162) 0.428693

1.2. 非 RKNN 模型

对于 Caffe、TensorFlow 等其他模型,想要在 RK3576 平台运行,需要先进行模型转换。可以使用 RKNN-Toolkit2 工具将模型转换成 RKNN 格式。

1.3. RKNN-Toolkit2工具

1.3.1. 工具介绍

RKNN-Toolkit2 是为用户提供在 PC、Rockchip NPU 平台上进行模型转换、推理和性能评估的开发套件,用户通过该工具提供的 Python 接口可以便捷地完成各种操作。

工具的全部功能简单介绍如下:

  • 模型转换: 支持 CaffeTensorFlowTensorFlow LiteONNXDarkNetPyTorch 等模型转为 RKNN 模型,并支持 RKNN 模型导入导出,RKNN 模型能够在 Rockchip NPU 平台上加载使用

  • 量化功能: 支持将浮点模型量化为定点模型,目前支持的量化方法为非对称量化 ( asymmetric_quantized-8 及 asymmetric_quantized-16 ),并支持混合量化功能 。 asymmetric_quantized-16 目前版本暂不支持

  • 模型推理: 能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型并获取推理结果; 或将 RKNN 模型分发到指定的 NPU 设备上进行推理并获取推理结果

  • 性能评估: 将 RKNN 模型分发到指定 NPU 设备上运行,以评估模型在实际设备上运行时的性能

  • 内存评估: 评估模型运行时的内存的占用情况。使用该功能时,必须将 RKNN 模型分发到 NPU 设备中运行,并调用相关接口获取内存使用信息

  • 量化精度分析: 该功能将给出模型量化前后每一层推理结果与浮点模型推理结果的余弦距离,以便于分析量化误差是如何出现的,为提高量化模型的精度提供思路

1.3.2. 环境依赖

  • 系统依赖:RKNN-Toolkit2 目前版本适用系统Ubuntu18.04(x64)及以上,工具只能安装在 PC 上,暂不支持 Windows、MacOS、Debian 等操作系统

  • Python版本:3.6/3.8

  • Python依赖库:

#Python3.6
cat doc/requirements_cp36-1.3.0.txt
numpy==1.16.6
onnx==1.7.0
onnxoptimizer==0.1.0
onnxruntime==1.6.0
tensorflow==1.14.0
tensorboard==1.14.0
protobuf==3.12.0
torch==1.6.0
torchvision==0.7.0
psutil==5.6.2
ruamel.yaml==0.15.81
scipy==1.2.1
tqdm==4.27.0
requests==2.21.0
opencv-python==4.4.0.46
PuLP==2.4
scikit_image==0.17.2
# if install bfloat16 failed, please install numpy manually first. "pip install numpy==1.16.6"
bfloat16==1.1
flatbuffers==1.12

#Python3.8
cat doc/requirements_cp38-1.3.0.txt
numpy==1.17.3
onnx==1.7.0
onnxoptimizer==0.1.0
onnxruntime==1.6.0
tensorflow==2.2.0
tensorboard==2.2.2
protobuf==3.12.0
torch==1.6.0
torchvision==0.7.0
psutil==5.6.2
ruamel.yaml==0.15.81
scipy==1.4.1
tqdm==4.27.0
requests==2.21.0
opencv-python==4.4.0.46
PuLP==2.4
scikit_image==0.17.2
# if install bfloat16 failed, please install numpy manually first. "pip install numpy==1.17.3"
bfloat16==1.1

1.3.3. RKNN-Toolkit2 安装

建议使用 virtualenv 管理 Python 环境,因为系统中可能同时有多个版本的 Python 环境,以 Python3.6 为例

# 1)安装virtualenv 环境、Python3.6 和 pip3
sudo apt-get install virtualenv \
sudo apt-get install python3 python3-dev python3-pip
# 2)安装相关依赖
sudo apt-get install libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 libsm6 \
libgl1-mesa-glx libprotobuf-dev gcc
# 3)使用 virtualenv 管理 Python 环境并安装 Python 依赖,Python3.6用requirements_cp36-1.3.0.txt
virtualenv -p /usr/bin/python3 venv
source venv/bin/activate
pip3 install -r doc/requirements_cp36-*.txt
# 4)安装 RKNN-Toolkit2,如rknn_toolkit2-1.3.0_11912b58-cp36-cp36m-linux_x86_64.whl
sudo pip3 install packages/rknn_toolkit2*cp36*.whl
# 5)检查RKNN-Toolkit2是否安装成功,可按ctrl+d组合键退出
(venv) firefly@T-chip:~/rknn-toolkit2$ python3
>>> from rknn.api import RKNN
>>>

如果导入 RKNN 模块没有失败,说明安装成功,失败情况之一如下:

>>> from rknn.api import RKNN
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
ImportError: No module named 'rknn'

1.3.4. 模型转换 Demo

rknn-toolkit2/examples下有各种功能的 Toolkit Demo ,这里我们运行一个模型转换 Demo 为例子,这个 Demo 展示了在 PC 上将 tflite 模型转换成 RKNN 模型,然后导出、推理、部署到 NPU 平台运行并取回结果的过程。模型转换的具体实现请参考 Demo 内源代码以及本页末尾的文档。

1.3.4.1. 在 PC 上仿真运行

  • RKNN-Toolkit2 自带了一个模拟器,直接在 PC 上运行 Demo 即是将转换后的模型部署到仿真 NPU 上运行

(venv) firefly@T-chip:~/rknn-toolkit2$ cd examples/tflite/mobilenet_v1
(venv) firefly@T-chip:~/rknn-toolkit2/examples/tflite/mobilenet_v1$ ls
dataset.txt  dog_224x224.jpg  mobilenet_v1_1.0_224.tflite  test.py
(venv) firefly@T-chip:~/rknn-toolkit2/examples/tflite/mobilenet_v1$ python3 test.py
W __init__: rknn-toolkit2 version: 1.3.0-11912b58
--> Config model
W config: 'target_platform' is None, use rk3566 as default, Please set according to the actual platform!
done
--> Loading model
INFO: Initialized TensorFlow Lite runtime.
done
--> Building model
Analysing : 100%|█████████████████████████████████████████████████| 58/58 [00:00<00:00, 1869.33it/s]
Quantizating : 100%|████████████████████████████████████████████████| 58/58 [00:00<00:00, 68.07it/s]
W build: The default input dtype of 'input' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!
done
--> Export rknn model
done
--> Init runtime environment
Analysing : 100%|█████████████████████████████████████████████████| 60/60 [00:00<00:00, 1434.93it/s]
Preparing : 100%|██████████████████████████████████████████████████| 60/60 [00:00<00:00, 373.17it/s]
W init_runtime: target is None, use simulator!
done
--> Running model
mobilenet_v1
-----TOP 5-----
[156]: 0.9345703125
[155]: 0.0570068359375
[205]: 0.00429534912109375
[284]: 0.003116607666015625
[285]: 0.00017178058624267578

done

1.3.4.2. 运行在与 PC 相连的 AIO-3576JD4 NPU 平台上

RKNN-Toolkit2 通过 PC 的 USB 连接到 OTG 设备 AIO-3576JD4。RKNN-Toolkit2 将 RKNN 模型传到 AIO-3576JD4 的 NPU 上运行,再从 AIO-3576JD4 上获取推理结果、性能信息等:

  • 首先部署 AIO-3576JD4 环境:更新librknnrt.so及运行rknn_server Android

adb root && adb remount
adb push rknpu2/runtime/RK3588/Android/librknn_api/arm64-v8a/librknnrt.so /vendor/lib64
adb push rknpu2/runtime/RK3588/Android/librknn_api/arm64-v8a/librknnrt.so /vendor/lib
adb push rknpu2/runtime/RK3588/Android/rknn_server/arm64-v8a/vendor/bin/rknn_server /vendor/bin
adb shell reboot

#Android系统启动时会自动运行rknn_server, "ps -ef|grep rknn_server"可以查看是否运行

Linux

adb push rknpu2/runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/
adb push rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/lib/
adb push rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknn_api.so /usr/lib/

# 可以使用 "systemctl status rknn_server" 查看rknn_server服务是否处于运行状态
# 若没有运行,请在板子的串口终端运行rknn_server
chmod +x /usr/bin/rknn_server
/usr/bin/rknn_server
  • 然后在 PC 上修改examples/tflite/mobilenet_v1/test.py文件,在其中添加目标平台

diff --git a/examples/tflite/mobilenet_v1/test.py b/examples/tflite/mobilenet_v1/test.py
index 0507edb..fd2e070 100755
--- a/examples/tflite/mobilenet_v1/test.py
+++ b/examples/tflite/mobilenet_v1/test.py
@@ -24,11 +24,11 @@ def show_outputs(outputs):
 if __name__ == '__main__':
 
     # Create RKNN object
-    rknn = RKNN(verbose=True)
+    rknn = RKNN()
 
     # Pre-process config
     print('--> Config model')
-    rknn.config(mean_values=[128, 128, 128], std_values=[128, 128, 128])
+    rknn.config(mean_values=[128, 128, 128], std_values=[128, 128, 128], target_platform='rk3576')
     print('done')
 
     # Load model
@@ -62,7 +62,7 @@ if __name__ == '__main__':
 
     # Init runtime environment
     print('--> Init runtime environment')
-    ret = rknn.init_runtime()
+    ret = rknn.init_runtime(target='rk3576')
     if ret != 0:
         print('Init runtime environment failed!')
         exit(ret)
  • PC 端运行test.py

(venv) firefly@T-chip:~/rknn-toolkit2/examples/tflite/mobilenet_v1$ python3 test.py 
W __init__: rknn-toolkit2 version: 1.3.0-11912b58
--> Config model
done
--> Loading model
INFO: Initialized TensorFlow Lite runtime.
done
--> Building model
Analysing : 100%|█████████████████████████████████████████████████| 58/58 [00:00<00:00, 1903.99it/s]
Quantizating : 100%|███████████████████████████████████████████████| 58/58 [00:00<00:00, 114.55it/s]
W build: The default input dtype of 'input' is changed from 'float32' to 'int8' in rknn model for performance!
                      Please take care of this change when deploy rknn model with Runtime API!
done
--> Export rknn model
done
--> Init runtime environment
I NPUTransfer: Starting NPU Transfer Client, Transfer version 2.1.0 (b5861e7@2020-11-23T11:50:36)
D RKNNAPI: ==============================================
D RKNNAPI: RKNN VERSION:
D RKNNAPI:   API: 1.3.0 (121b661 build: 2022-04-29 11:07:20)
D RKNNAPI:   DRV: rknn_server: 1.3.0 (121b661 build: 2022-04-29 11:11:57)
D RKNNAPI:   DRV: rknnrt: 1.3.0 (c193be371@2022-05-04T20:16:22)
D RKNNAPI: ==============================================
done
--> Running model
mobilenet_v1
-----TOP 5-----
[156]: 0.93505859375
[155]: 0.057037353515625
[205]: 0.0038814544677734375
[284]: 0.0031185150146484375
[285]: 0.00017189979553222656

done

1.3.5. 其他 Toolkit Demo

其他 Toolkit Demo 可以在rknn-toolkit2/examples/下找到,例如量化、精度评估等。具体实现以及使用方法请参考 Demo 内源代码以及详细开发文档。

1.4. 详细开发文档

AIO-3576JD4 NPU 及 Toolkit 详细使用方法请参考RKNN SDK下《Rockchip_RKNPU_User_Guide_RKNN_API_*.pdf》、《Rockchip_User_Guide_RKNN_Toolkit2_*.pdf》文档。