カスタム予測ルーチンを Vertex AI に移行する

このページでは、カスタム予測ルーチン(CPR)のデプロイを AI Platform から Vertex AI に移行する方法について説明します。

このページでは、AI Platform で CPR をデプロイする際の手順について説明します。

  • Vertex AI へのデプロイ用に、対応するカスタム コンテナを作成します。このカスタム コンテナは、Vertex AI の CPR で作成されたカスタム コンテナと同様に機能します。
  • カスタム コンテナをローカルで実行してテストします。
  • Vertex AI Model Registry にアップロードします。
  • オンライン予測を提供するため、モデルを Vertex AI エンドポイントにデプロイします。

始める前に

  • 次のソフトウェアがインストールされていることを確認します。

  • Vertex AI に移行する AI Platform デプロイメントの CPR からのモデル アーティファクトとカスタムコードを用意します。

  • モデル アーティファクトを保存する Cloud Storage バケットを用意します。

  • プロジェクトで Vertex AI API が有効になっていることを確認します。

    Vertex AI API を有効にする

Vertex AI Deployment のソースフォルダを準備する

  1. model_artifacts という名前のローカル フォルダを作成し、AI Platform デプロイの CPR からモデル アーティファクトをコピーします。これは、AI Platform モデルに CPR をデプロイしたときに deployment_uri で指定したモデル アーティファクト(または gcloud を使用した場合は --origin)と同じになります。

  2. cpr_src_dir という名前のローカル フォルダを作成します。このフォルダには、Vertex AI でのデプロイ用でカスタム コンテナのビルドに使用されるソース配布パッケージ adapter.pyrequirements.txt(後述)が保存されます。

  3. AI Platform に CPR をデプロイしたときに package_uris で指定したすべてのパッケージ(Predictor クラスを含むパッケージ)をコピーします。

  4. 下記の AdapterPredictor を含む adapter.py ファイルを作成し、PREDICTION_CLASSPredictor の完全修飾名に設定します。この値は、AI Platform に CPR をデプロイしたときの prediction_class と同じです。

    アダプタが、AI Platform Predictor インターフェースで CPR をラップします。これにより、Vertex AI の CPR インターフェースとの互換性が維持されます。

    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
    

    最初のセクションには、モデルの提供に必要な依存関係を指定します。

    2 つ目のセクションには、モデルの提供に必要な ML パッケージを記述します(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. イメージを push または pull する前に、Google Cloud CLI を使用して Artifact Registry に対するリクエストを認証するように Docker を構成します。

    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 の詳細をご確認ください。