NPU使用 RK3568 内置 NPU 模块, 处理性能最高可达1TOPS。使用该NPU需要下载 RKNN SDK ,RKNN SDK 为带有 NPU 的 RK3566/RK3568 芯片平台提供编程接口,能够帮助 用户部署使用 RKNN-Toolkit2 导出的 RKNN 模型,加速 AI 应用的落地 下载后内容如下,注意区分工具和 SDK: └── RK_NPU_SDK_1.3.0 ├── rknn-toolkit2-1.3.0 // toolkit2 工具,运行于 X86_64 架构平台 │   ├── ... │   └── rknn_toolkit_lite2 // toolkit2 工具的 lite 版本, 运行于 arm64 架构平台 ├── rknpu2_1.3.0.tar.gz // 这个才是 RKNN SDK,记得解压 └── Rockchip_Quick_Start_RKNN_SDK_V1.3.0_CN.pdf RKNN 模型 RKNN 是 Rockchip NPU 平台使用的模型类型,以".rknn"后缀结尾的模型文件。 用户可以通过RKNN SDK提供的工具将自主研发的算法模型转换成 RKNN 模型 RKNN 模型可以直接运行在 RK3568 平台上,在"rknpu2_1.3.0/examples"中有例 子,根据"README.md"编译生成 Android 或 Linux Demo(需要交叉编译环境) 。也可以直接下载编译好的 Demo 。 首先部署 AIO-3568J 运行环境,将库文件放入 RK3568 平台: Android adb root && adb remount adb push rknpu2_1.3.0/runtime/RK356X/Android/librknn_api/arm64-v8a/* /vendor/lib64 adb push rknpu2_1.3.0/runtime/RK356X/Android/librknn_api/arm64-v8a/* /vendor/lib Linux adb push rknpu2_1.3.0/runtime/RK356X/Linux/librknn_api/aarch64/* /usr/lib 将 demo 放入 AIO-3568J ,运行 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/RK356X/ssd_inception_v2.rknn model/road.bmp (Linux 为 bus.jpg) 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=UINT8, 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=30672, fmt=NHWC, type=FP32, 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=697788, fmt=NHWC, type=FP32, qnt_type=AFFINE, zp=53, scale=0.143593 rknn_run loadLabelName ssd - loadLabelName ./model/coco_labels_list.txt loadBoxPriors person @ (13 125 59 212) 0.984696 person @ (110 119 152 197) 0.969119 bicycle @ (171 165 278 234) 0.969119 person @ (206 113 256 216) 0.964519 car @ (146 133 216 170) 0.959264 person @ (49 133 58 156) 0.606060 person @ (83 134 92 158) 0.606060 person @ (96 135 106 162) 0.464163 RKNN-Toolkit-lite2 工具 上面提到的 demo 是使用 C/C++ 程序进行模型的部署和运行,需要开发人员对 RKNPU API 比较熟悉才能实现,学习门槛较高 Toolkit-lite2 工具使用 python 能简化模型的部署和运行,方便开发人员快速 上手,非常推荐使用 Toolkit-lite2 工具只能在板端部署 RKNN 模型,不能进行模型转换!非 RKNN 模型请使用后面提到的 PC 端工具:RKNN-Toolkit2 环境依赖 系统依赖:Toolkit-lite2 目前版本适用系统Debian 10/11 (aarch64),工具只能安装在 RK3568 上,暂不支持 Ubuntu 等操作系统 Python版本:3.7/3.9 Python依赖库: numpy ruamel.yaml psutils Toolkit-lite2 安装 # 1)安装 Python3.7/3.9 和 pip3 sudo apt-get install python3 python3-dev python3-pip gcc # 2)安装相关依赖 sudo apt-get install -y python3-opencv sudo apt-get install -y python3-numpy # 注: Toolkit-lite2 本身并不依赖 opencv-python,但是在示例中需要用到这个模块,所以安装时也一并安装。如果不要用到图像相关的处理,可以不安装该依赖库。 # 3)安装 Toolkit-lite2 # Debian10 ARM64 with python3.7 pip3 install rknn_toolkit_lite2-1.2.0-cp37-cp37m-linux_aarch64.whl # Debian11 ARM64 with python3.9 pip3 install rknn_toolkit_lite2-1.2.0-cp39-cp39m-linux_aarch64.whl 运行 Demo 首先也需要部署运行环境,将库文件放入RK3568平台,方法上文提到过,不再重 复。 将 rknn-toolkit2-1.3.0/rknn_toolkit_lite2/examples 文件夹下的 Demo inference_with_lite 放入AIO-3568J,然后运行: root@firefly:~# cd inference_with_lite/ root@firefly:~/inference_with_lite# python3 test.py --> Load RKNN model done --> Init runtime environment I RKNN: [03:46:35.193] RKNN Driver Information: version: 0.4.2 I RKNN: [03:46:35.193] RKNN Runtime Information: librknnrt version: 1.2.0 (9db21b35d@2022-01-14T15:16:23) I RKNN: [03:46:35.194] RKNN Model Information: version: 1, toolkit version: 1.2.0(compiler version: 1.1.2b17 (2d31041c6@2022-01-10T17:56:44)), target: RKNPU lite, target platform: rk3566, framework name: PyTorch, framework layout: NCHW done --> Running model resnet18 -----TOP 5----- [812]: 0.9996383190155029 [404]: 0.00028062614728696644 [657]: 1.6321087969117798e-05 [833 895]: 1.015903580992017e-05 [833 895]: 1.015903580992017e-05 done 非 RKNN 模型 对于 Caffe、TensorFlow 等其他模型,想要在 RK3568 平台运行,需要先进行 模型转换。可以使用 RKNN-Toolkit2 工具将模型转换成 RKNN 格式。 RKNN-Toolkit2 工具 工具介绍 RKNN-Toolkit2 是为用户提供在 PC、Rockchip NPU 平台上进行模型转换、推理 和性能评估的开发套件,用户通过该工具提供的 Python 接口可以便捷地完成各 种操作。 工具的全部功能简单介绍如下: 模型转换: 支持 Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch 等模型转为 RKNN 模型,并支持 RKNN 模型导 入导出,RKNN 模型能够在 Rockchip NPU 平台上加载使用

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

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

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

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

