使用模型服务部署 Python 代码

本文介绍如何使用 马赛克 AI 模型服务部署自定义的 Python 代码。 本文中的示例重点介绍如何向模型添加预处理和后处理逻辑并将其部署。

MLflow 的 Python 函数 pyfunc提供了部署任何 Python 代码或任何 Python 模型的灵活性。 下面是你可能需要该指南的示例方案。

  • 模型需要预处理,然后才能将输入传递给模型的预测函数。
  • MLflow 不原生支持你的模型框架。
  • 应用程序需要对模型的原始输出进行后期处理以供使用。
  • 模型本身具有按请求分支逻辑。
  • 你希望将完全自定义代码部署为模型。

构造自定义 MLflow Python 函数模型

MLflow 提供 自定义 Python 模型格式记录 Python 代码的功能。

使用 MLflow 打包任意 Python 代码时,需要两个函数:

  • load_context - 需要只加载一次模型操作的任何内容都应在此函数中定义。 这一点至关重要,以便系统最大程度地减少在 predict 函数期间加载的项目数,从而加快推理速度。
  • predict - 此函数包含每次发出输入请求时运行的所有逻辑。

记录 Python 函数模型

即使使用自定义代码编写模型,也可以从组织使用共享代码模块。 使用 code_path 参数,模型作者可以记录加载到路径中的完整代码引用,并且可从其他自定义 pyfunc 模型使用。

例如,如果模型通过此项记录:

mlflow.pyfunc.log_model(CustomModel(), "model", code_path = ["preprocessing_utils/"])

preprocessing_utils 中的代码在模型的加载上下文中可用。 下面是使用此代码的示例模型。

class CustomModel(mlflow.pyfunc.PythonModel):
    def load_context(self, context):
        self.model = torch.load(context.artifacts["model-weights"])
        from preprocessing_utils.my_custom_tokenizer import CustomTokenizer
        self.tokenizer = CustomTokenizer(context.artifacts["tokenizer_cache"])

    def format_inputs(self, model_input):
        # insert some code that formats your inputs
        pass

    def format_outputs(self, outputs):
        predictions = (torch.sigmoid(outputs)).data.numpy()
        return predictions

    def predict(self, context, model_input):
        model_input = self.format_inputs(model_input)
        outputs = self.model.predict(model_input)
        return self.format_outputs(outputs)

提供你的模型

记录自定义 pyfunc 模型后,可以将其注册到 Unity Catalog 或工作区注册表,并将模型服务到 模型服务终结点

笔记本示例

以下笔记本示例演示如何在需要后期处理查询模型的原始输出以供使用时自定义模型输出。

使用 MLflow PyFunc 笔记本自定义模型服务的输出

获取笔记本