Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!

Posted 百度AI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!相关的知识,希望对你有一定的参考价值。


16年前的电影《功夫》可以说是家喻户晓,并将武侠片推向了一个新的高潮。在电影中,街头小混混阿星偶然间被打通了任督二脉,因善开悟,再有“如来神掌”的加持,让他的武功变得登峰造极,最后从天而降,一掌击败了大反派火云邪神。相信不少小伙伴们都因此萌生了武侠梦、功夫梦,梦想自己有一天也能“开挂”,变得天下无敌!


Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!


如果当时做个问卷调查,问获得绝世武功的第一步需要什么?即使很多人说不清楚任脉和督脉的位置,他们仍然会回答——打通任督二脉!Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!


Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!


“只有打通任督二脉,才能加速真气运行效率,从而获得神功”已成为多数少侠们的共同认识。其实,这个道理同样能应用于现实之中。比如,在人工智能领域,开源开放非常普遍,只有打通壁垒,实现互通有无,才能促进发展的效率。


近期,飞桨进入了2.0时代,不仅 API 体系得到了全面升级,动态图模式变得更加完备,为广大开发者带来“动静统一的开发体验”,还集成了最新版的 Paddle2ONNX 工具,进一步提升了框架的开放性。除了原先的 Paddle Inference 和 Paddle Lite 等高性能部署方案外,用户还可以通过使用 paddle.onnx.export 接口,将模型保存为 ONNX 协议格式后进行部署,极大丰富了飞桨的软硬件部署生态!Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!


https://github.com/PaddlePaddle/Paddle2ONNX


 什么是 ONNX 


ONNX(Open Neural Network Exchange)是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架,可以采用相同格式存储模型数据并交互。


Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!


简而言之,ONNX 相当于是一套统一的深度学习模型格式。基于这一套统一的格式,很多厂商的硬件和软件天然支持运行 ONNX 格式的模型。


关注飞桨的用户此前就应该了解到,Paddle Lite 不仅可以支持飞桨原生模型部署,同时也支持 PyTorch 模型的部署,其技术路径就是通过 PyTorch 导出 ONNX 格式模型,再通过 X2Paddle 转换为飞桨模型格式进行部署。


不了解的童鞋快戳链接,了解 X2Paddle 项目:

https://github.com/PaddlePaddle/X2Paddle


 什么是 Paddle2ONNX 


飞桨作为国内最早开源的开源框架,在过去一年中技术生态迅猛发展,为开源社区贡献多个模型套件。其中,目标检测模型套件推出产业实践最优模型 PP-YOLO,性能和精度都超过原生的 YOLO-V4;在文字识别方向,PP-OCR 在2020年一经开源,便吸引了大量开发者使用,多次登陆 GitHub 技术趋势榜;另外,在多个国际权威语义评测中获得冠军的预训练模型 ERNIE,也升级至2.0。飞桨进步,永不止步。为了帮助开发同学解决部署环境难题,飞桨也在不断探索。


现在,飞桨与 ONNX 开源组织进行了合作,开源了 Paddle2ONNX 项目,并基于 Paddle2ONNX 与英特尔合作,打通了飞桨模型在 OpenVINO 上的部署推理。


本月,我们将发布 Paddle2ONNX 最新版本 V0.5,带来更多重磅功能,覆盖更多飞桨官方模型,期望通过 ONNX 这个桥梁,进一步推动飞桨、开发者和软硬件厂商的合作!


Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!
  ONNX 的桥梁作用

‍‍‍‍‍‍‍‍‍‍‍  Paddle2ONNX 项目升级解读 

基于飞桨框架2.0,新版本的 Paddle2ONNX 主要新增实现了以下重要功能。

  1. 支持基于飞桨框架2.0导出动态图模型


在飞桨框架升级2.0后,框架已经内置 paddle.onnx.export 接口,用户在代码中可以调用接口以 ONNX 协议格式保存模型。此外,用户已经保存的飞桨模型,也可以通过 Paddle2ONNX 加载后进行转换。本文的使用教程部分,会附有针对动态图和静态图模型的转换方法,以供大家参考体验。


  1. 更丰富的 Paddle OP 覆盖


新版本的 Paddle2ONNX 支持多达88个 Paddle OP 算子。在转换过程中,支持用户指定转换为 ONNX 1到12任意版本的模型,提升模型的适配能力。


  1. 支持转换飞桨 CV、NLP 领域的主流模型


覆盖 CV 和 NLP 领域主流模型,不仅支持 PP-YOLO 这样模型新星的转换,还开始支持 ERNIE 这样 NLP 领域的王牌!它们均已支持转为 ONNX 进行部署,有需求的同学快去试试吧!Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!


此前就有部分用户咨询飞桨小哥哥:飞桨 PP-YOLO、ERNIE 等明星模型,能不能用 ONNX 方式来部署?现在小哥哥现身回答你!


Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!


 Paddle2ONNX 使用教程 


本教程将向大家展示如何将飞桨官方内置的 MobileNetV2 动态图模型,导出为 ONNX 格式的模型,并使用 ONNXRunTime 工具验证模型的正确性。


 将动态图模型导出为 ONNX 模型 


