ONNX(Open Neural Network Exchange)Introduction and Applications

ONNX(Open Neural Network Exchange)是一种开放的深度学习模型交换格式,它类似于JSON格式,但专为深度学习模型设计。ONNX的主要功能和用途包括:


一、ONNX 是什么

ONNX(Open Neural Network Exchange)是一种开放的深度学习模型交换格式,类似于JSON格式。它允许将模型从一个深度学习框架转换到另一个框架,以便在不同的平台和设备上进行部署和推理。ONNX的设计目标是提供一个通用的模型表示,使得模型可以在不同的框架之间无缝转换和使用。

二、ONNX具备哪些功能

模型转换:ONNX可以将不同深度学习框架(如PyTorch、TensorFlow)训练的模型转换为通用的ONNX格式,从而实现模型在不同框架之间的互操作性。

模型推理:ONNX可以加载和运行ONNX格式的模型,实现模型的推理功能。这使得开发者可以在不同的平台和设备上部署和运行模型,包括移动设备、边缘设备和云端服务器。

模型优化:ONNX提供了一些工具和技术,可以对模型进行优化,以提高模型的性能和效率。例如,可以使用ONNX Runtime来加速模型推理,并使用ONNX Graph Optimizer来优化模型的计算图。

模型部署:ONNX可以用于将训练好的模型部署到不同的硬件平台上,包括CPU、GPU和专用加速器。这使得模型可以在不同的设备上高效地运行。

模型扩展:ONNX支持自定义运算符和扩展,可以将自定义的运算符添加到模型中,以满足特定的需求。

2.1 模型转换

跨框架互操作性:ONNX允许将不同深度学习框架(如PyTorch、TensorFlow、Caffe等)训练的模型转换为通用的ONNX格式,从而实现模型在不同框架之间的无缝转换和使用。这大大提高了模型的可移植性和跨平台部署的灵活性。
自定义运算符和扩展:ONNX支持自定义运算符和扩展,可以将自定义的运算符添加到模型中,以满足特定的需求。

2.2 模型推理

跨平台推理引擎:ONNX Runtime是一个跨平台的高性能推理引擎,用于部署ONNX模型。它支持多种硬件加速器,如CPU、GPU和FPGA等,使得开发者可以在不同的硬件平台上高效地运行ONNX模型。
推理功能实现:ONNX可以加载和运行ONNX格式的模型,实现模型的推理功能。这使得开发者可以在不同的平台和设备上部署和运行模型,包括移动设备、边缘设备和云端服务器。

2.3 模型优化

性能提升:ONNX提供了一些优化和加速的工具和技术,如剪枝、量化和融合等,这些操作可以减少模型的大小和计算量,从而提高模型的性能和效率。
计算图优化:ONNX Graph Optimizer等工具可以对模型的计算图进行优化,以进一步提升模型的推理速度。

2.4 模型部署

硬件平台兼容性:ONNX可以用于将训练好的模型部署到不同的硬件平台上,包括CPU、GPU和专用加速器等。这使得模型可以在不同的设备上高效地运行,满足不同场景下的需求。

三、ONNX 的相关概念

模型(Model):ONNX 模型是一个包含了深度学习模型结构和参数的文件。它可以由不同的深度学习框架生成,并且可以在其他框架中加载和执行。ONNX 模型可以包含多个图。

图(Graph):ONNX 图是一个由节点和边组成的有向无环图(DAG)。每个节点代表一个操作,例如卷积、池化或全连接。节点之间的边表示数据的流动。

节点(Node):ONNX 节点是图中的操作单元。每个节点都有输入和输出,它们可以是张量(Tensor)或其他类型的数据。节点的类型由运算符(Operator)定义,例如卷积运算符、池化运算符等。

通过使用 ONNX,可以将一个深度学习模型从一个框架转换到另一个框架,而无需重新训练模型。这样可以提高模型的可移植性和跨平台部署的灵活性。

四、ONNX的应用领域

模型部署和互操作性:由于不同的深度学习框架有各自的模型格式,使用不同框架的模型之间的互操作性存在困难。ONNX提供了一个统一的模型表示方式,使得模型可以在不同框架之间进行转换和部署。

跨平台推理引擎:ONNX Runtime是一个跨平台的高性能推理引擎,用于部署ONNX模型。它支持多种硬件加速器,例如CPU、GPU和FPGA等。通过使用ONNX Runtime,可以在不同的硬件平台上高效地运行ONNX模型。

深度学习模型的迁移和共享:ONNX可以帮助开发者将模型从一个框架迁移到另一个框架,从而充分利用不同框架的优势。同时,ONNX也促进了深度学习模型的共享和交流,使得研究者和开发者可以更方便地共享和使用模型。

深度学习模型的优化和加速:ONNX提供了一些优化和加速的工具和技术,可以帮助开发者提高模型的性能和效率。例如,ONNX可以对模型进行剪枝、量化和融合等优化操作,从而减少模型的大小和计算量。

通过使用ONNX,开发者可以更加灵活地选择和使用深度学习框架,并且可以更好地利用不同框架之间的优势,从而提高模型的性能和效果。

4.1 example1

https://github.com/onnx/models中提供了一系列ONNX格式的pre-trained、state-of-the-art模型,包括图像分类、目标检测、图像分割等。

import numpy as np
import onnx
from onnx import helper, numpy_helper, shape_inference, version_converter
from onnx import AttributeProto, TensorProto, GraphProto
 
# reference: https://github.com/onnx/onnx/blob/main/docs/PythonAPIOverview.md
 
