模型服务端点的快速部署

本页介绍如何在你的模型服务端点上使用快速部署。 快速部署降低了部署时间,并使模型服务环境与模型训练环境相同。

注释

Express 部署以前称为无服务器优化部署。

什么是快速部署?

在模型注册期间,快速部署会在无服务器笔记本环境中打包并暂存模型工件。 这加快了终结点部署的速度,使训练和服务环境保持一致。

在非快速部署中,模型项目和环境在部署时打包到容器中,因此服务环境可能与模型训练期间使用的环境不匹配。

标准部署与快速部署

下表比较了标准部署和快速部署。

方面 标准部署 快速部署
当环境构建时 容器映像在部署时生成。 注册模型时,会将工件和环境一并打包。
培训和服务环境 服务环境可能与训练环境不匹配。 服务环境与从中注册的笔记本环境相同。
部署速度 更慢。 部署等待容器映像生成。 更快。 部署跳过容器映像生成。
注册速度 标准。 根据模型和环境大小,打包时间会增加几秒到一分钟不等。
部署事件日志 显示容器映像创建事件。 不显示容器映像创建事件。

快速部署将一次性打包工作前移到模型注册阶段,这会使一次 register_model 调用增加几秒到一分钟的耗时,具体取决于模型和环境大小。 在交换中, 部署速度要快得多:它完全跳过容器映像生成。 该构建过程也是部署失败的常见原因(例如依赖项解析问题、镜像构建错误),因此跳过它可以避免一大类问题。 快速模型的部署事件日志不包含容器生成事件。

Requirements

快速部署终结点的要求与模型服务终结点的要求相同。 请参阅 要求

此外:

  • 模型必须是 自定义模型
  • 必须使用版本 3 或更高版本在无服务器笔记本中记录和注册模型
  • 必须记录模型并将其注册到mlflow>=3.12databricks-sdk>=0.102.0
  • 模型必须在 Unity 目录中注册。 用于提供服务的计算资源必须与注册模型时所使用的计算资源一致。 可以从常规无服务器笔记本注册,以在 CPU 上提供服务,也可以从 无服务器 GPU 计算进行注册 ,以在 GPU 上提供服务。
  • 模型的最大环境大小为 200GB

注释

若要使用快捷部署在 GPU 算力上提供自定义 LLM,请参阅通过自定义模型服务提供自定义 LLM

在 GPU 上部署重排序器

本演练将部署 BAAI/bge-reranker-base,一种跨编码器重排器,用于评估文档对查询的回答效果。 它会设置环境、记录日志,并使用 express 打包方式注册模型,然后部署终结点并查询该终结点。

GPU 部署通常由于依赖项版本冲突(例如 torch 和 CUDA)而失败。 快速部署可通过两种方式解决此问题:

  • 在提供服务时,每个无服务器 GPU 环境版本中预安装的固定且已发布的库集合与笔记本中的完全一致——环境版本相同,库版本也相同。 这些库未重新打包。
  • 在笔记本会话(例如,使用 %pip install)中安装的任何额外依赖项在注册期间打包,并在服务期间还原。

这意味着,在笔记本中运行的模型在部署并对外提供服务后仍能正常运行。

步骤 1:设置无服务器 GPU 笔记本

无服务器 GPU 计算环境 上创建一个使用 A10 GPU 的笔记本,并选择 环境版本 5,AI 环境。 AI 环境包括 PyTorch 和常见的机器学习库(torchtransformers等)。 有关确切固定的版本,请参阅 无服务器 GPU 环境版本 5(预览版)。

安装快速部署所需的包:

# Express deployment requires recent MLflow and Databricks SDK versions.
%pip install "mlflow>=3.12" "databricks-sdk>=0.102.0"
# Install the libraries your model needs. transformers is preinstalled in the
# v5 AI environment; install it explicitly because this model depends on it.
%pip install transformers
%restart_python

还可以通过 无服务器环境声明依赖项,但在笔记本中安装是最简单的路径。 针对环境的固定版本进行开发,使笔记本环境与服务环境匹配。

由于此模型在 GPU 上提供,因此必须从无服务器 GPU 运行时记录并注册该模型。 如果你不小心从无服务器 CPU 计算环境中进行记录,模型会连同 CPU 依赖项一起打包,导致 GPU 服务端点无法启动。 添加以下检查,以便在笔记本未使用 GPU 运行时时立即报错:

import os

# This model is intended to be served on GPU, so we must log and register from a Serverless GPU runtime.
if not os.environ.get("DATABRICKS_ACCELERATOR"):
    raise RuntimeError(
        "This model MUST be logged+registered from a serverless GPU runtime, otherwise the correct dependencies will not be packaged for serving."
    )

注释

之所以需要进行此检查,仅仅是因为重排序器部署在 GPU 上。 CPU 模型不需要它。

步骤 2:使用 MLflow 记录模型

将重排序器以 text-classification 管道的形式加载,并使用原生 mlflow.transformers 风格对其进行记录。 原生 flavor 会自动识别并收集模型的 pip 依赖,并支持在 GPU 上运行。 无需设置 pip_requirements、a task或入口点。

import mlflow
from transformers import pipeline

