跳到主要内容

使用 ONNX Runtime 在边缘设备上部署 PyCaret 模型

使用 ONNX Runtime 在边缘设备上部署 PyCaret 模型的逐步教程

一步一步教你如何将使用 PyCaret 训练的机器学习模型转换为 ONNX 格式,以实现高性能评分(CPU 或 GPU)

Photo by Austin Distel on Unsplash

简介

在本教程中,我将向您展示如何使用 PyCaret 这个 Python 中的开源低代码机器学习库来训练机器学习模型,并将其转换为 ONNX 格式,以便在边缘设备或其他非 Python 环境上部署。例如,您可以在 Python 中使用 PyCaret 训练机器学习模型,并在 R、Java 或 C 中部署它们。本教程的学习目标包括:

👉 什么是 PyCaret 以及如何入门?

👉 不同类型的模型格式(pickle、onnx、pmml 等)

👉 ONNX 是什么(发音为 ONEX)以及其好处是什么?

👉 使用 PyCaret 训练机器学习模型并将其转换为 ONNX 以在边缘设备上部署。

PyCaret

PyCaret 是一个开源的低代码机器学习库和端到端模型管理工具,用于自动化机器学习工作流程。PyCaret 以其易用性、简洁性和快速高效地构建和部署端到端机器学习流水线的能力而闻名。要了解更多关于 PyCaret 的信息,请访问他们的 GitHub

特点:

PyCaret — 一个开源的低代码��机器学习库

skl2onnx

skl2onnx 是一个将 scikit-learn 模型转换为 ONNX 的开源项目。一旦转换为 ONNX 格式,您可以使用 ONNX Runtime 等工具进行高性能评分。这个项目是由 Microsoft 的工程师和数据科学家于 2017 年发起的。要了解更多关于该项目的信息,请访问他们的 GitHub

安装

您需要为本教程安装以下库。安装只需几分钟时间。

# 安装 pycaret
pip install pycaret

# 安装 skl2onnx
pip install skl2onnx

# 安装 onnxruntime
pip install onnxruntime

不同的模型格式

在介绍 ONNX 和其优势之前,让我们看看当前可用于部署的不同模型格式。

👉Pickle

这是最常见的格式,也是许多 Python 库(包括 PyCaret)将模型对象保存到文件的默认方式。Pickle 将 Python 对象转换为位流,并允许将其存储到磁盘并在以后重新加载。它提供了一个很好的格式来存储机器学习模型,前提是推理应用程序也是在 Python 中构建的。

👉PMML

预测模型标记语言(PMML)是另一种机器学习模型的格式,相对于 Pickle 来说较少常见。PMML 自 1997 年以来一直存在,并且有很多应用程序使用该格式。诸如 SAP 和 PEGA CRM 等应用程序能够利用某些版本的 PMML。有一些开源库可以将 scikit-learn 模型(PyCaret)转换为 PMML。PMML 格式的最大缺点是它不支持所有的机器学习模型。

👉ONNX

ONNX(Open Neural Network Exchange)是一种开放格式,支持在不同库和语言之间存储和移植机器学习模型。这意味着您可以使用任何语言中的任何框架训练机器学习模型,然后将其转换为 ONNX 格式,以在任何环境中生成推理(例如 Java、C、.Net、Android 等)。ONNX 的这种与语言无关的能力使其与其他格式相比非常强大(例如,您无法在 Python 以外的任何其他语言中使用保存为 Pickle 文件的模型)。

ONNX 是什么?

ONNX 是一种用于表示深度学习和传统模型的开放格式。使用 ONNX,AI 开发人员可以更轻松地在先进工具之间移动模型,并选择最适合自己的组合。ONNX 由 Microsoft、Facebook 和 AWS 等合作伙伴社区开发和支持。

ONNX 得到广泛支持,并且可以在许多框架、工具和硬件中找到。在不同框架之间实现互操作性,并简化从研究到生产的路径,有助于增加 AI 社区的创新速度。ONNX 有助于解决与 AI 模型相关的硬件依赖性挑战,并使相同的 AI 模型能够部署到多个硬件加速目标上。

来源:Microsoft

https://microsoft.github.io/ai-at-edge/docs/onnx/ 有许多优秀的机器学习库,涵盖了各种语言,比如 PyTorch、TensorFlow、scikit-learn、PyCaret 等。其核心理念在于,你可以使用任何工具、语言或框架训练模型,然后使用另一种语言或应用程序进行部署,进行推理和预测。举个例子,假设你有一个使用 .Net 构建的 Web 应用、一个 Android 应用,甚至是一个边缘设备,你想要将机器学习模型的预测集成到这些下游系统中。你可以通过将模型转换为 ONNX 格式来实现这一点。使用 Pickle 或 PMML 格式是无法做到这一点的。

主要优势:

👉 互操作性

在你喜欢的框架中开发,无需担心下游推理的影响。ONNX 使你能够在你选择的推理引擎中使用你喜欢的框架。

👉 硬件访问

