TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下

作者:韩信子@ShowMeAI
深度学习实战系列:https://www.showmeai.tech/tutorials/42
本文地址:https://www.showmeai.tech/article-detail/319
声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI查看更多精彩内容

当今的很多AI算法落地,我们都需要依赖特定的机器学习框架,现在比较热门的 AI 工具库如 TensorFlow 和 PyTorch 都出自大厂,并且有很好的生态和资源,借助它们我们可以很快速完成典型的一些任务,如图像分类或自然语言处理。
然而,工具库和工具库之间的相互切换,是一件很麻烦的事情,比如某公司团队开发主要使用TensorFlow,然而现在有一个深度算法,需要使用 caffe2 部署在移动设备上,那我们需要用 caffe2 重写模型重新训练,这是一个非常耗时耗力的过程。
ONNX 便应运而生,TensorFlow、Caffe2、PyTorch、paddlepaddle、Microsoft Cognitive Toolkit、Apache MXNet 等主流框架都对 ONNX 有着不同程度的支持。这就便于了我们的算法及模型在不同的框架之间的迁移。

ONNX(Open Neural Network Exchange)是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型。它使得不同的人工智能框架(如PyTorch,TensorRT,MXNet)可以采用相同格式存储模型数据并交互。 ONNX的规范及代码主要由微软,亚马逊 ,Facebook 和 IBM 等公司共同开发,以开放源代码的方式托管在Github上。
ONNX 官方资源
- ONNX 官方网站:https://onnx.ai/

- ONNX 官方Github地址:https://github.com/onnx/onnx

- 支持的工具库:

为什么需要ONNX
机器学习/深度学习的出现和蓬勃发展的背景下,深度学习/机器学习模型训练与执行的框架/库的数量呈指数级增长。有两大原因促成这个增长:
- 硬件供应商开发了自己的框架以实现垂直集成并使其更容易为他们的硬件开发模型
- 开发自己的框架以针对特定用例实现最佳性能的软件供应商

深度学习框架数量的激增导致整个AI生态系统碎片化,也使跨框架或硬件生态系统的工作变得困难。ONNX 的诞生是为了消除框架之间以及不同硬件生态系统之间互操作性的障碍。
什么是ONNX
ONNX 是一个开放规范,包含以下定义:
计算图模型存储文件格式
模型:是一个保存版本信息和元数据的非循环计算数据流图。
图:包含模型中数据流图的名称、形成图的计算节点列表、图的输入和输出。
计算节点:图中的每个计算节点都接受零个或多个 定义类型、一个或多个定义类型的输出以及特定节点对其输入执行的操作类型。

标准数据类型
ONNX 作为标准支持以下数据类型列表:
张量类型:
- Int8、Int16、Int32、Int64
- Quantized Int
- uint8, uint16, uint32, uint64
- Float16, float, double
- Bool
- String
- Complex64, complex128
非张量类型:
- Sequence
- Map
- Operators (Built-in/ Custom)
算子/运算符
ONNX Graph 中的每个计算节点都执行特定的操作并产生一个或多个输出。 ONNX 标准定义了 运算符,ONNX图支持的运算符列表也在不断拓展,并通过 ONNX Opsets 保持最新状态。每次 ONNX Opset 更新都可能新增算子支持或改进现有算子。
ONNX的目标
ONNX 的核心设计理念是:
- 互操作性
- 可移植性

如上图所示,ONNX 希望通过提供一个高效的接口将模型从一个框架转换到另一个框架,从而成为不同框架之间的中介。
下表中列出了将模型从一些最常见的AI框架转换为 ONNX 格式的工具。

ONNX实现与现状
实际上,要满足将模型从任何其他AI框架转换为ONNX一直是一个挑战。主要障碍之一是这些AI框架生态的高速发展与每次版本迭代带来的新支持(例如算子等)。
模型从一个框架到另一个框架的转换归结为能够表示原始模型的基础数学运算。下图显示了每个框架中定义的运算符数量。实际上,目前ONNX仅支持PyTorch所有算子的约13% ,一些使用低频 PyTorch 运算符构建的模型在转换时还是有困难。

