热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将飞桨模型部署在RV1126上

虽然2020年的时候,飞桨与瑞芯微Rockchip旗下AI芯片RK1808、RK1806正式完成适配,充分兼容飞桨轻量化推理引擎PaddleLite。但

虽然2020年的时候,飞桨与瑞芯微Rockchip旗下AI芯片RK1808、RK1806正式完成适配,充分兼容飞桨轻量化推理引擎Paddle Lite。但那个时候用起来还是很难。两年之后,再来看这部分,感觉提升的部分很有限,但是思路还是清晰了不少。
瑞芯微对于隔壁的TF和Pytorch的支持其实是比飞桨更完备的,这其中有一部分历史原因,但是随着飞桨的不断发展,之后瑞芯微肯定会对飞桨有更好的支持。
现在想在瑞芯微的板子上跑起飞桨的模型,还是需要先转成onnx,再转成rknn这条道路。

一、飞桨模型的导出

这里我简单使用paddle.vision下的模型做例子。

import paddle
from paddle.vision.models import mobilenet_v1model = mobilenet_v1(pretrained=True)
# 默认的模型是没有softmax层的,当然在这个结果中找topk也是没有问题的,只是我比较习惯看softmax后的值,所以在此添加一层。
model.fc = paddle.nn.Sequential(model.fc, paddle.nn.Softmax())print(model)

from paddle.static import InputSpecmodel.eval()
x = InputSpec(shape=[None, 3, 224, 224], dtype='float32', name='x')net = paddle.jit.save(model, path="test", input_spec=[x])

这个时候,会生成三个文件“test.pdiparams”,“test.pdmodel”和“test.pdiparams.info”。前两个是我们要再下一步中使用的。

二、安装paddle2onnx并将模型转为onnx

这里就直接使用pip安装了,具体的使用方法,可以参考
https://github.com/PaddlePaddle/Paddle2ONNX

!pip install paddle2onnx -i https://mirror.baidu.com/pypi/simple
!paddle2onnx --version
!paddle2onnx --model_dir . --model_filename test.pdmodel --params_filename test.pdiparams --save_file test.onnx --enable_dev_version True

