📢 转载信息
原文链接:https://machinelearningmastery.com/export-your-ml-model-in-onnx-format/
原文作者:Jason Brownlee
ONNX(开放神经网络交换)是一种开放格式,用于表示机器学习模型。它可以用于在不同的AI框架之间轻松共享模型。例如,您可以在PyTorch中训练模型,然后将其转换为ONNX格式,以便在支持ONNX的推理引擎(如ONNX Runtime)中进行部署。
本指南将介绍如何将深度学习模型导出为ONNX格式,主要关注使用Python进行操作。
什么是ONNX?
ONNX是一种开放格式,用于表示机器学习模型。它旨在支持模型在不同框架之间的互操作性。
ONNX格式包括两部分:
- 模型:一个定义了模型拓扑和参数的序列化文件。
- 运行时:一个推理引擎,可以在不同硬件和操作系统上运行ONNX模型。
将模型导出到ONNX格式的主要优势包括:
- 框架互操作性:在不同框架(如PyTorch、TensorFlow、Keras)之间共享模型。
- 硬件加速:支持许多硬件加速器,例如NVIDIA GPU、Intel CPU等。
- 生态系统支持:有许多工具和库支持ONNX格式,可以用于模型部署、可视化和分析。
如何将模型导出为ONNX?
将模型导出为ONNX通常涉及以下步骤:
- 创建一个用于导出的模型。
- 准备一个示例输入张量,以确定模型的输入形状和数据类型。
- 使用框架的特定工具将模型转换为ONNX格式。
- 验证导出的ONNX模型是否正确。
使用PyTorch导出ONNX模型
PyTorch提供了一个内置的torch.onnx.export()函数,用于将模型导出为ONNX格式。您需要提供模型、示例输入和文件名。
以下是一个简单的例子,展示如何导出PyTorch模型:
import torch
import torch.nn as nn
# 1. 定义一个简单的模型
class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.linear = nn.Linear(10, 5)
def forward(self, x):
return self.linear(x)
model = SimpleModel()
# 2. 创建一个示例输入张量
# 形状 (batch_size, input_features) = (1, 10)
dummy_input = torch.randn(1, 10, requires_grad=True)
# 3. 导出模型
output_onnx_file = "simple_model.onnx"
torch.onnx.export(model, # 要导出的模型
dummy_input, # 示例输入数据
output_onnx_file, # 输出文件名
export_params=True, # 导出模型权重
opset_version=12, # ONNX操作集版本
do_constant_folding=True, # 是否折叠常量
input_names=['input'], # 输入名称
output_names=['output'], # 输出名称
dynamic_axes={'input': {0: 'batch_size'}, # 动态批次大小
'output': {0: 'batch_size'}})
print(f"Model exported to {output_onnx_file}")
关键参数解释:
opset_version:指定ONNX操作集版本。建议使用较新的版本,如11或12。dynamic_axes:允许模型在推理时使用不同大小的输入批次。
使用Keras/TensorFlow导出ONNX模型
对于TensorFlow和Keras模型,您可以使用tf2onnx库将它们转换为ONNX格式。首先需要安装该库:
pip install tf2onnx
Keras导出示例:
假设您已经训练了一个Keras模型:
import tensorflow as tf
import tf2onnx
# 假设my_keras_model是您已训练好的Keras模型
# 创建一个简单的Keras模型用于演示
model = tf.keras.Sequential([
tf.keras.layers.Dense(5, input_shape=(10,)),
tf.keras.layers.Softmax()
])
# 准备示例输入
input_signature = [tf.TensorSpec([1, 10], tf.float32, name="input")]
# 导出到ONNX
model_proto, external_tensor_storage = tf2onnx.convert.from_keras(
model,
input_signature=input_signature,
output_path="keras_model.onnx"
)
print("Keras model exported to keras_model.onnx")
TensorFlow导出示例:
对于TensorFlow SavedModel格式,导出过程类似:
import tensorflow as tf
import tf2onnx
# 假设您有一个SavedModel路径
saved_model_path = "my_saved_model"
# 导出模型
model_proto, external_tensor_storage = tf2onnx.convert.from_saved_model(
saved_model_path,
output_path="tf_model.onnx"
)
print("TensorFlow SavedModel exported to tf_model.onnx")
验证ONNX模型
导出模型后,强烈建议验证其功能是否与原始模型一致。您可以使用ONNX Runtime库来加载和运行ONNX模型。
首先安装ONNX Runtime:
pip install onnxruntime
然后,您可以使用Python脚本进行验证。以下是一个通用的验证概念:
import onnxruntime
import numpy as np
# 1. 加载ONNX模型
ort_session = onnxruntime.InferenceSession("simple_model.onnx")
# 2. 准备输入数据(必须是NumPy数组,并且与导出时的数据类型和形状匹配)
# 假设输入形状为 (1, 10)
input_data = np.random.randn(1, 10).astype(np.float32)
# 3. 获取输入和输出名称
input_name = ort_session.get_inputs()[0].name
output_name = ort_session.get_outputs()[0].name
# 4. 运行推理
ort_inputs = {input_name: input_data}
ort_outputs = ort_session.run([output_name], ort_inputs)
# 5. 比较结果(需要原始框架的输出进行对比)
print("ONNX Runtime output shape:", ort_outputs[0].shape)
通过将ONNX Runtime的输出与原始框架(如PyTorch或TensorFlow)的输出进行比较,您可以确保转换过程没有引入错误。
总结
ONNX为机器学习模型的跨框架部署提供了一个强大的解决方案。无论是使用PyTorch还是TensorFlow/Keras,都有相应的工具链支持导出为ONNX格式。掌握这些导出和验证技术,是实现生产环境中高效、灵活部署的关键步骤。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区