在单个端点上使用自定义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 中使用的工件,这些工件可以在评估输入时被 predict() 使用。当使用 load_model() 加载 MLflow 模型时,此方法会在 PythonModel 构造完成后立即被调用。在我们的示例中,此方法将从 MLflow 模型注册表中加载我们的模型。

  • PythonModel.predict(): 此方法评估一个兼容pyfunc的输入并生成一个兼容pyfunc的输出。在我们的示例中,它分析输入的有效载荷,并根据其参数选择并应用适当的模型以返回预测结果。

  • 模型签名: 此类定义了预期的输入、输出和参数格式。在我们的示例中,签名对象将在注册我们的自定义 PyFunc 模型时传递,并且模型的输入将根据签名进行验证。

准备好实际操作了吗?查看配套的笔记本,获得亲身体验。让我们开始吧!

View the Notebook