オンライン推論で予約を使用する

このドキュメントでは、Compute Engine の予約を使用して、オンライン推論ジョブの実行に必要な仮想マシン(VM)リソースを確実に用意する方法について説明します。

予約は Compute Engine の機能です。予約を使用すると、必要なときに同じハードウェア(メモリと vCPU)とオプションのリソース(CPU、GPU、TPU、ローカル SSD ディスク)を使用して VM を作成するためのリソースを確保できます。

予約を作成するときに、Compute Engine は、指定されたゾーンでリクエストされた容量が使用可能であることを確認します。使用可能な場合、Compute Engine はリソースを予約し、予約を作成します。これにより、次の処理が行われます。

  • 予約済みリソースはすぐに使用でき、予約を削除するまで使用可能となります。
  • 予約済みリソースは、予約が削除されるまで、実行中の VM と同じオンデマンド料金(適用される割引を含む)で課金されます。予約を使用する VM に対しては、別途料金は発生しません。ディスクや IP アドレスなど、予約外のリソースに対してのみ課金されます。詳細については、予約の料金をご覧ください。

制限事項と要件

Vertex AI で Compute Engine 予約を使用する場合は、次の制限と要件を考慮してください。

  • Vertex AI は、CPUGPU VM、または TPUプレビュー)の予約のみを使用できます。
  • Vertex AI は、ローカル SSD ディスクが手動でアタッチされている VM の予約を使用できません。
  • Vertex AI での Compute Engine 予約の使用は、カスタム トレーニングと推論、および Vertex AI Workbench(プレビュー)でのみサポートされています。
  • 予約を消費するには、予約の VM プロパティが Vertex AI ワークロードと完全に一致している必要があります。たとえば、予約で a2-ultragpu-8g マシンタイプを指定した場合、Vertex AI ワークロードは a2-ultragpu-8g マシンタイプも使用している場合にのみ、予約を消費できます。要件をご覧ください。
  • GPU VM または TPU の共有予約を使用するには、オーナー プロジェクトまたは予約を共有するコンシューマ プロジェクトを使用して消費する必要があります。共有予約の仕組みをご覧ください。
  • Vertex AI デプロイの定期的な更新をサポートするには、DeployedModel で使用される予約タイプに応じて、VM 数をレプリカの合計数よりも次のように増やすことをおすすめします。
    • SPECIFIC_RESERVATION: 少なくとも 1 つの追加 VM を指定する必要があります。10%(ただし、少なくとも 1 つ)をおすすめします。SPECIFIC_RESERVATION を使用してデプロイされたモデルは、予約の VM のみを使用することが保証されます。追加の VM がない場合、Vertex AI は更新を実行できません。
    • ANY:
      • ANY 予約を使用するデプロイ済みモデルは、予約容量が不足している場合にオンデマンド VM を使用するため、追加の VM は必要ありません。ただし、追加の VM がないと、アップグレード後に予約が完全に活用されない可能性があります。たとえば、40 個の VM を含む予約があり、その予約を使用して 40 個のレプリカを含むモデルをデプロイするとします。初回デプロイ時には、予約内の 40 個の VM がすべて DeployedModel によって使用されます。アップグレード後、予約から 36 台の VM、オンデマンドで 4 台の VM が使用されます。
      • 予約内の使用量を維持する場合は、予約を使用する DeployedModel または DeploymentResourcePool ごとに少なくとも 1 つの追加 VM を用意することをおすすめします。ANY 予約内の同じタイプの VM の合計数が 50 未満の場合は、10%(ただし、少なくとも 1 つ)増やすことをおすすめします。50 を超える場合は、25% 増やすことをおすすめします。次に例を示します。
        • 40 個の A3 VM を使用してモデルをデプロイする場合は、44 個の VM を含む 1 つの A3 予約を作成するか、2 つの A3 予約を作成できます。たとえば、30 個の VM を含む予約 X と 14 個の VM を含む予約 Y(合計 44 個)を作成できます。他の数の予約についても、すべてが Vertex AI と共有され、これらの予約の VM の合計数が 44 以上であれば、同様のことが当てはまります。
        • 100 台の A3 VM を使用してモデルをデプロイする場合は、Vertex AI と共有されているすべての A3 予約の VM の合計数が 125 以上である必要があります。
        • 10 個の VM を使用して 2 つのモデルをデプロイする場合は、Vertex AI と共有されているすべての A3 予約の VM の合計数が 12 個以上である必要があります。VM の数は 50 未満ですが、追加の VM の数は 2(DeployedModel あたり 1)です。
  • SPECIFIC_RESERVATION 予約を使用するには、予約を所有するプロジェクトの Vertex AI サービス アカウントに Compute 閲覧者 IAM ロールを付与します(service-${PROJECT_NUMBER}@gcp-sa-aiplatform.iam.gserviceaccount.com。ここで、PROJECT_NUMBER は予約を使用するプロジェクトのプロジェクト番号です)。

