使用 MLflow 的自定义 PyFuncs - Notebooks
如果您想查看本指南中的完整 notebook,可以从下方直接查看或下载每个 notebook。
使用 MLflow 的 Pyfunc 创建自定义 Python 模型的基础知识
简介
在本初始教程中,我们将向您介绍 MLflow pyfunc 的基本概念。我们将演示在 MLflow 生态系统中创建、保存和调用自定义 Python 函数模型的简易性和适应性。最后,您将对一个将指定数值添加到 DataFrame 列的模型有一个实践性的理解,突出显示 pyfunc 风味的内在灵活性。
您将学到什么
- 自定义 PyFunc 模型简易性:掌握 PythonModel 类的基本结构,以及它如何构成 MLflow 中自定义模型的支柱。
- 模型持久化:了解保存和检索自定义模型的直接过程。
- 调用预测:了解如何使用加载的自定义 pyfunc 模型进行预测的机制。
分步指南
- 模型定义:首先构建一个 Python 类,封装我们简单的 “Add N” 模型的逻辑。
- 持久化模型:使用 MLflow 的功能来保存定义的模型,确保以后可以检索它。
- 模型检索:从其保存位置加载模型,并准备进行预测。
- 模型评估:在样本数据上使用检索到的模型来见证其功能。
总结
在本教程结束时,您将体会到 MLflow 的自定义 pyfunc 所提供的简易性和一致性,即使对于最简单的模型也是如此。它为后续教程中可能探索的更高级功能和用例奠定了基础。
查看 Notebook构建基本自定义 Python 模型
简介
在本教程中,我们将加深对 MLflow 自定义 Pyfunc 的理解。 PythonModel
类是基石,允许您定义、保存、加载和预测使用自定义 PyFunc 模型。我们将开发一个非常非标准的模型;一个生成绘制图形的模型,以展示自定义 PyFunc 模型的灵活性。最后,我们将拥有一个功能性的 Lissajous 曲线生成器,它被包装并在 Pyfunc 框架内管理。
您将学到什么
- 定义自定义 PyFunc 模型:探索
PythonModel
类的结构及其基本方法。 - 了解 Pyfunc 组件:熟悉 Pyfunc 风味的基本构建块。
- 保存和加载模型:体验 MLflow 存储和检索功能的无缝集成。
- 使用自定义逻辑进行预测:与加载的自定义 Pyfunc 接口,以生成有趣的 Lissajous 曲线图。
PythonModel
类
MLflow 对灵活性和标准化的承诺通过 PythonModel
类得以体现。这个类对于 Pyfunc 风味至关重要,它提供了定义自定义逻辑、加载资源和进行预测的必要支架。
有两种主要方法可以创建 PythonModel 的实例
- 基于类的方法:定义一个具有必要方法的类,并将其用作模型的蓝图。
- 基于函数的方法:将整个预测逻辑捕获在单个函数中,让 MLflow 处理其余的事情。
对于本教程,我们将重点关注基于类的方法,深入研究诸如 load_context
和 predict
之类的方法,并了解它们在更大生态系统中的作用。
Lissajous 曲线
作为我们理解的载体,我们将采用 Lissajous 曲线——正弦参数曲线,其形状和方向由其参数决定。这种数学曲线不是传统的机器学习模型,它将展示 Pyfunc 风味的多功能性和强大功能。
分步指南
- 定义自定义 PyFunc 模型:我们首先创建一个 Python 类,封装生成 Lissajous 曲线的逻辑。
- 保存模型:定义模型后,我们利用 MLflow 的功能来保存它,确保未来的可重现性。
- 加载模型:从存储中检索模型,并准备进行预测。
- 生成曲线:使用加载的模型来创建和可视化 Lissajous 曲线,展示 Pyfunc 风味的端到端功能。
总结
通过一个实际的例子,MLflow 的自定义 Pyfunc 的强大功能和灵活性显而易见。无论您是使用传统的机器学习模型还是 Lissajous 曲线生成器之类的独特用例,Pyfunc 都能确保标准化、可重现且高效的工作流程。
查看 Notebook覆盖模型的预测方法
简介
深入研究使用 MLflow 的自定义 PyFuncs 领域,本教程解决了模型部署中的一个常见挑战:在序列化和部署后,保留和自定义模型预测方法的行为。利用 MLflow 的 PyFunc 风味的强大功能,我们将学习如何覆盖默认的 predict 行为,确保我们的模型在部署在不同环境中时保留其所有原始功能。
您将学到什么
- 默认 PyFuncs 的挑战:认识到具有复杂模型的默认 PyFunc 行为的局限性,尤其是在 predict 之外的方法至关重要时。
- 自定义 Predict 方法:发现覆盖默认 predict 方法的技术,从而支持各种预测方法。
- 将 Joblib 与 PyFunc 结合使用:了解为什么 joblib 优于 pickle 来序列化 scikit-learn 模型,以及如何将其与 PyFunc 集成。
- 使用参数进行动态预测:通过接受指示预测类型的参数,学习使 predict 方法更加通用。
为什么要覆盖 predict?
模型,尤其是在 scikit-learn 之类的库中,通常带有多种预测方法,例如 predict,predict_proba 和 predict_log_proba。在部署此类模型时,必须保留动态选择预测方法的灵活性。本节阐明了对此类灵活性的需求以及默认 PyFunc 部署所面临的挑战。
创建自定义 PyFunc
进入解决方案,我们通过扩展 MLflow 的 PythonModel 来创建自定义 PyFunc。这个自定义类充当原始模型的包装器,提供了一个灵活的 predict 方法,该方法可以模拟基于所提供参数的各种原始方法的行为。
分步指南
- 准备基本模型:使用 Iris 数据集创建一个简单的 Logistic Regression 模型,以说明不同的预测方法。
- 默认部署的挑战:认识到将模型部署为默认 PyFunc 时的局限性。
- 创建自定义 PyFunc:设计一个 ModelWrapper 类,该类可以在预测方法之间动态切换。
- 保存和加载自定义模型:与 MLflow 集成以保存自定义 PyFunc 并加载它以进行预测。
- 动态预测:测试加载的模型,确保它支持所有原始预测方法。
总结
本教程克服了默认部署的挑战,展示了 MLflow 中自定义 PyFuncs 的强大功能。覆盖和自定义预测方法的能力确保了我们部署的模型与它们的原始版本一样通用和强大。随着 ML 工作流程的复杂性不断提高,这种自定义变得非常宝贵,从而确保了我们的部署是稳健且适应性强的。
查看 Notebook如果您想运行本教程系列中的 notebook,每个 notebook 页面都有一个链接,可以将 notebook 下载到您的计算机本地。
为了运行 notebook,请确保您已经启动了本地 MLflow Tracking Server,或者修改 mlflow.set_tracking_uri()
值以指向 MLflow Tracking Server 的正在运行的实例。为了与 MLflow UI 交互,请确保您要么在本地运行 UI 服务器,要么具有已配置的已部署 MLflow UI 服务器,您可以访问它。