文章目录
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