# BAAI/bge-reranker-base is a cross-encoder reranker: it scores how well a document answers a query.
pipe = pipeline("text-classification", model="BAAI/bge-reranker-base")

model_info = mlflow.transformers.log_model(
    transformers_model=pipe,
    name="bge_reranker",
    input_example={
        "text": "What is Databricks?",
        "text_pair": "Databricks is a data and AI company.",
    },
)

Important

请勿使用 log_modelregistered_model_name 参数注册该模型。 该参数不接受 env_pack,因此注册的是非 Express 模型。 若要启用快速部署,请通过 register_model(步骤 3)单独注册,该步骤接受 env_pack

步骤 3:使用快速打包将模型注册到 Unity 目录

将模型注册到 Unity 目录并设置 env_pack 参数以启用快速部署。 这会打包模型工件以及你在注册期间添加到笔记本会话中的依赖项,因此在提供服务时,会在环境版本预装库的基础上复用它们。

import mlflow
from mlflow.utils.env_pack import EnvPackConfig

mlflow.set_registry_uri("databricks-uc")

model_version = mlflow.register_model(
    model_uri=model_info.model_uri,
    name="main.default.bge_reranker",
    env_pack=EnvPackConfig(name="databricks_model_serving"),
)

可以使用字符串简写 env_pack="databricks_model_serving" 代替 EnvPackConfig(name="databricks_model_serving")。 对于没有 Internet 访问权限或具有自定义库的工作区,请设置install_dependencies=False(请参阅参数env_pack)。

注册时需要databricks-sdk>=0.102.0。 较早版本在上传大型模型构件时可能会超时。

步骤 4:创建服务终结点

使用 Azure Databricks SDK 部署已注册的模型。 此部署步骤与任何自定义模型相同 , 只有注册步骤 (步骤 3) 与 Express 不同。

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.serving import (
    EndpointCoreConfigInput,
    ServedEntityInput,
    ServingModelWorkloadType,
)

ENDPOINT_NAME = "bge-reranker-endpoint"

w = WorkspaceClient()
w.serving_endpoints.create_and_wait(
    name=ENDPOINT_NAME,
    config=EndpointCoreConfigInput(
        name=ENDPOINT_NAME,
        served_entities=[
            ServedEntityInput(
                name="bge-reranker",
                entity_name=model_version.name,
                entity_version=model_version.version,
                workload_type=ServingModelWorkloadType.GPU_SMALL,
                workload_size="Small",
                scale_to_zero_enabled=False,
            )
        ],
    ),
)

create_and_wait 会一直阻塞,直到端点准备就绪。 GPU_SMALL 对于此重排器来说已经足够。 由于服务重复使用同一环境版本并还原在笔记本中添加的依赖项,因此无论 GPU 类型如何,服务模型都会针对所开发的同一库版本运行。

在终结点部署时,在“服务”UI 中打开终结点的“ 事件 ”选项卡。 由于这是快速部署,因此事件日志中不会显示容器镜像创建事件(标准部署中会先显示 Container image creation initiated,然后显示 Container image creation finished successfully)。 终结点完成后,其状态会显示 “就绪”。

步骤 5:查询终结点

交叉编码器会对查询和文档进行评分,因此请发送 texttext_pair 字段。 使用 Databricks SDK 或 curl 以编程方式 查询。

Databricks SDK

w.serving_endpoints.query(
    name=ENDPOINT_NAME,
    dataframe_records=[
        {"text": "What is Databricks?", "text_pair": "Databricks is a data and AI company."},
    ],
)

curl

curl -X POST \
  -u "token:$DATABRICKS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"dataframe_records":[{"text":"What is Databricks?","text_pair":"Databricks is a data and AI company."}]}' \
  https://<workspace-url>/serving-endpoints/bge-reranker-endpoint/invocations

该端点会为每个查询-文档对返回一个相关性评分;评分越高,表示匹配度越高。 使用这些分数重新调整候选文档。

示例笔记本

导入以下笔记本,以完整运行本演练。

Express 重排序器入门笔记本

获取笔记本

env_pack 参数

上面的快速入门展示了一个用于 GPU 模型的快速部署示例。 快速部署也适用于 CPU 模型。 在所有情况下,都是通过将 env_pack 传递给 register_model 来启用快速部署:

import mlflow
from mlflow.utils.env_pack import EnvPackConfig

mlflow.register_model(
    model_info.model_uri,
    model_name,
    env_pack=EnvPackConfig(name="databricks_model_serving"),
)

env_pack 会打包并暂存模型工件以及你在注册时添加到笔记本会话中的依赖项,因此,注册所需的时间会比不使用 env_pack 的调用更长。

EnvPackConfig 接受参数 install_dependenciesTrue 默认情况下)。 当 True 时,会在当前环境中安装该模型的依赖项,以确认该环境有效。

注释

在无法访问 Internet 的工作区中,或者当模型依赖于自定义库时,如果 install_dependenciesTrue,注册可能会失败。 在这些情况下,设置 install_dependenciesFalse.

您可以用字符串 "databricks_model_serving" 替代 EnvPackConfig(...),作为简写。 它等效于 EnvPackConfig(name="databricks_model_serving", install_dependencies=True).