Looking in indexes: https://mirror.baidu.com/pypi/simple
Requirement already satisfied: paddle2onnx in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (0.9.8)[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m A new release of pip available: [0m[31;49m22.1.2[0m[39;49m -> [0m[32;49m22.2.1[0m
[1m[[0m[34;49mnotice[0m[1;39;49m][0m[39;49m To update, run: [0m[32;49mpip install --upgrade pip[0m
2022-08-02 00:06:33 [INFO] paddle2onnx-0.9.8 with python>=3.6, paddlepaddle>=2.0.0
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: ./test.pdmodel
[Paddle2ONNX] Paramters file path: ./test.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 9 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
2022-08-02 00:06:33 [INFO] ===============Make PaddlePaddle Better!================
2022-08-02 00:06:33 [INFO] A little survey: https://iwenjuan.baidu.com/?code=r8hu2s

如果,你厌倦(突然来点翻译腔?)了上面两个步骤,咳咳,其实可以直接通过下面这段代码来获得onnx模型,现在paddle自带了onnx的导出(但是貌似还是要先安装paddle2onnx,阿这…)

from paddle.static import InputSpecsave_path = 'test'
x = InputSpec([None, 3, 224, 224], 'float32', 'x')
paddle.onnx.export(model, save_path, input_spec=[x])

2022-08-03 10:01:54 [INFO] Static PaddlePaddle model saved in paddle_model_static_onnx_temp_dir.
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: paddle_model_static_onnx_temp_dir/model.pdmodel
[Paddle2ONNX] Paramters file path: paddle_model_static_onnx_temp_dir/model.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 9 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
2022-08-03 10:01:55 [INFO] ONNX model saved in test.onnx.

如果对自己转出来的模型感兴趣或者想看具体的结构,可以通过https://netron.app/ 来查看自己转出来的模型。效果大致是这个样子:
在这里插入图片描述

当然,你也可以通过下面的代码直接校验你的onnx模型。主要包括两个方面,一是算子是否符合对应版本的协议,二是网络结构是否完整。

!pip install onnx -i https://mirror.baidu.com/pypi/simpleimport onnxonnx_file = 'test.onnx'
onnx_model = onnx.load(onnx_file)
onnx.checker.check_model(onnx_model)
print('The model is checked!')

The model is checked!

在传出onnx后,下一步则是转为rknn模型。

三、使用rknn-toolkit,将onnx转成rknn格式

rknn-toolkit的地址如下,
https://github.com/rockchip-linux/rknn-toolkit

正如其readme中所说:RKNN-Toolkit is a software development kit for users to perform model conversion, inference and performance evaluation on PC, RK3399Pro(D), RK1806, RK1808, RV1109, RV1126.
其支持的板子写的很明确,如果你是rk3588之类的板子,则不在是使用这个仓库了。
至于这个rknn_toolkit的安装,是一件比较坑的事,它对于linux提供的版本有限,看了一眼aistudio的环境,竟然还装不上…(此处无语三秒钟)
那就在本地完成下述操作吧:

3.1 按照仓库中的指引,安装好rknn_toolkit这个库


3.2 转换代码

from ast import arg
from rknn.api import RKNN
import os
import argparsedef ONNX2RKNN(args):rknn = RKNN(verbose=True)rknn.config(batch_size=4, mean_values=[[0.485, 0.456, 0.406]], std_values=[[0.229, 0.224, 0.225]], reorder_channel='0 1 2', target_platform='rv1126')ret = rknn.load_onnx(args.model, inputs=['x'], input_size_list=[[3, 224, 224]], outputs=['softmax_5.tmp_0'])rknn.build(do_quantization=True, dataset="PATH_TO_YOUR_DATA.TXT", pre_compile=True)if args.output is None:export_rknn_model_path = args.model[:-4] + "rknn"else:export_rknn_model_path = args.outputrknn.export_rknn(export_path=export_rknn_model_path)rknn.release()if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument("--model", type=str, required=True)parser.add_argument("--output", type=str, default=None)args = parser.parse_args()ONNX2RKNN(args)

3.3 代码解释:

rknn.load_onnx中的x与softmax_5.tmp_0是我通过netron查看后添加的,实际上这两个参数不写应该也没问题,这里写了其实是想告诉大家对于多个输入时可以指定对应的归一化方式。

rknn.build那里可以选择不量化,而pre_compile部分则是相当于是一个小小的加速,不然的话,在实际跑的时候,会发现光是加载模型就要花十几秒甚至几十秒的时间。

四、通过可视化工具,从onnx转到rknn

如果你安装好了rknn_toolkit,那么可以通过

python -m rknn.bin.visualization

的方式,打开rknn的可视化模型转换工具。(可以看到它对隔壁的模型支持得挺好的,哈哈哈)

在这里插入图片描述

基本很傻瓜,只要理解上面的代码,就可以通过填空/选择的方式完成转换模型。

五、效果展示

使用rknn_toolkit中提供的mobilenet的例子(其实对于大多数的分类模型都可以使用这个历程,只是一个input-output的过程,至于后处理,这里一般也没有。)
运行的结果大致如下
在这里插入图片描述

总结

简单介绍了从飞桨模型转换到ONNX再RKNN模型的过程,展示了两种转换方法,之后会进一步介绍模型在瑞芯微板子上的运行以及对比。


搬运自:https://aistudio.baidu.com/aistudio/projectdetail/4393532


推荐阅读
  • 本文详细介绍了在Windows操作系统上使用Python 3.8.5编译支持CUDA 11和cuDNN 8.0.2的TensorFlow 2.3的步骤。文章不仅提供了详细的编译指南,还分享了编译后的文件下载链接,方便用户快速获取所需资源。此外,文中还涵盖了常见的编译问题及其解决方案,确保用户能够顺利进行编译和安装。 ... [详细]
  • 掌握 esrally 三步骤:高效执行 Elasticsearch 性能测试任务
    自从上次发布 esrally 教程已近两个月,期间不断有用户咨询使用过程中遇到的各种问题,尤其是由于测试数据托管在海外 AWS 上,导致下载速度极慢。为此,本文将详细介绍如何通过三个关键步骤高效执行 Elasticsearch 性能测试任务,帮助用户解决常见问题并提升测试效率。 ... [详细]
  • 使用JDOM与DOM4J高效解析XML节点名称及值
    1、用JDOM解析节点名和节点值1、创建一个SAXBuilder对象2、创建一个输入流,将xml文件加载到文件中3.通过saxBuilder的方法,将输 ... [详细]
  • 保姆级使用PyTorch训练与评估自己的HorNet网络教程
    文章目录前言0.环境搭建&快速开始1.数据集制作1.1标签文件制作1.2数据集划分1.3数据集信息文件制作2.修改参数文件3.训练4.评估5.其他教程前言项目地址: ... [详细]
  • 本文介绍了如何在 PyCharm 中高效利用 Anaconda 管理项目环境配置。首先,确保已安装必要的软件。以 Windows 10 64位专业版为例,建议使用 PyCharm 2018.2 或更高版本。通过 Anaconda 创建和管理虚拟环境,可以显著提升开发效率,确保项目依赖的一致性和隔离性。文章详细阐述了从安装到配置的每一步操作,帮助开发者快速上手并充分利用这些工具的优势。 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 首篇待优化改进的文章
    本文介绍了多种常用的矩阵类型及其生成方法,包括单位矩阵、全零矩阵、全1矩阵以及均匀分布的随机矩阵。此外,还探讨了生成随机Markov矩阵的技术,并详细解释了线性等分向量和对数等分向量的构建方式,以及矩阵对数运算的应用。这些内容为数值计算和数据处理提供了坚实的基础。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • OpenCV 2.4.9 源码解析:级联分类器的错误率与尺寸分析 ... [详细]
  • 1.如何进行迁移 使用Pytorch写的模型: 对模型和相应的数据使用.cuda()处理。通过这种方式,我们就可以将内存中的数据复制到GPU的显存中去。 ... [详细]
  • DNNBrain:北师大团队出品,国内首款用于映射深层神经网络到大脑的统一工具箱...
    导读深度神经网络(DNN)通过端到端的深度学习策略在许多具有挑战性的任务上达到了人类水平的性能。深度学习产生了具有多层抽象层次的数据表示;然而,它没有明确地提供任何关 ... [详细]
  • 1,数据组织:训练验证数据生成:pythoncreate_data.pynuscenes_data_prep--data_pathNU ... [详细]
  • 基于Python PaddleSpeech实现语音文字处理
    基于Python PaddleSpeech实现语音文字处理-目录前言环境安装项目验证tts语音合成asr语音识别标点恢复总结前言这段时间一直在研究飞浆平台,最近试了试PaddleS ... [详细]
author-avatar
Jesus_kk
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有