課金

Compute Engine 予約を使用すると、次の料金が発生します。

  • 適用される確約利用割引(CUD)を含む、Compute Engine リソースの Compute Engine の料金。Compute Engine の料金をご覧ください。
  • インフラストラクチャの使用料に加えて、Vertex AI オンライン推論の管理手数料。予測料金を参照。

始める前に

予約の使用を許可する

CPU、GPU VM、TPU の予約を使用する前に、Vertex AI が予約を使用できるように共有ポリシーを設定する必要があります。そのためには、次のいずれかの方法を使用します。

予約の作成中に使用を許可する

GPU VM の単一プロジェクトまたは共有予約を作成するときに、次のように Vertex AI が予約を消費することを許可できます。

  • Google Cloud コンソールを使用している場合は、[Google Cloud サービス] セクションで [予約を共有する] を選択します。
  • Google Cloud CLI を使用している場合は、ALLOW_ALL に設定された --reservation-sharing-policy フラグを指定します。
  • REST API を使用している場合は、リクエスト本文に ALLOW_ALL に設定された serviceShareType フィールドを含めます。

既存の予約で使用を許可する

将来の予約の GPU VM または TPU の自動作成予約は、予約の開始時間の後にのみ変更できます。

Vertex AI が既存の予約を使用できるようにするには、次のいずれかの方法を使用します。

予約が消費されていることを確認する

予約が消費されていることを確認するには、Compute Engine ドキュメントの予約の消費を確認するをご覧ください。

予約を使用してオンライン推論を取得する

GPU VM の Compute Engine 予約を使用するモデル デプロイを作成するには、REST API または Vertex AI SDK for Python を使用します。

REST

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION_ID: Vertex AI を使用するリージョン。
  • PROJECT_ID: 予約が作成されたプロジェクト。別のプロジェクトの共有予約を消費するには、そのプロジェクトと予約を共有する必要があります。詳細については、共有予約内のコンシューマ プロジェクトを変更するをご覧ください。
  • ENDPOINT_ID: エンドポイントの ID。
  • MODEL_ID: デプロイするモデルの ID。
  • DEPLOYED_MODEL_NAME: DeployedModel の名前。DeployedModelModel の表示名を使用することもできます。
  • MACHINE_TYPE: このデプロイの各ノードに使用するマシンタイプ。デフォルトの設定は n1-standard-2 です。サポートされているマシンタイプの詳細については、予測用のコンピューティング リソースを構成するをご覧ください。
  • ACCELERATOR_TYPE: マシンに接続するアクセラレータのタイプ。各マシンタイプがサポートする GPU の種類の詳細については、コンピューティング ワークロード用 GPU をご覧ください。
  • ACCELERATOR_COUNT: マシンに接続するアクセラレータの数。
  • RESERVATION_AFFINITY_TYPE: ANYSPECIFIC_RESERVATION、または NONE
    • ANY は、customJob の VM が、一致するプロパティを持つ予約を自動的に使用できることを意味します。
    • SPECIFIC_RESERVATION は、customJob の VM が、名前で明示的に指定された VM ターゲットの予約のみを使用できることを意味します。
    • NONE は、customJob の VM が予約を使用できないことを意味します。NONE を指定すると、予約アフィニティの指定を省略した場合と同じ効果があります。
  • ZONE: 予約が作成されたゾーン。
  • RESERVATION_NAME: 予約の名前。
  • MIN_REPLICA_COUNT: このデプロイの最小ノード数。ノード数は、推論負荷に応じてノードの最大数まで増減できますが、この数より少なくすることはできません。 1 以上の値を指定してください。
  • MAX_REPLICA_COUNT: このデプロイの最大ノード数。ノード数は、推論負荷に応じてこのノード数まで増減に応じて増減できますが、最大値を超えることはできません。
  • TRAFFIC_SPLIT_THIS_MODEL: このオペレーションでデプロイするモデルにルーティングされる、このエンドポイントへの予測トラフィックの割合。デフォルトは 100 です。すべてのトラフィックの割合の合計は 100 になる必要があります。トラフィック分割の詳細
  • DEPLOYED_MODEL_ID_N: 省略可。他のモデルがこのエンドポイントにデプロイされている場合は、すべての割合の合計が 100 になるように、トラフィック分割の割合を更新する必要があります。
  • TRAFFIC_SPLIT_MODEL_N: デプロイされたモデル ID キーのトラフィック分割の割合値。
  • PROJECT_NUMBER: プロジェクトに自動生成されたプロジェクト番号

