オンライン予測にプライベート エンドポイントを使用する

プライベート エンドポイントを使用して Vertex AI でオンライン予測を処理すると、Vertex AI オンライン予測サービスとの接続を完全かつ低レイテンシで行うことができます。このガイドでは、VPC ネットワーク ピアリングを使用して Vertex AI オンライン予測サービスとネットワークをピアリングすることで、Vertex AI でプライベート エンドポイントを構成する方法について説明します。

概要

プライベート エンドポイントを使用してオンライン予測を行う前に、お使いのネットワークと Vertex AI の間でピアリング接続を確立するようにプライベート サービス アクセスを構成する必要があります。すでに設定している場合は、既存のピアリング接続を使用できます。

このガイドでは、次のタスクについて説明します。

  • 既存のピアリング接続のステータスを確認する。
  • 必要な API が有効になっていることを確認する。
  • プライベート エンドポイントを作成する。
  • プライベート エンドポイントにモデルをデプロイする。
    • プライベート エンドポイントごとに 1 つのモデルのみがサポートされます。これは、1 つのエンドポイントにデプロイされた複数のモデル間でトラフィックを分割できる Vertex AI パブリック エンドポイントとは異なります。
    • プライベート エンドポイントは、AutoML 表形式モデルとカスタム トレーニング モデルをサポートしています。
  • プライベート エンドポイントに予測を送信する。
  • リソースをクリーンアップする

既存のピアリング接続のステータスを確認する

Vertex AI で使用しているピアリング接続がすでに存在する場合は、それらを一覧表示してステータスを確認できます。

gcloud compute networks peerings list --network NETWORK_NAME

ピアリング接続の状態が ACTIVE になっているはずです。詳しくは、アクティブなピアリング接続をご覧ください。

必要な API を有効にする

gcloud services enable aiplatform.googleapis.com
gcloud services enable dns.googleapis.com

プライベート エンドポイントを作成する

プライベート エンドポイントを作成するには、Google Cloud CLI を使用してエンドポイントを作成するときに --network フラグを追加します。

gcloud beta ai endpoints create \
  --display-name=ENDPOINT_DISPLAY_NAME \
  --network=FULLY_QUALIFIED_NETWORK_NAME \
  --region=REGION

NETWORK_NAME は、完全修飾ネットワーク名に置き換えます。

projects/PROJECT_NUMBER/global/networks/NETWORK_NAME

ネットワークを指定せずにエンドポイントを作成する場合は、パブリック エンドポイントを作成します。

プライベート エンドポイントの制限事項

プライベート エンドポイントには次の制限事項があります。

  • 現在、プライベート エンドポイントはトラフィック分割をサポートしていません。回避策として、複数のプライベート エンドポイントにモデルをデプロイして、各プライベート エンドポイントで生成された予測 URL 間でトラフィックを分割することで、トラフィック分割を手動で作成できます。
  • プライベート エンドポイントは SSL/TLS をサポートしていません。
  • プライベート エンドポイントでアクセス ロギングを有効にする場合は、vertex-ai-feedback@google.com までご連絡ください。
  • 1 つの Google Cloud プロジェクトで、すべてのプライベート エンドポイントに使用できるネットワークは 1 つだけです。別のネットワークに変更する場合は、vertex-ai-feedback@google.com までご連絡ください。
  • 回復可能なエラーの場合は、クライアント側での再試行を強くおすすめします。たとえば、次のようなエラーが考えられます。
    • 空のレスポンス(HTTP エラーコード 0)。接続が一時的に切断された可能性があります。
    • サービスが一時的に利用できない可能性があることを示す HTTP エラーコード 5xx
  • システムが現在過負荷になっていることを示す HTTP エラーコード 429 の場合は、再試行ではなく、トラフィックの速度を遅くすることを検討してください。
  • Vertex AI Python クライアント ライブラリPredictionServiceClient からの予測リクエストはサポートされていません。

プライベート エンドポイントをモニタリングする

指標ダッシュボードを使用すると、プライベート エンドポイントに送信されたトラフィックの可用性とレイテンシを調べることができます。

モニタリングをカスタマイズするには、Cloud Monitoring で次の 2 つの指標をクエリします。

  • aiplatform.googleapis.com/prediction/online/private/response_count

    予測レスポンスの数。この指標は、deployed_model_id または HTTP レスポンス コードでフィルタできます。

  • aiplatform.googleapis.com/prediction/online/private/prediction_latencies

    予測リクエストのレイテンシ(ミリ秒単位)。この指標は、成功したリクエストに対してのみ deployed_model_id でフィルタできます。

Metrics Explorer でこれらの指標を選択、クエリ、表示する方法をご確認ください。

モデルをデプロイする