不过像PyTorch这样的工具库里,包含的很多运算符有这一样或者类似的功能,是否需要完全同步支持也是一个问题。但ONNX开放了自定义运算符的功能,使得用户可以 根据需要添加自己的功能。
即使目前 ONNX 还做不到完全支持和自由衔接所有AI工具框架,但凭借丰富的运算符集,ONNX已经可以描述来自各种框架的大多数 DNN 和 ML 模型。它的『函数』功能,使得用户可以把暂时不支持的复杂的操作符用更原始的操作符来表达 。
它带来了AI生态的自由流通,随着生态和社区的高速发展,相信在未来ONNX会成为AI生态中最终的桥梁之一,发挥巨大的作用。
参考资料
- ONNX 官方网站:https://onnx.ai/
- ONNX 官方Github地址:https://github.com/onnx/onnx
TensorFlow?PyTorch?Paddle?AI工具库生态之争:ONNX将一统天下的更多相关文章
- tensorflow/pytorch/mxnet的pip安装,非源代码编译,基于cuda10/cudnn7.4.1/ubuntu18.04.md
os安装 目前对tensorflow和cuda支持最好的是ubuntu的18.04 ,16.04这种lts,推荐使用18.04版本.非lts的版本一般不推荐. Windows倒是也能用来装深度GPU环 ...
- 五个常见 AI 开发库
上一篇文章已经写过了,人工智能的发展不可谓不曲折,三起两落,不同的历史阶段,主流的研究方法不一样,开始时的 if-else 结构,简单的逻辑判断字符串匹配,到后期的穷举计算等,慢慢发展到现在的大数据与 ...
- Java第三方工具库/包汇总
一.科学计算或矩阵运算库 科学计算包: JMathLib是一个用于计算复杂数学表达式并能够图形化显示计算结果的Java开源类库.它是Matlab.Octave.FreeMat.Scilab的一个克隆, ...
- 整理自己的.net工具库
前言 今天我会把自己平日整理的工具库给开放出来,提供给有需要的朋友,如果有朋友平常也在积累欢迎提意见,我会乐意采纳并补充完整.按照惯例在文章结尾给出地址^_^. 之前我开放其他源码的时候(Framew ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- transformer多头注意力的不同框架实现(tensorflow+pytorch)
多头注意力可以用以下一张图描述: 1.使用pytorch自带的库的实现 torch.nn.MultiheadAttention(embed_dim, num_heads, dropout=0.0, b ...
- 手把手教你使用Rollup打包📦并发布自己的工具库🔧
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师. 官方网站:devui.design Ng组件库:ng-devui(欢 ...
- 使用 js 实现一个中文自动转换成拼音的工具库
使用 js 实现一个中文自动转换成拼音的工具库 中文 => zhong-wen 应用场景 SEO 友好, URL 自动转换 blogs 发布文章,自动化部署,自动生成 url 的 path (时 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...
随机推荐
- Android Studio 模拟器(AVD)访问互联网
模拟器默认是不可以直接访问互联网的,需要为模拟器配置 DNS 服务器. (一)找到模拟器安装的位置 模拟器安装位置在安卓 SDK 下面,进入[SDK Path]/emulator. (二)打开终端输入 ...
- CSS 选择器(一):属性选择器
属性选择器的介绍 属性选择器顾名思义就是通过标签的属性来查找标签的选择器.让我们来回忆一下标签的属性是什么?HTML5 的所有标签共同拥有的属性叫作全局属性,除此之外还有标签自己拥有的属性,就叫作私有 ...
- q 短引用标签
<q/>标签可以使一段文本作为引用. <p>他说:<q>明天要下雨</q>.</p> 注意,源代码中并没有为这段文字添加引用符号,而是添加了 ...
- 在 C# 中使用 Span<T> 和 Memory<T> 编写高性能代码
目录 在 C# 中使用 Span 和 Memory 编写高性能代码 .NET 中支持的内存类型 .NET Core 2.1 中新增的类型 访问连续内存: Span 和 Memory Span 介绍 C ...
- C#基础_枚举
一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. ...
- 手写tomcat——编写一个提供servlet能力的 http服务器
点击查看代码 package com.grady.diytomcat; import com.grady.diytomcat.handler.RequestHandler; import org.do ...
- Grafana Mimir:支持乱序的指标采集
Grafana Mimir:支持乱序的指标采集 译自:New in Grafana Mimir: Introducing out-of-order sample ingestion 很早之前在使用th ...
- .Net 7内容汇总(2)--原始字符串
在C# 11里,添加了一个叫原始字符串的东西. 这个东西算是我相当喜欢以及期待的功能. 我们先来看看这玩意咋用. 首先,我们先来看看之前如果我们需要定义一个带引号的字符串我们需要怎么做. var a ...
- 点赞和取消点赞实现Redis缓存(只思路)
思路:点赞.取消点赞 --> Redis --> (每两个小时)存到数据库(MySQL),所以就相当于每次查询或者存储都需要先经过Redis,而查询的目的是为了判断用户的点赞状态(已点赞o ...
- vue3 的 ref、isRef、toRef、toRefs、toRaw 详细介绍
ref.isRef.toRef.toRefs.toRaw 看着一堆类似的东西,一个头两个大,今天整理一篇文章详细介绍它们的功能及区别. 1.ref ref 属性除了能够获取元素外,也可以使用 ref ...