跳到主要内容

使用自定义 PyFunc 模型在单个端点上提供多个模型服务

本教程解决了机器学习中一个常见场景:通过单个端点服务多个模型。利用诸如 Sagemaker 的多模型端点等服务,您可以在一个端点下托管大量模型,从而简化部署并降低成本。我们将使用任何 MLflow 兼容的服务结合自定义 PyFunc 实现来复制此功能。

提示

MLflow 2.12.2 引入了“代码中的模型”功能,通过脚本序列化大大简化了序列化和部署自定义模型的过程。尽管此处的教程作为参考点很有价值,但我们强烈建议将自定义模型实现迁移到这种新范例。您可以在代码中的模型指南中了解有关代码中的模型的更多信息。

以下是一些考虑此设计的原因

  • 简化的推理:我们将维护一个模型端点,而不是每个模型一个,这将大大降低维护和配置的复杂性。
  • 降低服务成本:端点需要花钱!如果您的托管服务对计算收费而不是内存收费,这将为您节省资金。

本教程包含哪些内容?

本指南将引导您完成从单个端点服务多个模型的步骤,将过程分解为

  1. 创建多个演示 sklearn 模型,每个模型都在对应于一周中某一天的数据上进行训练。
  2. 将这些模型包装在自定义 PyFunc 模型中以支持多模型推理。
  3. 对自定义 PyFunc 模型执行推理。
  4. 在本地服务自定义 PyFunc 模型并查询我们的端点。

完成本教程后,您将能够有效地从单个端点服务多个模型。

什么是 PyFunc?

自定义 PyFunc 模型是一项强大的 MLflow 功能,使用户可以在缺少命名风格的情况下自定义模型功能。接下来,我们假设您对 PyFunc 具有基本的了解,如果您不熟悉,请查看创建自定义 PyFunc教程。

我需要做什么?

要创建 MME,您需要创建 PythonModel 的子实现。更具体地说,我们需要关注以下组件……

  • PythonModel.load_context():此方法定义来自指定 PythonModelContext 的 artifacts,这些 artifacts 可由 predict() 在评估输入时使用。使用 load_model() 加载 MLflow 模型时,一旦构造 PythonModel,就会立即调用此方法。在我们的示例中,此方法将从 MLflow 模型注册表中加载我们的模型。
  • PythonModel.predict():此方法评估 pyfunc 兼容的输入并生成 pyfunc 兼容的输出。在我们的示例中,它会分析输入有效负载,并根据其参数选择并应用适当的模型以返回预测。
  • ModelSignatures:此类定义了预期的输入、输出和参数格式。在我们的示例中,注册我们的自定义 PyFunc 模型时将传递签名对象,并且将根据签名验证模型的输入。

准备好看看实际效果了吗?查看随附的笔记本以获得实践经验。让我们开始吧!

查看 Notebook