使用飞桨框架2.0构建的动态图模型,可以通过调用 paddle.onnx.export 接口,实现 ONNX 模型的快速导出。


import os
import time
import paddle
# 从模型代码中导入模型
from paddle.vision.models import mobilenet_v2
# 实例化模型
model = mobilenet_v2()
# 将模型设置为推理状态
model.eval()
# 定义输入数据
input_spec = paddle.static.InputSpec(shape=[None3320320], dtype='float32', name='image')
# ONNX模型导出
# enable_onnx_checker设置为True,表示使用官方ONNX工具包来check模型的正确性,需要安装ONNX(pip install onnx)
paddle.onnx.export(model, 'mobilenet_v2', input_spec=[input_spec], opset_version=12, enable_onnx_checker=True)

执行结果:
2021-01-26 10:52:13 [INFO]    ONNX model genarated is valid.
2021-01-26 10:52:13 [INFO]    ONNX model saved in mobilenet_v2.onnx


我们可以看到模型成功转换保存为 ONNX 格式文件——mobilenet_v2.onnx。


 将静态图模型导出为 ONNX 模型 


通过命令行调用 paddle2onnx 命令可完成静态图模型的转换。


      
        
        
      

# Paddle动态图保存为静态图
paddle.jit.save(model, 'inference/model', input_spec=[input_spec])
# 调用paddle2onnx命令
!paddle2onnx 
--model_dir inference 
--model_filename model.pdmodel
--params_filename model.pdiparams 
--save_file mobilenet_v2.onnx 
--opset_version 12

执行结果:
2021-01-26 10:53:29 [INFO]    ONNX model saved in mobilenet_v2.onnxnx


与动态图相似,模型同样会被保存为 ONNX 格式的文件。

 模型测试 

这里使用 ONNXRunTime 来进行 ONNX 模型验证测试,并评估转换后推理结果的误差。


# 动态图导出的ONNX模型测试
import time
import numpy as np
from onnxruntime import InferenceSession
# 加载ONNX模型
sess = InferenceSession('mobilenet_v2.onnx')
# 准备输入
x = np.random.random((13320320)).astype('float32')
# 模型预测
start = time.time()
ort_outs = sess.run(output_names=None, input_feed={'image': x})
end = time.time()
print("Exported model has been predicted by ONNXRuntime!")
print('ONNXRuntime predict time: %.04f s' % (end - start))
# 对比ONNX Runtime 和 飞桨的结果
paddle_outs = model(paddle.to_tensor(x))
diff = ort_outs[0] - paddle_outs.numpy()
max_abs_diff = np.fabs(diff).max()
if max_abs_diff < 1e-05:
    print("The difference of results between ONNXRuntime and Paddle looks good!")
else:
    relative_diff = max_abs_diff / np.fabs(paddle_outs.numpy()).max()
    if relative_diff < 1e-05:
        print("The difference of results between ONNXRuntime and Paddle looks good!")
    else:
        print("The difference of results between ONNXRuntime and Paddle looks bad!")
print('relative_diff: ', relative_diff)
print('max_abs_diff: ', max_abs_diff)

执行结果:
Exported model has been predicted by ONNXRuntime!
ONNXRuntime predict time0.0260 s
The difference of results between ONNXRuntime and Paddle looks good!
max_abs_diff:  4.2632564e-13


https://aistudio.baidu.com/aistudio/projectdetail/1461212


除了上面的例子外,还有更多使用和了解 Paddle2ONNX 的方式:


  • PaddleX 基于 Paddle2ONNX 的 OpenVINO 部署方案:


    https://paddlex.readthedocs.io/zh_CN/develop/deploy/openvino/index.html


  • 飞桨官网导出 ONNX 模型协议教程:


    https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/02_paddle2.0_develop/09_model_to_onnx_cn.html


  • 手把手教你通过 ONNX 部署飞桨模型教程:


    https://aistudio.baidu.com/aistudio/projectdetail/1479970


  • https://github.com/PaddlePaddle/Paddle2ONNX

欢迎给项目 Star,支持项目工程师的工作!


未来,Paddle2ONNX 还将支持更多的模型,如果您有相关的需求,欢迎加入官方群与我们交流。



如扫码失败
请加微信 AIDigest
备注“模型”,飞桨小哥哥拉你入群

如果您想详细了解 更多飞桨的相关内容
请参阅以下文档

飞桨官网地址:
https://www.paddlepaddle.org.cn/

飞桨开源框架项目地址:
GitHub: https://github.com/PaddlePaddle/Paddle 
Gitee: https://gitee.com/paddlepaddle/Paddle

以上是关于Paddle2ONNX最新升级:飞桨模型全面支持ONNX格式啦!的主要内容,如果未能解决你的问题,请参考以下文章

WAVE SUMMIT+2022飞桨平台新升级 全面支撑大模型研发与产业化

WAVE SUMMIT+2022飞桨平台新升级 全面支撑大模型研发与产业化

飞桨PaddlePaddle最新升级:更低门槛使用深度学习

飞桨动态图重大升级,全面提升灵活性易用性

百度飞桨(PaddlePaddle)分布式训练在Volcano系统上的实践

飞桨最新升级汇总 (附赠AI产业应用技术方案和学习资料大礼包)