部署转换为 ONNX 格式的模型

您可以从 PyTorchTensorFlow 部署和推断机器学习模型,这些模型以不同格式保存并转换为 Open Neural Network ExchangeONNX )格式。 ONNX 是一种用于表示深度学习模型的开源格式。 开发人员可以使用 ONNX 格式在一个框架(如 PyTorchTensorFlow )中训练模型,然后将其导出到另一个具有不同性能特征的环境中运行。 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
  5. XGBoost
  6. Scikit-learn

PyTorch 格式转换为 ONNX 格式

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

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

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

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

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

    b. 导出模型 :使用 torch.onnx.export 功能将模型转换为ONNX格式。

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

TensorFlow 格式转换为 ONNX 格式

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

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

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

  3. TensorFlow 模型转换为ONNX格式 :使用 tf2onnx.convert 命令将 TensorFlow 格式的 SavedModel 模型转换为 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. 导出模型 :使用格式参数设置为 onnxcatboost_model.save_model 函数将模型转换为 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. 创建或下载 LightGBM 模型 :您可以使用自己的数据集创建 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_types = [("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_types = [("float_input", FloatTensorType([None, X.shape[1]]))]
    onnx_model = convert_xgboost(xgboost_model, initial_types=initial_types)
    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 、用于转换的 skl2onnx 以及应用程序所需的其他库。

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

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

    a. 加载 scikit-learn 模型 :您可以加载 scikit-learn 通过使用以下库来建模 pickle

    sklearn_model = pickle.load(file)
    

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

其他注意事项

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

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

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

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

    不同的 ONNX 运行时间和框架支持特定的操作版本。 旧版本的 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 客户端库将 PyTorchTensorFlow 格式的机器学习模型转换为 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 运行时库中
使用客户端库部署模型以进行在线评分
使用客户端库对样本记录进行评分

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