您可以部署和推断保存在不同格式的 PyTorch 或 TensorFlow 机器学习模型,并将其转换为开放神经网络交换(ONNX)格式。 ONNX 是一种表示深度学习模型的开源格式。 开发人员可以使用 ONNX 格式在 PyTorch 或 TensorFlow, 等框架中训练模型,然后将其导出到另一个具有不同性能特征的环境中运行。 ONNX格式为将机器学习模型转换为ONNX格式并使用ONNX运行时进行推理提供了强大的解决方案。
将模型转换为 ONNX 运行时的优势
将模型转换为 ONNX 运行时具有多种优势,尤其是在机器学习和深度学习应用中。 将模型转换为 ONNX 运行时的一些优势如下:
跨平台兼容性 :ONNX 提供了表示机器学习模型的标准格式,这使得在 PyTorch 或 Tensorflow 等不同框架间部署模型变得更加容易。 您可以在一个框架中训练模型,然后将其部署到另一个支持 ONNX 运行时的框架中。
提高性能 :ONNX 运行时通过应用各种针对硬件和软件的优化(如图形优化)来优化推理模型。 此外,它还支持在 CPU 和 GPU 等不同硬件上执行,确保有效利用资源。
互操作性 :ONNX 提供了在一个框架中训练 PyTorch, TensorFlow, 和 scikit-learn 等模型,然后将其输出到另一个环境中运行的方法,从而简化了工作流程。 它打破了不同深度学习框架之间的壁垒,让开发人员能够利用不同库的优势,而不会被锁定在单一的生态系统中。
支持的转换框架
您可以将使用以下框架的机器学习模型转换为 ONNX 格式:
- PyTorch
- TensorFlow
- CatBoost
- LightGBM
将 PyTorch 模型转换为 ONNX 格式
请按照以下步骤将 PyTorch 中训练好的模型转换为 ONNX 格式:
导入库 :首先导入必要的库,如用于运行模型的
onnxruntime
、用于 PyTorch 功能的torch
以及应用程序所需的其他库。创建或下载 PyTorch 模型 :您可以使用自己的数据集创建 PyTorch 模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。
将 PyTorch 模型转换为 ONNX 格式 :将 PyTorch 模型转换为 ONNX 格式:
a. 准备模型使用
model.eval()
函数确保 PyTorch 模型处于评估模式。 您可能需要一个虚拟输入张量来匹配模型的形状。b. 导出模型使用 torch.onnx.export 函数将模型转换为 ONNX 格式。
验证转换 :转换模型后,使用
onnx
库验证模型是否按预期运行。
将 TensorFlow 模型转换为 ONNX 格式
请按照以下步骤将 TensorFlow 模型转换为 ONNX 格式:
导入库 :首先导入必要的库,如
tf2onnx
以方便将 TensorFlow 模型转换为 ONNX,以及应用所需的其他库。下载 TensorFlow 模型 :您必须下载外部创建的 TensorFlow 模型和用于训练模型的数据。
将 TensorFlow 模型转换为 ONNX 格式 :使用
tf2onnx.convert
命令将以SavedModel
格式创建的 TensorFlow 模型转换为 ONNX 格式。 如果要转换 TensorFlow Lite 模型,请使用--tflite
标志而不是--saved-model
标志。
Keras
模型和 函数可以通过使用 或 函数在 tf
tf2onnx.convert.from_keras
tf2onnx.convert.from_function
Python 中直接转换。
- 验证转换 :转换模型后,使用
onnx
库验证模型是否按预期运行。
CatBoost 模型转换为ONNX格式
按照以下步骤将您CatBoost训练好的模型转换为ONNX格式:
导入库 :首先导入必要的库,例如用于运行模型的
onnxruntime
、用于 CatBoost 功能的catboost
以及应用程序所需的其他库。创建或下载 CatBoost 模型 :您可以使用自己的数据集创建 CatBoost 模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。
CatBoost 模型转换为ONNX格式 :要将 CatBoost转换为ONNX格式:
a. 加载 CatBoost 模型 :您可以使用以下库加载 CatBoost 模型
pickle
:catboost_model = pickle.load(file)
b. 导出模型 :使用
catboost_model.save_model
函数,将格式参数设置为onnx
,将模型转换为ONNX格式。catboost_model.save_model( onnx_model_name, format="onnx", export_parameters={ 'onnx_domain': 'ai.catboost', 'onnx_model_version': 1, 'onnx_doc_string': 'test model for Regressor', 'onnx_graph_name': 'CatBoostModel_for_Regression' } )
验证转换 :转换模型后,使用
onnx
库验证模型是否按预期运行。
LightGBM 模型转换为ONNX格式
按照以下步骤LightGBM训练好的模型转换为ONNX格式:
导入库 :首先导入必要的库,例如用于运行模型的
onnxruntime
、用于 LightGBM 功能的lightgbm
以及用于转换和应用程序所需的其他库的onnxmltools
。创建或下载LGBM模型 :您可以使用自己的数据集创建 LightGBM 模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。
将LightGBM模型转换为ONNX格式 :要将 LightGBM转换为ONNX格式:
a. 加载 LightGBM 模型 :你可以使用以下库加载 LightGBM 模型
pickle
:lgbm_model = pickle.load(file)
b. 导出模型 :使用
convert_lightgbm
功能将模型转换为ONNX格式。from onnxmltools import convert_lightgbm from skl2onnx.common.data_types import FloatTensorType from onnxmltools.utils import save_model initial_type = [("float_input", FloatTensorType([None, X.shape[1]]))] onnx_model = convert_lightgbm(model=lgbm_model, initial_types=initial_types) onnx_model_filename = "lgbm_model.onnx" save_model(onnx_model, onnx_model_filename)
提示:有关将 LightGBM 模型转换为ONNX格式的问题,请参阅 watsonx.ai 运行时故障排除。
验证转换 :转换模型后,使用
onnx
库验证模型是否按预期运行。
将XGBoost模型转换为ONNX格式
按照以下步骤将XGBoost中训练好的模型转换为ONNX格式:
导入库 :首先导入必要的库,例如用于运行模型的onnxruntime、用于XGBoost功能的xgboost以及应用程序所需的其他库。
创建或下载XGBoost模型 :您可以使用自己的数据集创建XGBoost模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。
将XGBoost模型转换为ONNX格式 :要将XGBoost模型转换为ONNX格式:
a. 加载 XGboost 模型 :您可以使用以下库加载 XGBoost 模型
pickle
:xgboost_model = pickle.load(file)
b. 导出模型 :使用
convert_xgboost
功能将模型转换为ONNX格式。from onnxmltools import convert_xgboost from onnxconverter_common.data_types import FloatTensorType from onnxmltools.utils import save_model initial_type = [("float_input", FloatTensorType([None, X.shape[1]]))] onnx_model = convert_xgboost(xgboost_model, initial_types=initial_type) onnx_model_filename = "xgboost_onnx_model.onnx" save_model(onnx_model, onnx_model_filename)
验证转换 :转换模型后,使用onnx库验证模型是否按预期运行。
将scikit-learn模型转换为ONNX格式
按照以下步骤将scikit-learn中训练好的模型转换为ONNX格式:
导入库 :首先导入必要的库,例如用于运行模型的onnxruntime、用于scikit-learn功能的sklearn、 skl2onnxfor 转换以及应用程序所需的其他库。
创建或下载scikit-learn模型 :您可以使用自己的数据集创建scikit-learn模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。
a. 将scikit-learn模型转换为ONNX格式 :要将scikit-learn模型转换为ONNX格式:
sklearn_model = pickle.load(file)
b. 加载 scikit-learn 模型 :你可以使用以下库加载 scikit-learn 模型
pickle
:sklearn_model = pickle.load(file)
c. 导出模型 :使用to_onnx函数将模型转换为ONNX格式。
from skl2onnx import to_onnx onnx_model = to_onnx(sklearn_model, X, target_opset=19) with open("sklearn_model.onnx", "wb") as f: f.write(onnx_model.SerializeToString())
验证转换 :转换模型后,使用onnx库验证模型是否按预期运行。
其他注意事项
以下是将您的模型转换为ONNX格式的一些额外注意事项:
动态轴 :动态轴可用于模型处理输入形状的变化,如动态批量大小或序列长度,这对在输入尺寸可能变化的应用中部署模型非常有用。 如果模型要处理可变的输入大小,如动态批量大小或序列长度,则使用动态轴。
动态轴还可以减少内存开销,因为它们可以与多个输入和输出一起使用,动态地进行调整,而无需重新导出模型。 您可以在 PyTorch 或 TensorFlow 中导出模型时指定动态轴。
操作集版本 :ONNX 的操作集版本决定了模型支持的操作集及其规格。 这是模型转换和部署过程中的一个关键因素。
不同的 ONNX 运行时和框架支持特定的 opset 版本。 旧版本的 opset 可能缺少新版本中的功能或优化。 模型的 opset 版本与 ONNX 运行时不兼容会导致推理过程中出现错误。 您必须确保目标运行时支持您选择的 ONNX 操作集版本。
部署转换为 ONNX 格式的模型
使用 onnxruntime_opset_19
软件规范来部署转换为 ONNX 格式的机器学习模型。 当您将模型存储watsonx.ai时,必须指定软件规格和模型类型。 更多信息,请参阅支持的软件规格。
要从用户界面部署转换为 ONNX 格式的模型,请按照以下步骤操作:
在部署空间中,转到 " 资产 "选项卡。
在资产列表中找到模型,单击菜单图标菜单图标,然后选择部署。
为您的模型选择部署类型。 可选择在线部署或批量部署选项。
输入部署的名称,并可选择输入服务名称、描述和标记。
注:- 使用 "服务名称 "字段指定部署的名称,而不是部署 ID。
- 服务名称在名称空间内必须是唯一的。
- 服务名称必须只包含这些字符: a-z,0-9,_],长度不得超过 36 个字符。
- 在定期使用自定义基础模型的工作流程中,请考虑每次部署模型时为其指定相同的名称。 这样,在删除并重新部署模型后,就可以在代码中继续使用相同的端点。
为您的机型选择硬件规格。
为您的机型选择配置和软件规格。
单击创建。
测试模型
请按照以下步骤测试转换为 ONNX 格式的已部署模型:
- 在部署空间中,打开 " 部署 "选项卡并单击部署名称。
- 单击 "测试 "选项卡输入提示文本,并从部署的资产中获取响应。
- 根据您部署的资产类型,以下列格式之一输入测试数据:
- 文本 :输入文本输入数据,生成文本块作为输出。
- JSON :输入 JSON 输入数据,生成 JSON 格式的输出。
- 单击 " 生成" ,根据提示获取结果。
样本笔记本
以下示例笔记本演示了如何使用 Python 客户端库部署从 PyTorch 或 TensorFlow 转换为 ONNX 格式的机器学习模型:
Notebook | 框架 | 描述 |
---|---|---|
将 ONNX 神经网络从固定轴转换为动态轴,并与 watsonx 一起使用 | ONNX | 设置环境 创建并导出基本 ONNX 模型 将模型从固定轴转换为动态轴 持久保存转换后的 ONNX 模型 部署并对 ONNX 模型进行评分 清理 总结和下一步工作 |
用 watsonx 使用从 PyTorch 转换而来的 ONNX 模型 | PyTorch, ONNX | 使用数据集创建 PyTorch 模型。 将 PyTorch 模型转换为 ONNX 格式 将转换后的模型保存在 Watson Machine Learning资源库中。 使用客户端库部署在线评分模型。 使用客户机库对样本记录进行评分。 |
使用从 TensorFlow 转换而来的 ONNX 模型,用 watsonx 识别手写数字 | Tensorflow ,ONNX | 下载外部训练的 TensorFlow 模型和数据集。 将 TensorFlow 模型转换为 ONNX 格式 将转换后的模型保存在 Watson Machine Learning资源库中。 使用客户端库部署在线评分模型。 使用客户机库对样本记录进行评分。 |
使用从 CatBoost | CatBoost, ONNX | 训练有素的 CatBoost 模特。 将 模型转换为ONNX格式。 CatBoost Watson Machine Learning 资料库中已转换的模型。 使用客户端库部署在线评分模型。 使用客户机库对样本记录进行评分。 |
使用从 LightGBM | LightGBM, ONNX | 训练一个 LightGBM 模型 将 LightGBM 模型转换为ONNX格式 将转换后的模型保存在 watsonx.ai 运行时库中 使用客户端库部署模型以进行在线评分 使用客户端库对样本记录进行评分 |
使用ibm- watsonx -ai转换自XGBoost的ONNX模型 | XGBoost、ONNX | 训练XGBoost模型。 将XGBoost模型转换为ONNX格式。 将转换后的模型保存在 库中。 watsonx.ai 使用APIClient实例部署在线评分模型。 使用APIClient实例对样本记录进行评分。 |
使用ibm- watsonx -ai转换自scikit-learn的ONNX模型 | Scikit-learn、ONNX | 训练一个scikit-learn模型 将原生scikit-learn模型转换为ONNX格式 对sklearn管道中封装的自定义scikit-learn模型进行转换 将转换后的模型保存在 watsonx.ai 运行时库中 使用客户端库部署模型以进行在线评分 使用客户端库对样本记录进行评分 |
父主题: 部署机器学习资产