跳到主内容

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

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

提示

MLflow 2.12.2 引入了“代码模型 (models from code)”功能,通过使用脚本序列化极大地简化了自定义模型的序列化和部署过程。虽然本教程具有参考价值,但我们强烈建议将自定义模型的实现迁移到这种新范例。您可以在代码模型指南中了解有关代码模型的更多信息。

考虑此设计的一些原因如下

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

本教程包含哪些内容?

本指南将引导您完成从单个端点服务多个模型的步骤,将流程分解为以下几个方面:

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

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

什么是 PyFunc?

自定义 PyFunc 模型是 MLflow 的一个强大功能,它允许用户在缺乏命名风格 (flavors) 的情况下自定义模型功能。后续我们将假设您具备 PyFunc 的基础工作知识,如果您不熟悉,请参阅创建自定义 PyFunc 教程。

我需要做什么?

要创建一个多模型端点 (MME),您需要创建 PythonModel 的子类实现。更具体地说,我们需要关注以下组件:

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

准备好在实践中一探究竟了吗?请查看随附的 notebook 以获得动手体验。让我们开始吧!

查看 Notebook