新しいモデルをインポートすることも、すでにアップロードされている既存のモデルをデプロイすることもできます。新しいモデルをアップロードするには、gcloud ai models upload を使用します。詳細については、Vertex AI にモデルをインポートするをご覧ください。

  1. プライベート エンドポイントにモデルをデプロイするには、モデルをデプロイするに関するガイドをご覧ください。トラフィック分割と手動でのアクセス ロギングの有効化に加えて、カスタム トレーニング モデルのデプロイで他のオプションも使用できます。パブリック エンドポイントとの違いについては、プライベート エンドポイントの制限事項をご覧ください。

  2. エンドポイントをデプロイすると、プライベート エンドポイントのメタデータから予測 URI を取得できます。

    1. プライベート エンドポイントの表示名がわかっている場合は、次のコマンドを実行してエンドポイント ID を取得します。

      ENDPOINT_ID=$(gcloud ai endpoints list \
                --region=REGION \
                --filter=displayName:ENDPOINT_DISPLAY_NAME \
                --format="value(ENDPOINT_ID.scope())")
      

      すべてのエンドポイントの ID と表示名を確認するには、次のコマンドを実行します。

      gcloud ai endpoints list --region=REGION
      
    2. 最後に、次のコマンドを実行して、予測 URI を取得します。

      gcloud beta ai endpoints describe ENDPOINT_ID \
        --region=REGION \
        --format="value(deployedModels.privateEndpoints.predictHttpUri)"
      

プライベート予測 URI の形式

プライベート エンドポイントと Vertex AI パブリック エンドポイントでは、予測 URI が異なります。

http://ENDPOINT_ID.aiplatform.googleapis.com/v1/models/DEPLOYED_MODEL_ID:predict

現在のモデルのデプロイを解除して新しいモデルで再デプロイすると、ドメイン名は再利用されますが、デプロイされた別のモデル ID がパスに含まれます。

プライベート エンドポイントに予測を送信する

  1. VPC ネットワーク内に Compute Engine インスタンスを作成します。Vertex AI とピアリングした VPC ネットワークにインスタンスを作成します。

  2. Compute Engine インスタンスに SSH で接続し、予測クライアントをインストールします(該当する場合)。それ以外の場合は、curl を使用できます。

  3. 予測を行うときに、モデルのデプロイから取得した予測 URL を使用します。この例では、同じ VPC ネットワーク内にある Compute Engine インスタンスの予測クライアントからリクエストを送信します。

    curl -X POST -d@PATH_TO_JSON_FILE  http://ENDPOINT_ID.aiplatform.googleapis.com/v1/models/DEPLOYED_MODEL_ID:predict
    

    このサンプル リクエストでは、PATH_TO_JSON_FILE は予測リクエストのパスで、JSON ファイルとして保存されます。例: example-request.json

リソースのクリーンアップ

パブリック モデルやエンドポイントの場合と同じ方法で、モデルのデプロイ解除とプライベート エンドポイントの削除を行うことができます。後でこれらのリソースを自分で削除した場合でも、プライベート エンドポイントを作成できるネットワークは Google Cloud プロジェクトごとに 1 つだけです。別のネットワークに切り替える必要がある場合は、vertex-ai-feedback@google.com までお問い合わせください。

例: 共有 VPC でのプライベート エンドポイントのテスト

この例では、共有 VPC ネットワークを持つ 2 つの Google Cloud プロジェクトを使用します。

  • ホスト プロジェクトには共有 VPC ネットワークをホストします。
  • クライアント プロジェクトには Compute Engine インスタンスをホストします。この Compute Engine インスタンスで予測クライアント(curl など)または独自の REST クライアントを実行して、予測リクエストを送信します。

クライアント プロジェクトに Compute Engine インスタンスを作成する場合は、ホスト プロジェクトの共有 VPC ネットワークのカスタム サブネット内にあり、モデルがデプロイされるリージョンに配置する必要があります。

  1. ホスト プロジェクトでプライベート サービス アクセス用のピアリング接続を作成します。gcloud services vpc-peerings connect を実行します。

    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --network=HOST_SHARED_VPC_NAME \
      --ranges=PREDICTION_RESERVED_RANGE_NAME \
      --project=HOST_PROJECT_ID
    
  2. ホスト プロジェクトのネットワーク名を使用して、クライアント プロジェクトにエンドポイントを作成します。gcloud beta ai endpoints create を実行します。

    gcloud beta ai endpoints create \
      --display-name=ENDPOINT_DISPLAY_NAME \
      --network=HOST_SHARED_VPC_NAME \
      --region=REGION \
      --project=CLIENT_PROJECT_ID
    
  3. クライアント プロジェクト内で予測クライアントを使用して、予測リクエストを送信します。

例: RFC 1918 以外のサブネットを使用するプライベート エンドポイント

この例では、RFC 1918 以外のアドレスを使用してプライベート エンドポイントを作成します。

  1. ノード、Pod、Service の IP 範囲を予約します。ノードの IP 範囲は RFC 1918 範囲である必要があります。

  2. 予約済み範囲を使用して、限定公開サービス アクセスのピアリング接続を作成します。

    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --network=VPC_NAME \
      --ranges=NODES_RANGE_NAME,PODS_RANGE_NAME,SERVICES_RANGE_NAME \
      --project=PROJECT_ID
    
  3. ノード、Pod、Service の予約範囲を指定してエンドポイントを作成します。RequestedIpRangeConfig は REST API でのみ指定できます。

    # Sample json request for endpoint creation.
    {
      displayName: "my_endpoint",
      network: "projects/<project_num>/global/networks/<network>",
      requestedIpRangeConfig: {
        nodesIpRange: {
          ipAddress: "xxx.xx.x.x",
          ipPrefixLength: 22
        },
        podsIpRange: {
          ipAddress: "yyy.yy.y.y",
          ipPrefixLength: 17
        },
        servicesIpRange: {
          ipAddress: "zzz.zz.z.z",
          ipPrefixLength: 22
        }
      }
    }
    
  4. クライアント プロジェクト内で予測クライアントを使用して、予測リクエストを送信します。