自研算法 "CAM-CRV1126S2U/CAM-CRV1109S2U " NPU 进行模型推理时必须使用"RKNN"模型 。如果用户使用自己研发的算法模型,需要熟悉 RKNN 开发流程,把自己的模型 转换成 RKNN 再进行使用。本章针对这类用户讲解一下 RKNN 开发配套工具的使 用。 RKNN 介绍 RKNN 是 Rockchip NPU 平台使用的模型类型,以".rknn"后缀结尾的模型文件。 Rockchip 提供了完整了模型转换 Python 工具,方便用户将自主研发的算法模 型转换成 RKNN 模型,同时 Rockchip 也提供了"C/C++"和"Python" API 接口。 RKNN-Toolkit 工具介绍 "RKNN-Toolkit "是为用户提供在 PC、 Rockchip NPU 平台上进行模型转换、推 理和性能评估的 开发套件,用户通过该工具提供的 Python 接口可以便捷地完成 以下功能: 模型转换:支持 Caffe、TensorFlow、TensorFlow Lite、ONNX、Darknet、Pytorch、MXNet 模型转成 RKNN 模型,支持 RKNN 模型 导入导出,后续能够在 Rockchip NPU 平台上加 载使用。从1.2.0版本开始支持 多输入模型。从1.3.0版本开始支持 Pytorch 和 MXNet。 量化功能:支持将浮点模型转成量化模型, 目前支持 的量化方法有非对称量化( asymmetric_quantized-u8 ) , 动态定点量化 ( dynamic_fixed_point-8 和 dynamic_fixed_point-16)。从1.0.0版本开始, RKNN-Toolkit 开始支持混合量化功能。 模型推理:能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型并获取推理结果;也可以将 RKNN 模型分发到指定的 NPU 设备上进行 推理。 性能评估:能够在 PC 上模拟 Rockchip NPU 运行 RKNN 模型,并评估模型性能(包括总 耗时和每一层的耗时);也可以将 RKNN 模型 分发到指定 NPU 设备上运行,以评估模型 在实际设备上运行时的性能。 内存评估:评估模型运行时对系统和 NPU 内存的消 耗情况。使用该功能时,必须将 RKNN 模型分发到 NPU 设备中运行,并调用相关 接口获取内存使用信息。从0.9.9版本开始支持 该功能。 模型预编译:通过预编译技术生成的 RKNN 模型可以 减少在硬件平台上的加载时间。对 于部分模型,还可以减少模型尺寸。但是预编 译后的 RKNN 模型只能在 NPU 设备上运行。 目前只有 x86_64 Ubuntu 平台支 持直接从原始模型生成预编译 RKNN 模型。 RKNN-Toolkit 从0.9.5版本开始支 持模型预编译功能,并在1.0.0版本中对预编译方法进行了升级,升级 后的预编译 模型无法与旧驱动兼容。从1.4.0版本开始,也可以通过 NPU 设备将普通 RKNN 模型转成预编译 RKNN 模型。 模型分段:该功能用于多模型同时运行的场景下,可 以将单个模型分成多段在 NPU 上执 行,借此来调节多个模型占用 NPU 的执行时 间,避免因为一个模型占用太多执行时间, 而使其他模型得不到及时执行。RKNN- Toolkit 从1.2.0版本开始支持该功能。该功能必须 在带有 Rockchip NPU 的硬 件上使用,且 NPU 驱动版本要大于 0.9.8。 自定义算子功能:如果模型含有 RKNN-Toolkit 不支 持的算子(operator),那么在模型转 换阶段就会失败。这时候可以使用自定义算 子功能来添加不支持的算子,从而使模型能正 常转换和运行。RKNN-Toolkit 从 1.2.0版本开始支持该功能。自定义算子的使用和开发请 参考《 Rockchip_Developer_Guide_RKNN_Toolkit_Custom_OP_CN》文档。 量化精度分析功能:该功能将给出模型量化前后每一 层推理结果的欧氏距离或余弦距离, 以分析量化误差是如何出现的,为提高量化 模型的精度提供思路。该功能从1.3.0版本开 始支持。1.4.0 版本增加逐层量化 精度分析子功能,将每一层运行时的输入指定为正确的 浮点值,以排除逐层误差 积累,能够更准确的反映每一层自身受量化的影响。 可视化功能:该功能以图形界面的形式呈现 RKNN- Toolkit 的各项功能,简化用户操作步 骤。用户可以通过填写表单、点击功能按 钮的形式完成模型的转换和推理等功能,而不需 要再去手动编写脚本。有关可视 化功能的具体使用方法请参考 《 Rockchip_User_Guide_RKNN_Toolkit_Visualization_CN》文档。1.3.0 版本开 始支持该功 能。1.4.0 版本完善了对多输入模型的支持,并且支持 RK1806, RV1109, RV1126 等新的 Rockchip NPU 设备。 模型优化等级功能:RKNN-Toolkit 在模型转换过程 中会对模型进行优化,默认的优化选项 可能会对模型精度产生一些影响。通过设 置优化等级,可以关闭部分或全部优化选项。有 关优化等级的具体使用方法请参 考 config 接口中optimization_level参数的说明。该功能从 1.3.0 版本开始 支持。 环境依赖 系统支持:Ubuntu 16.04 x64(以上)、Window 7 x64(以上)、Mac OS X 10.13.5 x64 (以上)、 Debian 9.8 (x64)以上 Python 版本:3.5/3.6/3.7 Python 依赖: 'numpy == 1.16.3' 'scipy == 1.3.0' 'Pillow == 5.3.0' 'h5py == 2.8.0' 'lmdb == 0.93' 'networkx == 1.11' 'flatbuffers == 1.10', 'protobuf == 3.6.1' 'onnx == 1.4.1' 'onnx-tf == 1.2.1' 'flask == 1.0.2' 'tensorflow == 1.11.0' or 'tensorflow-gpu' 'dill == 0.2.8.2' 'ruamel.yaml == 0.15.81' 'psutils == 5.6.2' 'ply == 3.11' 'requests == 3.11' 'pytorch == 1.2.0' 'mxnet == 1.5.0' PS : Windows 只提供Python3.6的安装包。 MacOS 提供Python3.6和Python3.7的安装包。 ARM64 平台(安装 Debian 9 或 10 操作系统)提供Python3.5(Debain 9)和 Python3.7 (Debian10)的安装包。 除 MacOS 平台外,其他平台的 scipy 依赖为>=1.1.0。 快速上手 测试环境使用"Ubuntu 16.04 x86_64 PC"主机。其他平台可以参考 sdk/external/rknn- toolkit/doc/Rockchip_Quick_Start_RKNN_Toolkit_V1.4.0_XX.pdf。 RKNN-Toolkit 安装 # 安装 python 3.5 sudo apt-get install python3.5 # 安装 pip3 sudo apt-get install python3-pip # 获取 RKNN-Toolkit 安装包,然后执行以下步骤 cd sdk/external/rknn-toolkit/ cp sdk/external/rknn-toolkit ./ -rf cd rknn-toolkit/package/ pip3 install tensorflow==1.11.0 pip3 install mxnet==1.5.0 pip3 install torch==1.2.0 torchvision==0.4.0 pip3 install opencv-python pip3 install gluoncv # 安装 RKNN-Toolkit sudo pip3 install rknn_toolkit-1.4.0-cp35-cp35m-linux_x86_64.whl # 检查是否安装成功,import rknn 库 rk@rk:~/rknn-toolkit-v1.4.0/package$ python3 >>> from rknn.api import RKNN >>> Typec 连接主机和设备运行 demo cd examples/tflite/mobilenet_v1/ daijh@daijh:~/p/sdk/external/rknn-toolkit/examples/tflite/mobilenet_v1$ python3.6 ./test.py --> config model done --> Loading model done --> Building model W The channel_mean_value filed will not be used in the future! done --> Export RKNN model done --> Init runtime environment I NPUTransfer: Starting NPU Transfer Client, Transfer version 2.0.0 (8f9ebbc@2020-04-03T09:12:30) D RKNNAPI: ============================================== D RKNNAPI: RKNN VERSION: D RKNNAPI: API: 1.4.0 (b4a8096 build: 2020-08-12 10:15:19) D RKNNAPI: DRV: 1.5.2 (e67e5cb build: 2020-12-03 15:04:52) D RKNNAPI: ============================================== done --> Running model mobilenet_v1 -----TOP 5----- [156]: 0.8603515625 [155]: 0.0833740234375 [205]: 0.0123443603515625 [284]: 0.00726318359375 [260]: 0.002262115478515625 done --> Begin evaluate model performance W When performing performance evaluation, inputs can be set to None to use fake inputs. ======================================================================== Performance ======================================================================== Total Time(us): 5573 FPS: 179.44 ======================================================================== done daijh@daijh:~/p/sdk/external/rknn-toolkit/examples/tflite/mobilenet_v1$ 除了python接口外,我们也提供了模型推理的C/C++接口,用户可以在 PC 上完 成模型转换再到板子上 使用C/C++完成模型推理。以下是 demo 运行。 # 编译前需要修改好交叉编译器的路径,vim build.sh 修改 GCC_COMPILER # GCC_COMPILER=/home/daijh/p/sdk/prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf # 这里是我本地的 32 位交叉编译工具的路径,用户需要自己修改成 SDK 中交叉编译工具的路径。 daijh@daijh:~$ cd sdk/external/rknpu/rknn/rknn_api/examples/rknn_mobilenet_demo daijh@daijh:sdk/external/rknpu/rknn/rknn_api/examples/rknn_mobilenet_demo$ ./build.sh # 把编译好的 demo 放到设备中 adb push rknn_mobilenet_demo/ / # 运行 demo cd rknn_mobilenet_demo [root@RV1126_RV1109:/rknn_mobilenet_demo]# ./build/rknn_mobilenet_demo ./model/mobilenet_v1_rv1109_rv1126.rknn ./model/dog_224x224.jpg model input num: 1, output num: 1 input tensors: index=0 name= n_dims=4 dims=[1 224 224 3] n_elems=150528 size=150528 fmt=0 type=3 qnt_type=2 fl=127 zp=127 scale=0.007843 output tensors: index=0 name= n_dims=2 dims=[0 0 1 1001] n_elems=1001 size=2002 fmt=0 type=1 qnt_type=0 fl=127 zp=127 scale=0.007843 rknn_run 155 - 0.091736 156 - 0.851074 205 - 0.013588 开发文档 当你安装好"RKNN-Toolkit"并且通过 demo 初步了解和验证了开发流程后,你可 以查看详细的 RKNN 开发 API 去完成自己的开发了。 RKNN-Toolkit 文档:sdk/external/rknn- toolkit/doc C/C++ API 文档:sdk/external/rknpu/rknn/doc