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