部署和MLOps:ONNX 模型
是一种用于表示深度学习模型的开放格式,可实现模型互操作性和不同框架之间的共享,例如PyTorch、TensorFlow和Caffe2。ONNX还支持从 Python、C++、C# 和 Java 等不同语言导出和导入模型,使使用各种编程语言的开发人员可以轻松地与其他社区成员共享和使用模型。ONNX或是一种用于深度学习模型的开源格式。它允许在 PyTorch、TensorFlow 和 Caffe2 等
概述
ONNX(Open Neural Network Exchange)是一种用于表示深度学习模型的开放格式,可实现模型互操作性和不同框架之间的共享,例如PyTorch、TensorFlow和Caffe2。
ONNX 还支持从 Python、C++、C# 和 Java 等不同语言导出和导入模型,使使用各种编程语言的开发人员可以轻松地与其他社区成员共享和使用模型。
介绍
ONNX 或 Open Neural Network Exchange 是一种用于深度学习模型的开源格式。它允许在 PyTorch、TensorFlow 和 Caffe2 等深度学习框架之间无缝互换和共享模型。
ONNX 允许开发人员在不同框架之间移动模型,只需最少的重新训练,而无需重写整个模型。这使得使用各种硬件平台(如 GPU 和 TPU)优化和加速模型变得更加容易,并允许研究人员使用通用格式与他人共享他们的模型。
ONNX 还提供了用于处理 ONNX 格式模型的工具,包括 ONNX Runtime(用于执行模型的高性能推理引擎)和 ONNX Converter(我们可以使用它在不同框架之间转换模型)。
ONNX是一个积极开发的项目,由Microsoft,Facebook和AI社区中的其他公司贡献。它受到各种深度学习框架、库和硬件合作伙伴的支持,如英伟达、英特尔等,也得到了一些云提供商的支持,如AWS、Microsoft Azure和谷歌云。
总体而言,ONNX 用于不同深度学习库之间的互操作性,这使其成为行业向前发展的一项非常重要的技术。
什么是 ONNX?
ONNX(Open Neural Network Exchange)是表示深度学习模型的标准格式。它支持深度学习框架(如 TensorFlow、PyTorch、Caffe2 等)之间的互操作性。借助 ONNX,开发人员可以更轻松地在不同框架之间传输模型,并在不同的平台(例如桌面、云服务或边缘设备)上运行它们。
ONNX 提供了计算图的通用表示形式,该图是一个数据流图,用于定义构成模型的操作(或“节点”)以及它们之间的连接(或“边缘”)。该图使用称为 protobuf 的标准数据格式定义,protobuf 是一种与语言和平台无关的数据格式。ONNX 还包括一组标准类型、操作和属性,用于定义图形以及输入和输出张量执行的计算。
ONNX是由Facebook和Microsoft开发和维护的开放格式。它不断发展,并且发布了具有更多功能并支持新深度学习操作的更新版本。
如何转换?
若要将 PyTorch 模型转换为 ONNX 模型,需要 PyTorch 模型和生成 PyTorch 模型的源代码。然后,可以使用 PyTorch 在 Python 中加载模型,为所有输入变量定义虚拟输入值,并运行 ONNX 导出器以获取 ONNX 模型。使用 ONXX 转换模型时,有 4 件事需要确保。
1. 训练模型
若要使用 ONNX 进行模型转换,必须使用 TensorFlow、PyTorch 或 Caffe2 等框架训练模型。然后,我们将训练后的模型转换为其他框架或环境的 ONNX 格式。
2. 输入和输出名称
在将模型转换为 ONNX 格式之前,请务必确保模型的输入和输出张量具有唯一的描述性名称。ONNX 使用张量的名称来标识模型的输入和输出。描述性名称有助于确保在其他框架或环境中使用模型时使用正确的张量。
3. 动态轴
在 ONNX 中,张量可以具有称为动态轴的各种维度。我们可以使用这些动态轴来表示模型的批量大小或序列长度。将模型转换为 ONNX 格式时,请务必考虑如何处理动态轴,并确保生成的 ONNX 模型可用于其他框架或环境。
4. 转化评估
将模型转换为 ONNX 格式后,最好评估转换后的模型,以确保其与原始模型等效。我们可以通过比较原始模型的输出和一组输入数据的转换模型来做到这一点。
将模型转换为 ONNX 的工具
我们可以使用多种工具将模型转换为 ONNX 格式,包括:
- ONNX 库:
ONNX 库提供了用于将不同框架(如 TensorFlow、PyTorch 和 Caffe2)的模型转换为 ONNX 格式的函数。这些库支持多种编程语言,包括 Python、C++ 和 C#。 - ONNX 运行时:
ONNX 运行时是一个开源推理引擎,我们可以使用它来执行 ONNX 模型。它还提供了一个名为 onnx2trt 的工具,可以将 ONNX 模型转换为 TensorRT 格式,我们可以将其用于在 NVIDIA GPU 上进行推理。 - Netron:
Netron 是神经网络模型的开源查看器,可用于检查和可视化 ONNX 模型。我们还可以将 ONNX 模型转换为其他格式,例如 TensorFlow 或 CoreML。 - ONNX-Tensorflow:
ONNX-Tensorflow 是一个转换库,允许将 ONNX 模型导入 Tensorflow。 - 模型优化器:
一种命令行工具,可帮助将经过训练的模型转换为可由推理引擎加载和执行的中间表示 (IR) 格式。 - ONNXmIzer:
将各种神经网络表示形式转换为 ONNX 格式的工具。Microsoft 开发了它,当前版本支持 Pytorch、TensorFlow、CoreML 和其他几个框架。
您可以根据用于训练模型的框架和要用于推理的目标框架来选择一个框架。
如何将PyTorch模型转换为ONNX?
在这里,我们将使用 PyTorch NN 模块构建一个具有 10 个输入和 10 个输出的简单神经网络,然后使用 ONNX 库将 PyTorch 模型转换为 ONNX 格式。
步骤 - 1:
首先导入 Pytorch 库和 ONNX 库进行转换。
import torch
import onnx
步骤 - 2:
在此示例中,我们定义了模型架构。前馈网络很简单。然后,我们创建一个模型实例并定义一个示例输入。
# Define your PyTorch model
class MyModel(torch.nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.fc = torch.nn.Linear(10, 10)
def forward(self, x):
x = self.fc(x)
return x
# Create an instance of your model
model = MyModel()
步骤 - 3:
我们使用 torch.onnx.export() 函数将模型导出为 ONNX 格式,并将其保存到名为“mymodel.onnx”的文件中。
# Define an example input
example_input = torch.randn(1, 10)
# Export the model to ONNX format
torch.onnx.export(model, example_input, "mymodel.onnx")
步骤 - 4:
导出模型后,可以使用 onnx.checker 验证模型的一致性以及输入和输出的形状,
import onnx
model = onnx.load("mymodel.onnx")
onnx.checker.check_model(model)
如果模型有问题,onnx.checker.check_model() 函数将引发异常。否则,它将返回 None。
步骤 - 5:还可以比较原始模型和 ONNX 转换模型的输出,以确保它们等效:
# Compare the output of the original model and the ONNX-converted model
original_output = model(example_input)
onnx_model = onnx.load("mymodel.onnx")
onnx.checker.check_model(onnx_model)
rep = onnx.shape_inference.infer_shapes(onnx_model)
onnx.checker.check_shapes(rep)
ort_session = onnxruntime.InferenceSession(onnx_model.SerializeToString())
ort_inputs = {ort_session.get_inputs()[0].name: example_input.numpy()}
ort_outs = ort_session.run(None, ort_inputs)
np.testing.assert_allclose(original_output.detach().numpy(), ort_outs[0], rtol=1e-03, atol=1e-05)
print("Original Output:", original_output)
print("Onnx model Output:", ort_outs[0])
注意:您需要安装一个 onnxruntime 包来比较输出。此外,onnxruntime 的输入应采用 numpy 格式。
结论
- ONNX 是一种用于模型互操作性的格式,允许您将在一个框架中训练的模型转换为我们可以在另一个框架中使用的格式。这允许您将在一个框架中训练的模型与其他框架、库或环境一起使用,而无需重新训练模型。
- 在将模型转换为 ONNX 格式时,请务必确保模型的输入和输出张量具有唯一的描述性名称,因为 ONNX 使用这些名称来标识模型的输入和输出。
- 将模型转换为 ONNX 时,重要的是要考虑如何处理动态轴,因为我们可以使用它们来表示模型的批量大小或序列长度等内容。
- 各种开源工具可用于将模型转换为 ONNX 格式,例如 ONNX 库、ONNX 运行时、Netron、ONNX-Tensorflow 和模型优化器。每个工具都有其优势,并支持不同的源框架和目标框架。

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)