HTTP メソッドと URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel

リクエストの本文(JSON):

{
  "deployedModel": {
    "model": "projects/PROJECT/locations/LOCATION_ID/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_NAME",
    "dedicatedResources": {
      "machineSpec": {
        "machineType": "MACHINE_TYPE",
        "acceleratorType": "ACCELERATOR_TYPE",
        "acceleratorCount": ACCELERATOR_COUNT,
        "reservationAffinity": {
          "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
          "key": "compute.googleapis.com/reservation-name",
          "values": [
            "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
          ]
        }
      },
      "minReplicaCount": MIN_REPLICA_COUNT,
      "maxReplicaCount": MAX_REPLICA_COUNT
    },
  },
  "trafficSplit": {
    "0": TRAFFIC_SPLIT_THIS_MODEL,
    "DEPLOYED_MODEL_ID_1": TRAFFIC_SPLIT_MODEL_1,
    "DEPLOYED_MODEL_ID_2": TRAFFIC_SPLIT_MODEL_2
  },
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1beta1.DeployModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-10-19T17:53:16.502088Z",
      "updateTime": "2020-10-19T17:53:16.502088Z"
    }
  }
}

Python

Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。詳細については、Vertex AI SDK for Python API のリファレンス ドキュメントをご覧ください。

次のスクリプトを実行する前に、次のように置き換えます。

  • DEPLOYED_NAME: デプロイされたモデルの名前。
  • TRAFFIC_SPLIT: デプロイされたモデル ID キーのトラフィック分割の割合値。
  • MACHINE_TYPE: このデプロイの各ノードで使用されるマシン。デフォルトの設定は n1-standard-2 です。 マシンタイプの詳細を確認する。
  • ACCELERATOR_TYPE: マシンに接続するアクセラレータのタイプ。各マシンタイプがサポートする GPU の種類の詳細については、 コンピューティング ワークロード用 GPU をご覧ください。
  • ACCELERATOR_COUNT: マシンに接続するアクセラレータの数。
  • PROJECT_ID: 予約が作成されたプロジェクト。別のプロジェクトの共有予約を使用するには、そのプロジェクトと予約を共有する必要があります。詳細については、 共有予約内のコンシューマ プロジェクトを変更するをご覧ください。
  • ZONE: 予約が配置されているゾーン。
  • RESERVATION_NAME: 予約の名前。
  • MIN_REPLICA_COUNT: このデプロイの最小ノード数。ノード数は、推論負荷に応じてノードの最大数まで増減できますが、この数より少なくすることはできません。 1 以上の値を指定してください。
  • MAX_REPLICA_COUNT: このデプロイの最大ノード数。ノード数は、推論負荷に応じてこのノード数まで増減に応じて増減できますが、最大値を超えることはできません。

使用する予約のタイプに応じて、次のいずれかを行います。

  • 特定の予約を使用するには:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="SPECIFIC_RESERVATION",
        reservation_affinity_key="compute.googleapis.com/reservation-name",
        reservation_affinity_values=["projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"],
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )
  • 自動的に消費される予約を使用するには:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="ANY_RESERVATION",
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )

次のステップ