def manipulate_tensorproto_and_numpy_array():
    # create a Numpy array
    numpy_array = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], dtype=float)
    print("Original Numpy array:\n{}\n".format(numpy_array))
 
    # convert the Numpy array to a TensorProto
    tensor = numpy_helper.from_array(numpy_array)
    print("TensorProto:\n{}".format(tensor))
 
    # convert the TensorProto to a Numpy array
    new_array = numpy_helper.to_array(tensor)
    print("After round trip, Numpy array:\n{}\n".format(new_array))
 
    tensorproto_name = "../../data/tensor.pb"
    # save the TensorProto
    with open(tensorproto_name, 'wb') as f:
        f.write(tensor.SerializeToString())
    
    # load a TensorProto
    new_tensor = onnx.TensorProto()
    with open(tensorproto_name, 'rb') as f:
        new_tensor.ParseFromString(f.read())
    print("After saving and loading, new TensorProto:\n{}".format(new_tensor))
 
def run_shape_inference():
    # preprocessing: create a model with two nodes, Y's shape is unknown
    node1 = helper.make_node('Transpose', ['X'], ['Y'], perm=[1, 0, 2])
    node2 = helper.make_node('Transpose', ['Y'], ['Z'], perm=[1, 0, 2])
 
    graph = helper.make_graph(
        [node1, node2],
        'two-transposes',
        [helper.make_tensor_value_info('X', TensorProto.FLOAT, (2, 3, 4))],
        [helper.make_tensor_value_info('Z', TensorProto.FLOAT, (2, 3, 4))],
    )
 
    original_model = helper.make_model(graph, producer_name='onnx-examples-2')
 
    # check the model and print Y's shape information
    onnx.checker.check_model(original_model)
    print("before shape inference, the shape info of Y is:\n{}".format(original_model.graph.value_info))
 
    # apply shape inference on the model
    inferred_model = shape_inference.infer_shapes(original_model)
 
    # check the model and print Y's shape information
    onnx.checker.check_model(inferred_model)
    print("after shape inference, the shape info of Y is:\n{}".format(inferred_model.graph.value_info))
 
def create_save_onnx_model(model_name):
    # create one input(ValueInfoProto)
    X = helper.make_tensor_value_info('X', TensorProto.FLOAT, [3, 2])
    pads = helper.make_tensor_value_info('pads', TensorProto.FLOAT, [1, 4])
    value = helper.make_tensor_value_info('value', AttributeProto.FLOAT, [1])
 
    # create one output(ValueInfoProto)
    Y = helper.make_tensor_value_info('Y', TensorProto.FLOAT, [3, 4])
 
    # create a node(NodeProto): this is based on Pad-11
    node_def = helper.make_node(
        'Pad',                  # name
        ['X', 'pads', 'value'], # inputs
        ['Y'],                  # outputs
        mode='constant',        # attributes
    )
 
    # create the graph(GraphProto)
    graph_def = helper.make_graph(
        [node_def],        # nodes
        'test-model',      # name
        [X, pads, value],  # inputs
        [Y],               # outputs
    )
 
    # create the model(ModelProto)
    model_def = helper.make_model(graph_def, producer_name='onnx-example')
 
    # save the ONNX model
    onnx.save(model_def, model_name)
 
def load_check_onnx_model(model_name):
    # model is an in-memory ModelProto
    model = onnx.load(model_name)
    print("the model is:\n{}".format(model))
 
    # check the model
    try:
        onnx.checker.check_model(model)
    except onnx.checker.ValidationError as e:
        print("the model is invalid: %s" % e)
    else:
        print("the model is valid!")
 
def main():
    manipulate_tensorproto_and_numpy_array()
    run_shape_inference()
 
    model_name = "../../data/example.onnx"
    create_save_onnx_model(model_name)
    load_check_onnx_model(model_name)
 
    print("test finish")
 
if __name__ == "__main__":
    main()

参考自:https://blog.csdn.net/fengbingchun/article/details/125947000

4.2 example2

pytorch转onnx使用C++ onnxuntime加载推理

五、社区支持

开源项目:ONNX是一个社区项目,以开放源代码的方式托管在GitHub上(https://github.com/onnx/onnx),吸引了大量开发者和研究人员的参与和贡献。

版本更新:ONNX不断更新和完善其功能,以适应深度学习领域的发展需求。例如,ONNX的最新发布版本为v1.12.0(截至当前时间,实际版本可能有所更新),提供了更多的特性和优化。

综上所述,ONNX是一种强大的深度学习模型交换格式和工具集,它通过提供跨框架的模型转换、高效的模型推理、灵活的模型优化以及广泛的硬件平台支持等功能,为深度学习模型的开发、部署和应用带来了极大的便利和效益。

六、ONNX创始

ONNX(Open Neural Network Exchange)的创始人是贾扬清。贾扬清在深度学习框架领域有着显著的贡献和积累,他是Caffe之父TensorFlow的作者之一,同时也是PyTorch 1.0的合作领导者。他拥有加州大学伯克利分校计算机科学博士学位、清华大学硕士学位和学士学位。ONNX是他在2017年由微软、Facebook等几个公司联合推出,它定义了一个统一的中间格式,用以存储训练好的模型,从而使得不同的训练框架可以使用相同的中间格式进行交互

Reference

https://github.com/onnx/tutorials

baidu ERNIE(Enhanced Representation through Knowledge Integration) Bot

https://blog.csdn.net/FXSuperLee/article/details/136874133

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猛码Memmat

欢迎支持,随缘打赏 ~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值