模型服务的预部署验证

本文中的指南可帮助你在等待终结点部署过程之前捕获模型的问题。 Databricks 建议执行这些验证步骤,以确保在使用模型服务时获得更好的开发体验。

部署前测试预测

在将模型部署到服务终结点之前,请使用虚拟环境并使用 mlflow.models.predict 输入示例测试脱机预测。 MLflow 提供验证 API,用于模拟部署环境并允许测试修改的依赖项。

有两个预部署验证选项: MLflow Python APIMLflow CLI。 请参阅 MLflow 文档 以获取有关测试预测的更详细指导。

可以指定以下参数:

  • 部署到模型服务的模型的 model_uri
  • 以下其中一项:
    • 对模型进行 input_data 调用的预期格式的 mlflow.pyfunc.PyFuncModel.predict()
    • 定义包含将加载并用于调用 input_path 的输入数据的文件的 predict
  • content_typecsv 格式的 json
  • 用于将预测写入文件的可选 output_path。 如果省略此参数,则预测将输出到 stdout
  • 环境管理器, env_manager用于生成用于提供服务的环境:
    • 默认值为 virtualenv。 建议用于服务验证。
    • local 可用,但在进行服务验证时可能会出错。 通常用于快速调试。
  • 是否使用 install_mlflow 通过虚拟环境安装环境中当前版本的 MLflow。 此设置默认设置为 False
  • 是否更新和测试不同版本的包依赖项,以便进行故障排除或调试。 可以使用替代参数 pip_requirements_override 将其指定为一个字符串依赖项替代或添加项列表。

例如:

import mlflow

run_id = "..."
model_uri = f"runs:/{run_id}/model"

mlflow.models.predict(
  model_uri=model_uri,
  input_data={"col1": 34.2, "col2": 11.2, "col3": "green"},
  content_type="json",
  env_manager="virtualenv",
  install_mlflow=False,
  pip_requirements_override=["pillow==10.3.0", "scipy==1.13.0"],
)

更新模型依赖项

如果与记录的模型指定的依赖项存在任何问题,则可以使用 MLflow CLI 或在 mlflow.models.model.update_model_requirements() MLflow Python API 中更新要求,而无需记录另一个模型。

以下示例演示如何就地更新 pip_requirements.txt 已记录的模型。

可以使用指定的包版本更新现有定义,或者向 pip_requirements.txt 文件添加不存在的要求。 此文件位于指定 model_uri 位置的 MLflow 模型项目中。

from mlflow.models.model import update_model_requirements

update_model_requirements(
  model_uri=model_uri,
  operation="add",
  requirement_list=["pillow==10.2.0", "scipy==1.12.0"],
)

在部署之前验证模型输入

提供终结点的模型需要 JSON 输入的特殊格式。 可以在 MLflow 中使用 validate_serving_input 部署之前验证模型输入是否适用于服务终结点。

下面是如果您的模型配有有效输入示例进行记录时,在运行过程的工件选项卡中自动生成的代码示例。

from mlflow.models import validate_serving_input

model_uri = 'runs:/<run_id>/<artifact_path>'

serving_payload = """{
 "messages": [
   {
     "content": "How many product categories are there?",
     "role": "user"
   }
 ]
}
"""

# Validate the serving payload works on the model
validate_serving_input(model_uri, serving_payload)

还可以使用 convert_input_example_to_serving_input API 针对记录的模型测试任何输入示例,以生成有效的 JSON 服务输入。

from mlflow.models import validate_serving_input
from mlflow.models import convert_input_example_to_serving_input

model_uri = 'runs:/<run_id>/<artifact_path>'

# Define INPUT_EXAMPLE with your own input example to the model
# A valid input example is a data instance suitable for pyfunc prediction

serving_payload = convert_input_example_to_serving_input(INPUT_EXAMPLE)

# Validate the serving payload works on the model
validate_serving_input(model_uri, serving_payload)

手动测试为模型提供服务

可以使用以下步骤手动测试模型的服务行为:

  1. 打开笔记本并附加到使用 Databricks Runtime 版本的 All-Purpose 群集,而不是用于机器学习的 Databricks Runtime。
  2. 使用 MLflow 加载模型并尝试从那里进行调试。

还可以在电脑本地加载模型,并从那里进行调试。 使用以下内容在本地加载模型:

import os
import mlflow

os.environ["MLFLOW_TRACKING_URI"] = "databricks://PROFILE"

ARTIFACT_URI = "model_uri"
if '.' in ARTIFACT_URI:
    mlflow.set_registry_uri('databricks-uc')
local_path = mlflow.artifacts.download_artifacts(ARTIFACT_URI)
print(local_path)

conda env create -f local_path/artifact_path/conda.yaml
conda activate mlflow-env

mlflow.pyfunc.load_model(local_path/artifact_path)