ONNX/RKNN模型转换与部署流程
智慧云天AI边缘盒子和AI算法摄像机均采用瑞芯微RK的NPU方案。下面我们介绍下RK的NPU算法模型RKNN:
1、RKNPU简介
NPU(Nerual Processing Unit)是一种专门用于加速神经网络计算的处理器。为了满足人工智能的需求,瑞芯微逐渐将NPU集成到其处理器中,这种内置于瑞芯微处理器的NPU被称为RKNPU。智慧云天AI盒子搭载了RK3588芯片和RK RV1126,内置瑞芯微自研第4代NPU。该NPU具有高运算精度,支持int4、int8、int16混合量化。
RKNN-Toolkit2 工具在 PC 平台上提供 C 或 Python 接口,简化模型的部署和运行。用户可以通过该工具轻松完成以下功能:模型转换、量化、推理、性能和内存评估、量化精度分析以及模型加密。RKNN 软件栈可以帮助用户快速的将 AI 模型部署到 Rockchip 芯片。整体的框架如图:
为了使用 RKNPU,我们需要首先在计算机上运行 RKNN-Toolkit2 工具,将训练好的ONNX模型转换为 RKNN 格式模型,之后使用 RKNN C API 或 Python API 在AI盒子或AI摄像机的主板上进行部署。
2、ONNX模型
ONNX(Open Neural Network Exchange),开放神经网络交换,是一种模型IR,用于在各种深度学习训练和推理框架转换的一个中间表示格式,支持多种深度学习框架,包括 TensorFlow、PyTorch、Caffe 等。将模型转换为 ONNX 格式后,可以更容易地在不同的深度学习框架中进行部署和推理,而无需重新训练模型。
在实际业务中,可以使用Pytorch或者TensorFlow训练模型,导出成ONNX格式,然后在转换成目标设备上支撑的模型格式,比如TensorRT Engine、NCNN、MNN、RKNN等格式。ONNX定义了一组和环境,平台均无关的标准格式,来增强各种AI模型的可交互性,开放性较强。ONNX 文件不仅储存了神经网络模型的权重,也储存了模型的结构信息以及网络中每一层的输入输出等信息,可以使用 Netron 中进行查看,方便后续开发工作的模型调整。根据模型的不同可以从github获取不同的基础训练代码,一般根据.pth 权重文件,选择以 mobilenet 作为骨干网络的权重文件导出为 .onnx 格式。
模型调整:
使用 Netron 工具查看 ONNX 模型的结构,确定是否存在 RK3588/RV1126 暂时无法支持的操作符(如Layer Normalization) 。如果不支持的操作符位于模型的最后几层,可以考虑使用 CPU 进行实现。
3、转换为RKNN模型
使用瑞芯微的RKNN-Toolkit2将ONNX模型转换为RKNN模型。
l onnx 模型地址:训练导出的 onnx
l 训练集地址:作为模型转换的参考,将图片的储存地址写在 txt 文件中作为参数导入到转换文件中。
l 导出模型地址:导出的 rknn 模型名称与地址,注意要以 .rknn 为后缀
l 模型类型:根据转换模型的类型会提供不同的 rknn 预处理设置
模型验证:
输出的 rknn 模型内部结构无法被 Netron 工具解析,但是可以查看输入输出的基本信息进行初步判断。
应用设计:
进行AI模型推理的应用流程
编译运行:
先在PC端进行编译环境(RK3588/RV1126的不同交叉编译链),然后进行编译。生成执行文件、model模型文件和lib库文件。整体拷贝到AI盒子/AI摄像机端进行,给与权限后(chmod),即可以运行测试了。