使用自定义 PyFunc 模型在单个端点上服务多个模型
本教程探讨了机器学习中的一个常见场景:通过单个端点服务多个模型。利用像 Sagemaker 的多模型端点这样的服务,您可以在一个端点下托管大量模型,从而简化部署并降低成本。我们将使用任何与 MLflow 兼容的服务结合自定义 PyFunc 实现来重现此功能。
提示
MLflow 2.12.2 引入了“代码模型 (models from code)”功能,通过使用脚本序列化极大地简化了自定义模型的序列化和部署过程。虽然本教程具有参考价值,但我们强烈建议将自定义模型的实现迁移到这种新范例。您可以在代码模型指南中了解有关代码模型的更多信息。
考虑此设计的一些原因如下
- 简化推理:我们将维护单个模型端点,而不是每个模型一个端点,这极大地降低了维护和预置的复杂性。
- 降低服务成本:端点是需要花钱的!如果您的托管服务按计算能力而不是内存收费,这将为您节省资金。
本教程包含哪些内容?
本指南将引导您完成从单个端点服务多个模型的步骤,将流程分解为以下几个方面:
- 创建多个演示用的 sklearn 模型,每个模型都在对应一周中某一天的特定数据上进行训练。
- 将这些模型封装在一个自定义 PyFunc 模型中,以支持多模型推理。
- 对自定义 PyFunc 模型执行推理。
- 在本地服务自定义 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