当前位置:

RK3576 NPU使用

2024-06-11 11:59
151

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

在 RK3576 上运行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 @ (1212460209)0.982374 person @ (110119153195)0.973138 bicycle @ (172163277233)0.973138 person @ (207113258218)0.969119 car @ (148133215170)0.953267 person @ (8313492158)0.639771 person @ (4913358156)0.606060 person @ (96134105162)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) hua-chips@h-chips:~/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) hua-chips@h-chips:~/rknn-toolkit2$ cd examples/tflite/mobilenet_v1

(venv) hua-chips@h-chips:~/rknn-toolkit2/examples/tflite/mobilenet_v1$ ls

dataset.txt   dog_224x224.jpg   mobilenet_v1_1.0_224.tflite   test.py

(venv) hua-chips@h-chips~/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 modeldone--> 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相连的 RK3576 NPU 平台上

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

  • 首先部署 RK3576 环境:更新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_serverchmod +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) hua-chips@h-chips:~/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.00017189979553222656done


1.3.5.其他Toolkit Demo

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

1.4.详细开发文档

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


福州华芯创辉科技(hua-chips)是一家专注从事嵌入式方案设计与研发的高新企业,拥有一支多年从事嵌入式研发的团队。团队擅长全国产化替代方案设计,工业控制产品研发,AI产品研发等。产品所涉及的领域包括安防,电力,轨道交通,码头等。 已陆续推出了基于RK3588, RK3576, RK3568,RV1126 等芯片的多款产品,获得客户的一致认可。 我们也为客户提供专业的定制服务,如您有任何产品问题,设计问题都可以通过右侧的联系方式联系我们,我们会有专人为您进行解答。
产品展示
热门文章