ONNX 使得访问硬件优化变得更加容易。使用兼容 ONNX 的运行时和库,旨在最大程度地提高硬件性能。这意味着,即使是在关注延迟的情况下,你也可以在 GPU 上使用 ONNX 模型进行推理。

兼容性与互操作性

👉 让我们开始吧

数据集

在本教程中,我使用了 PyCaret 仓库中的一个回归数据集,名为 insurance。你可以从这里下载数据。

样本数据集

# 加载数据集
from pycaret.datasets import get_data
data = get_data('insurance')

# 初始化设置 / 数据准备
from pycaret.regression import *
s = setup(data, target = 'charges')

设置函数的输出结果(为了显示目的而压缩)

👉 模型训练与选择

现在数据已经准备好进行建模,让我们通过使用 compare_models 函数开始训练过程。它将训练模型库中的所有可用算法,并使用 k 折交叉验证评估多个性能指标。

# 比较所有模型
best = compare_models()

compare_models 的输出结果

基于交叉验证指标,最佳模型是 ***Gradient Boosting Regressor。***你可以使用 save_model 函数将模型保存为 Pickle 文件。

# 将模型保存到驱动器
save_model(best, 'c:/users/models/insurance')

这将以 Pickle 格式保存模型。

👉 使用 Pickle 格式生成预测

你可以使用 load_model 函数将保存的模型加载回 Python 环境,并使用 predict_model 函数生成推理。

# 加载模型
from pycaret.regression import load_model
loaded_model = load_model('c:/users/models/insurance')

# 生成预测 / 推理
from pycaret.regression import predict_model
pred = predict_model(loaded_model, data=data) # 新数据

在测试集上生成的预测

👉 ONNX 转换

到目前为止,我们看到了如何以 Pickle 格式保存和加载训练好的模型(这是 PyCaret 的默认格式)。然而,使用 skl2onnx 库,我们可以将模型转换为 ONNX:

# 将最佳模型转换为 onnx
from skl2onnx import to_onnx
X_sample = get_config('X_train')[:1]
model_onnx = to_onnx(best, X_sample.to_numpy())

我们也可以将 model_onnx 保存到本地驱动器:

# 将模型保存到驱动器
with open("c:/users/models/insurance.onnx", "wb") as f:
f.write(model_onnx.SerializeToString())

现在,为了从 insurance.onnx 生成推理,我们将在 Python 中使用 onnxruntime 库(仅为了演示)。基本上,你现在可以在任何其他平台或环境中使用这个 insurance.onnx。

# 在 onnx 上生成推理
from onnxruntime import InferenceSession
sess = InferenceSession(model_onnx.SerializeToString())
X_test = get_config('X_test').to_numpy()
predictions_onnx = sess.run(None, {'X': X_test})[0]

# 打印 predictions_onnx
print(predictions_onnx)

predictions_onnx

请注意,predictions_onnx 的输出是一个 numpy 数组,与我们使用 PyCaret 的 predict_model 函数时得到的 pandas DataFrame 不同,但如果你比对数值,这些数字都是相同的(使用 ONNX 时,有时会在第四位小数点后发现微小差异 — 非常罕见)。

任务完成!

即将推出!

下周我将深入探讨ONNX转换,并讨论如何将整个机器学习流程(包括输入器和转换器)转换为ONNX。如果您希望自动收到通知,可以关注我的MediumLinkedInTwitter

PyCaret — 作者提供的图片

PyCaret — 作者提供的图片

使用这个轻量级的Python工作流自动化库,您可以实现无限可能。如果您觉得这个工具有用,请不要忘记在我们的GitHub仓库上给我们 ⭐️。

想了解更多关于PyCaret的信息,请关注我们的LinkedInYoutube

加入我们的Slack频道。邀请链接在这里

重要链接

文档 博客 GitHub StackOverflow 安装PyCaret 笔记本教程 为PyCaret做贡献

更多与PyCaret相关的教程:

在Alteryx中使用PyCaret进行机器学习 _一篇关于在Alteryx Designer中使用PyCaret训练和部署机器学习模型的逐步教程_towardsdatascience.com 在KNIME中使用PyCaret进行机器学习 _一篇关于在KNIME中使用PyCaret训练和部署端到端机器学习流程的逐步指南_towardsdatascience.com 使用PyCaret + MLflow进行简单的MLOps _一篇适合初学者的、关于如何使用PyCaret在您的机器学习实验中集成MLOps的逐步教程_towardsdatascience.com 编写和训练自定义机器学习模型使用PyCaret towardsdatascience.com 使用PyCaret构建,使用FastAPI部署 _一篇逐步、适合初学者的教程,介绍如何使用PyCaret构建端到端机器学习流程并部署_towardsdatascience.com 使用PyCaret进行时间序列异常检测 _一篇关于使用PyCaret对时间序列数据进行无监督异常检测的逐步教程_towardsdatascience.com 通过PyCaret和Gradio加速您的机器学习实验 _一篇逐步教程,快速开发和交互式地与机器学习流程交互_towardsdatascience.com 使用PyCaret进行多时间序列预测 _一篇关于使用PyCaret预测多时间序列的逐步教程_towardsdatascience.com