😉ONNX中的各类Proto

中间表示 —— ONNX

在介绍 ONNX 之前,我们先从本质上来认识一下神经网络的结构。神经网络实际上只是描述了数据计算的过程,其结构可以用计算图表示。比如 a+b 可以用下面的计算图来表示:

为了加速计算,一些框架会使用对神经网络“先编译,后执行”的静态图来描述网络。静态图的缺点是难以描述控制流(比如 if-else 分支语句和 for 循环语句),直接对其引入控制语句会导致产生不同的计算图。比如循环执行 n 次 a=a+b,对于不同的 n,会生成不同的计算图:

ONNX (Open Neural Network Exchange)是 Facebook 和微软在2017年共同发布的,用于标准描述计算图的一种格式。目前,在数家机构的共同维护下,ONNX 已经对接了多种深度学习框架和多种推理引擎。因此,ONNX 被当成了深度学习框架到推理引擎的桥梁,就像编译器的中间语言一样。由于各框架兼容性不一,我们通常只用 ONNX 表示更容易部署的静态图。

各类Proto

ONNX是一种神经网络的格式,采用Protobuf二进制形式进行序列化模型。 Protobuf会根据用于定义的数据结构来进行序列化存储 同理,我们可以根据官方提供的数据结构信息,去修改或者创建onnx。

onnx的各类proto的定义需要看官方文档(https://github.com/onnx/onnx/tree/main) 。这里面的onnx/onnx.in.proto定义了所有onnx的Proto。有关onnx的IR(intermediate representation)信息,看这里(https://github.com/onnx/onnx/blob/main/docs/IR.md)

理解onnx中的组织结构

  • ModelProto(描述的是整个模型的信息)

  • GraphProto(描述的是整个网络的信息)

  • NodeProto (描述的是各个计算节点,比如conv, linear)

  • TensorProto (描述的是tensor的信息,主要包括权重)

  • ValueInfoProto (描述的是input/output信息)

  • AttributeProto (描述的是node节点的各种属性信息)

onnx中的ValueInfoProto

一般用来定义网络的input/output ,会根据input/outputtype来附加属性

onnx中的TensorProto

一般用来定义一个权重,比如convwbdimsrepeated类型,意味着是数组,raw_databytes类型。

onnx中的NodeProto

一般用来定义一个计算节点,比如conv, linear inputrepeated类型,意味着是数组,outputrepeated类型,意味着是数组,attribute有一个自己的Protoop_type需要严格根据onnx所提供的Operators写。

onnx中的AttributeProto

一般用来定义一个node的属性。比如说kernel size,比较常见的方式就是把(key, value)传入Proto,之后 name = key ,i = value

onnx中的GraphProto

一般用来定义模型的全局信息,比如opsetgraph并不是repeated,所以一个model对应一个graph

ONNX提供了一些很方便的api来创建ONNXonnx.helper.make_tensor onnx.helper.make_tensor_value_infoonnx.helper.make_attribute onnx.helper.make_nodeonnx.helper.make_graphonnx.helper.make_model

使用API构建ONNX模型(from scratch)

  • example 1

  • example 2

虽然onnx官方提供了而一些python API来修改onnx,但是推荐大家使用TensorRT下的onnxsurgeon,更加方便快捷。

  • example 3

reference

Last updated

Was this helpful?