将自定义预测例程迁移到 Vertex AI

本页面介绍如何将自定义预测例程 (CPR) 部署从 AI Platform 迁移到 Vertex AI。

具体而言,对于 AI Platform 上的 CPR 部署,本页面介绍如何执行以下操作:

  • 创建相应的自定义容器以在 Vertex AI 上进行部署。此自定义容器的工作方式与使用 CPR on Vertex AI 创建的任何自定义容器相同。
  • 在本地运行和测试自定义容器。
  • 将其上传到 Vertex AI Model Registry
  • 将模型部署到 Vertex AI Endpoint 以执行在线预测。

准备工作

  • 确保已安装以下软件:

  • 拥有要迁移到 Vertex AI 的 CPR on AI Platform 部署中的模型工件和自定义代码。

  • 拥有用于存储模型工件的 Cloud Storage 存储桶。

  • 确保已在项目中启用了 Vertex AI API。

    启用 Vertex AI API

准备 Vertex AI 部署的源文件夹

  1. 创建一个名为 model_artifacts 的本地文件夹,并复制 CPR on AI Platform 部署中的模型工件。这些模型工件应该与您部署 CPR on AI Platform 模型时在 deployment_uri(如果您使用 gcloud,则为 --origin)中指定的模型工件相同。

  2. 创建一个名为 cpr_src_dir 的本地文件夹。此文件夹将保存源分发软件包 adapter.pyrequirements.txt(如下所述),用于构建自定义容器以在 Vertex AI 上进行部署。

  3. 复制您在 AI Platform 上部署 CPR 时在 package_uris 中提供的所有软件包,包括包含 Predictor 类的软件包。

  4. 创建一个包含 AdapterPredictoradapter.py 文件(如下所示),并将 PREDICTION_CLASS 设置为 Predictor 的完全限定名称。此值与在 AI Platform 上部署 CPR 时的 prediction_class 相同。

    适配器封装了 CPR on AI Platform Predictor 接口,以便与 CPR on Vertex AI 接口兼容。

    import pydoc
    ​
    from google.cloud.aiplatform.utils import prediction_utils
    from google.cloud.aiplatform.prediction.predictor import Predictor
    ​
    # Fully qualified name of your CPR on CAIP Predictor class.
    PREDICTION_CLASS = "predictor.MyPredictor"
    ​
    class AdapterPredictor(Predictor):
      """Predictor implementation for adapting CPR on CAIP predictors."""
    ​
      def __init__(self):
          return
    ​
      def load(self, artifacts_uri: str):
          """Loads the model artifact.
    ​
          Args:
              artifacts_uri (str):
                  Required. The model artifacts path (may be local or on Cloud Storage).
          """
          prediction_utils.download_model_artifacts(artifacts_uri)
          custom_class = pydoc.locate(PREDICTION_CLASS)
          self._predictor = custom_class.from_path(".")
    ​
    ​
      def predict(self, instances):
          """Performs prediction.
    ​
          Args:
              instances (Any):
                  Required. The instance(s) used for performing prediction.
    ​
          Returns:
              Prediction results.
          """
          return self._predictor.predict(**instances)
    
  5. 创建一个包含模型依赖项的 requirements.txt 文件,例如:

    # Required for model serving
    google-cloud-storage>=1.26.0,<2.0.0dev
    google-cloud-aiplatform[prediction]>=1.16.0
    
    # ML dependencies
    numpy>=1.16.0
    scikit-learn==0.20.2
    

    第一部分列出了模型服务所需的依赖项。

    第二部分列出了模型服务所需的机器学习软件包(如 scikit-learn、xgboost、tensorflow 等)。确保安装的库版本与之前部署模型版本时选择的运行时版本下列出的版本相同。

  6. 在本地环境中安装依赖项

    pip install -U --user -r cpr_src_dir/requirements.txt 
    

将模型工件上传到 Cloud Storage

将模型工件上传到 Cloud Storage:

gsutil cp model_artifacts/* gs://BUCKET_NAME/MODEL_ARTIFACT_DIR

设置 Artifact Registry

Artifact Registry 用于存储和管理 Docker 容器映像。

  1. 确保已在项目中启用 Artifacts Registry API。

    启用 Artifacts Registry API

  2. 如果您还没有代码库,请创建一个。

    gcloud artifacts repositories create {REPOSITORY} \
        --repository-format=docker \
        --location={REGION}
    
  3. 如需推送或拉取映像,请将 Docker 配置为使用 Google Cloud CLI 对向 Artifact Registry 发出的请求进行身份验证。

    gcloud auth configure-docker {REGION}-docker.pkg.dev
    

构建、测试和部署自定义容器

以下 Python 脚本演示了如何使用 Vertex AI SDK 中的 API 构建、测试和部署自定义容器。确保设置脚本顶部的变量。

import json
import logging
import os

from google.cloud import aiplatform
from google.cloud.aiplatform.prediction import LocalModel
from cpr_src_dir.adapter import AdapterPredictor

##########################################################################
# CONFIGURE THE FOLLOWING
##########################################################################
# We recommend that you choose the region closest to you.
REGION = …
# Your project ID.
PROJECT_ID = …
# Name of the Artifact Repository to create or use.
REPOSITORY = …
# Name of the container image that will be pushed.
IMAGE = …
# Cloud Storage bucket where your model artifacts will be stored.
BUKCET_NAME = …
# Directory within the bucket where your model artifacts are stored.
MODEL_ARTIFACT_DIR = …
# Your model's input instances.
INSTANCES = …

##########################################################################
# Build the CPR custom container
##########################################################################
local_model = LocalModel.build_cpr_model(
    "cpr_src_dir",
    f"{REGION}-docker.pkg.dev/{PROJECT_ID}/{REPOSITORY}/{IMAGE}",
    predictor=AdapterPredictor,
    requirements_path="cpr_src_dir/requirements.txt",
    extra_packages=["cpr_src_dir/my_custom_code-0.1.tar.gz"],
)

##########################################################################
# Run and test the custom container locally
##########################################################################
logging.basicConfig(level=logging.INFO)

local_endpoint =
       local_model.deploy_to_local_endpoint(artifact_uri="model_artifacts")
local_endpoint.serve()

health_check_response = local_endpoint.run_health_check()

predict_response = local_endpoint.predict(
        request=json.dumps({"instances": INSTANCES}),
        headers={"Content-Type": "application/json"},
    )

local_endpoint.stop()

print(predict_response, predict_response.content)
print(health_check_response, health_check_response.content)
local_endpoint.print_container_logs(show_all=True)

##########################################################################
# Upload and deploy to Vertex
##########################################################################
local_model.push_image()

model = aiplatform.Model.upload(\
    local_model=local_model,
    display_name=MODEL_DISPLAY_NAME,
    artifact_uri=f"gs://{BUKCET_NAME}/{MODEL_ARTIFACT_DIR}",
)

endpoint = model.deploy(machine_type="n1-standard-4")

endpoint.predict(instances=INSTANCES)

详细了解 Vertex AI Prediction