0 / 0
Go back to the English version of the documentation
部署转换为 ONNX 格式的模型
Last updated: 2025年2月14日
部署转换为 ONNX 格式的模型

您可以部署和推断保存在不同格式的 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 格式:

  1. PyTorch
  2. TensorFlow
  3. CatBoost
  4. LightGBM

将 PyTorch 模型转换为 ONNX 格式

请按照以下步骤将 PyTorch 中训练好的模型转换为 ONNX 格式:

  1. 导入库 :首先导入必要的库,如用于运行模型的 onnxruntime 、用于 PyTorch 功能的 torch 以及应用程序所需的其他库。

  2. 创建或下载 PyTorch 模型 :您可以使用自己的数据集创建 PyTorch 模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。

  3. 将 PyTorch 模型转换为 ONNX 格式 :将 PyTorch 模型转换为 ONNX 格式:

    a. 准备模型使用 model.eval() 函数确保 PyTorch 模型处于评估模式。 您可能需要一个虚拟输入张量来匹配模型的形状。

    b. 导出模型使用 torch.onnx.export 函数将模型转换为 ONNX 格式。

  4. 验证转换 :转换模型后,使用 onnx 库验证模型是否按预期运行。

将 TensorFlow 模型转换为 ONNX 格式

请按照以下步骤将 TensorFlow 模型转换为 ONNX 格式:

  1. 导入库 :首先导入必要的库,如 tf2onnx 以方便将 TensorFlow 模型转换为 ONNX,以及应用所需的其他库。

  2. 下载 TensorFlow 模型 :您必须下载外部创建的 TensorFlow 模型和用于训练模型的数据。

  3. 将 TensorFlow 模型转换为 ONNX 格式 :使用 tf2onnx.convert 命令将以 SavedModel 格式创建的 TensorFlow 模型转换为 ONNX 格式。 如果要转换 TensorFlow Lite 模型,请使用 --tflite 标志而不是 --saved-model 标志。

注:

Keras 模型和 函数可以通过使用 或 函数在 tf tf2onnx.convert.from_keras tf2onnx.convert.from_function Python 中直接转换。

  1. 验证转换 :转换模型后,使用 onnx 库验证模型是否按预期运行。

CatBoost 模型转换为ONNX格式

按照以下步骤将您CatBoost训练好的模型转换为ONNX格式:

  1. 导入库 :首先导入必要的库,例如用于运行模型的 onnxruntime 、用于 CatBoost 功能的 catboost 以及应用程序所需的其他库。

  2. 创建或下载 CatBoost 模型 :您可以使用自己的数据集创建 CatBoost 模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。

  3. 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'
        }
    )
    
  4. 验证转换 :转换模型后,使用 onnx 库验证模型是否按预期运行。

LightGBM 模型转换为ONNX格式

按照以下步骤LightGBM训练好的模型转换为ONNX格式:

  1. 导入库 :首先导入必要的库,例如用于运行模型的 onnxruntime 、用于 LightGBM 功能的 lightgbm 以及用于转换和应用程序所需的其他库的 onnxmltools

  2. 创建或下载LGBM模型 :您可以使用自己的数据集创建 LightGBM 模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。

  3. 将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 运行时故障排除

  4. 验证转换 :转换模型后,使用 onnx 库验证模型是否按预期运行。

将XGBoost模型转换为ONNX格式

按照以下步骤将XGBoost中训练好的模型转换为ONNX格式:

  1. 导入库 :首先导入必要的库,例如用于运行模型的onnxruntime、用于XGBoost功能的xgboost以及应用程序所需的其他库。

  2. 创建或下载XGBoost模型 :您可以使用自己的数据集创建XGBoost模型,也可以使用外部开源模型库(如Hugging Face)提供的模型。

  3. 将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)
    
  4. 验证转换 :转换模型后,使用onnx库验证模型是否按预期运行。

将scikit-learn模型转换为ONNX格式

按照以下步骤将scikit-learn中训练好的模型转换为ONNX格式:

  1. 导入库 :首先导入必要的库,例如用于运行模型的onnxruntime、用于scikit-learn功能的sklearn、 skl2onnxfor 转换以及应用程序所需的其他库。

  2. 创建或下载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())
    
  3. 验证转换 :转换模型后,使用onnx库验证模型是否按预期运行。

其他注意事项

以下是将您的模型转换为ONNX格式的一些额外注意事项:

  • 动态轴 :动态轴可用于模型处理输入形状的变化,如动态批量大小或序列长度,这对在输入尺寸可能变化的应用中部署模型非常有用。 如果模型要处理可变的输入大小,如动态批量大小或序列长度,则使用动态轴。

    动态轴还可以减少内存开销,因为它们可以与多个输入和输出一起使用,动态地进行调整,而无需重新导出模型。 您可以在 PyTorch 或 TensorFlow 中导出模型时指定动态轴。

  • 操作集版本 :ONNX 的操作集版本决定了模型支持的操作集及其规格。 这是模型转换和部署过程中的一个关键因素。

    不同的 ONNX 运行时和框架支持特定的 opset 版本。 旧版本的 opset 可能缺少新版本中的功能或优化。 模型的 opset 版本与 ONNX 运行时不兼容会导致推理过程中出现错误。 您必须确保目标运行时支持您选择的 ONNX 操作集版本。

部署转换为 ONNX 格式的模型

使用 onnxruntime_opset_19 软件规范来部署转换为 ONNX 格式的机器学习模型。 当您将模型存储watsonx.ai时,必须指定软件规格和模型类型。 更多信息,请参阅支持的软件规格

要从用户界面部署转换为 ONNX 格式的模型,请按照以下步骤操作:

  1. 在部署空间中,转到 " 资产 "选项卡。

  2. 在资产列表中找到模型,单击菜单图标菜单图标,然后选择部署

  3. 为您的模型选择部署类型。 可选择在线部署或批量部署选项。

  4. 输入部署的名称,并可选择输入服务名称、描述和标记。

    注:
    • 使用 "服务名称 "字段指定部署的名称,而不是部署 ID。
    • 服务名称在名称空间内必须是唯一的。
    • 服务名称必须只包含这些字符: a-z,0-9,_],长度不得超过 36 个字符。
    • 在定期使用自定义基础模型的工作流程中,请考虑每次部署模型时为其指定相同的名称。 这样,在删除并重新部署模型后,就可以在代码中继续使用相同的端点。

  5. 为您的机型选择硬件规格。

  6. 为您的机型选择配置和软件规格。

  7. 单击创建

测试模型

请按照以下步骤测试转换为 ONNX 格式的已部署模型:

  1. 在部署空间中,打开 " 部署 "选项卡并单击部署名称。
  2. 单击 "测试 "选项卡输入提示文本,并从部署的资产中获取响应。
  3. 根据您部署的资产类型,以下列格式之一输入测试数据:
    • 文本 :输入文本输入数据,生成文本块作为输出。
    • JSON :输入 JSON 输入数据,生成 JSON 格式的输出。
  4. 单击 " 生成" ,根据提示获取结果。

样本笔记本

以下示例笔记本演示了如何使用 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 运行时库中
使用客户端库部署模型以进行在线评分
使用客户端库对样本记录进行评分

父主题: 部署机器学习资产