量化精度分析: 该功能将给出模型量化前后每一层推 理结果与浮点模型推理结果的余弦距离,以便于分析量化误差是如何出现的,为 提高量化模型的精度提供思路 环境依赖 系统依赖: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 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 "",line 1,in ImportError: No module named 'rknn' 模型转换 Demo 在"rknn-toolkit2-1.3.0/examples"下有各种功能的 Toolkit Demo ,这里我们 运行一个模型转换 Demo 为例子,这个 Demo 展示了在 PC 上将 tflite 模型转 换成 RKNN 模型,然后导出、推理、部署到 NPU 平台运行并取回结果的过程。 模型转换的具体实现请参考 Demo 内源代码以及本页末尾的文档。 在 PC 上仿真运行 RKNN-Toolkit2 自带了一个模拟器,直接在 PC 上运行 Demo 即是将转换后的模 型部署到仿真 NPU 上运行 (venv) firefly@T-chip:~/rknn-toolkit2-1.3.0$ cd examples/tflite/mobilenet_v1 (venv) firefly@T-chip:~/rknn-toolkit2-1.3.0/examples/tflite/mobilenet_v1$ ls dataset.txt dog_224x224.jpg mobilenet_v1_1.0_224.tflite test.py (venv) firefly@T-chip:~/rknn-toolkit2-1.3.0/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 运行在与 PC 相连的 AIO-3568J NPU 平台上 RKNN-Toolkit2 通过 PC 的 USB 连接到 OTG 设备 AIO-3568J。RKNN-Toolkit2 将 RKNN 模型传到 AIO-3568J 的 NPU 上运行,再从 AIO-3568J 上获取推理结 果、性能信息等: AIO-3568J Android 系统需要参考 ADB 使用章节" 准备连接 "打开ADB功能,Linux 默认已经打开 ADB 功能。打开之后可以看到有adb设备。 (venv) firefly@T-chip:~$ adb devices List of devices attached XXXXXXXX device 首先部署 AIO-3568J 环境:更新librknnrt.so及运行rknn_server Android adb root && adb remount adb push rknpu2_1.3.0/runtime/RK356X/Android/librknn_api/arm64-v8a/librknnrt.so /vendor/lib64 adb push rknpu2_1.3.0/runtime/RK356X/Android/librknn_api/arm64-v8a/librknnrt.so /vendor/lib adb push rknpu2_1.3.0/runtime/RK356X/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_1.3.0/runtime/RK356X/Linux/librknn_api/aarch64/* /usr/lib # 系统一般自带 rknn_server,可以使用 "systemctl status rknn_server" 查看服务是否处于运行状态 # 如果不存在或不处于运行状态,则手动添加运行 adb push rknpu2_1.3.0/runtime/RK356X/Linux/rknn_server/aarch64/usr/bin/* /usr/bin/ # 可以使用 "systemctl status rknn_server" 查看rknn_server服务是否处于运行状态 # 若没有运行,请在板子的串口终端运行rknn_server chmod +x /usr/bin/rknn_server /usr/bin/rknn_server 然后在 PC 上修改rknn- toolkit2-1.3.0/examples/tflite/mobilenet_v1/test.py文件,在其中添加目 标平台 diff --git a/rknn-toolkit2-1.3.0/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='rk3568') 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='rk3568') if ret != 0: print('Init runtime environment failed!') exit(ret) PC 端运行test.py (venv) firefly@T-chip:~/rknn-toolkit2-1.3.0/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, 1730.77it/s] Quantizating : 100%|███████████████████████████████████████████████| 58/58 [00:00<00:00, 366.86it/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:34) D RKNNAPI: DRV: rknnrt: 1.3.0 (9b36d4d74@2022-05-04T20:16:47) 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 其他 Toolkit Demo 其他 Toolkit Demo 可以在"rknn-toolkit2-1.3.0/examples/"下找到,例如量 化、精度评估等。具体实现以及使用方法请参考 Demo 内源代码以及详细开发文 档。 详细开发文档 AIO-3568J NPU 及 Toolkit 详细使用方法请参考 NPU 和 Toolkit 下 docs 文 件夹中的 pdf 文档。