予測で Spot VM を使用する

概要

Spot VM を使用すると、予測ジョブの実行コストを削減できます。Spot VM は、Compute Engine の余剰キャパシティを利用する仮想マシン(VM)インスタンスです。Spot VM には大幅な割引がありますが、Compute Engine がそのキャパシティを任意のタイミングで再利用するために、Compute Engine が Spot VM を事前に停止または削除(プリエンプト)する可能性があります。

詳細については、Spot VM をご覧ください。

制限事項と要件

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

  • Vertex AI で Spot VM を使用する場合は、すべての Spot VM の制限が適用されます。
  • Vertex AI での Spot VM の使用は、カスタム トレーニングと予測でのみサポートされています。
  • TPU Pod で Spot VM を使用することはできません。
  • Google Cloud コンソールからジョブを送信することはできません。

課金

ワークロードがフォールト トレラントで、VM のプリエンプションが発生する可能性がある場合、Spot VM を使用すると費用を大幅に削減できます。これらの VM のいくつかが処理中に停止する場合、ジョブは遅くなりますが、完全に停止することはありません。Spot VM は、既存の VM に余分な負荷をかけずにバッチ処理タスクを完了します。標準 VM を追加した場合の正規料金を支払う必要もありません。プリエンプション処理をご覧ください。

Spot VM を使用する場合は、ジョブの所要時間とマシンタイプに基づいて課金されます。ジョブがキュー内にある時間やプリエンプトされた時間は課金されません。

プリエンプション処理

Spot VM は、Compute Engine によっていつでも再利用される可能性があります。したがって、Spot VM を最大限に活用するには、予測ジョブがフォールト トレラントでなければなりません。Spot VM がプリエンプトされると、予測ジョブは STOCKOUT エラーで失敗し、Compute Engine はジョブの再起動を最大 6 回試みます。 Spot VM を最大限に活用する方法については、Spot VM のベスト プラクティスをご覧ください。

予測ジョブをフォールト トレラントにするには、次の方法があります。

  • チェックポイントを作成して、進行状況を保存する。モデルの進行状況を定期的に保存することで、終了した予測ジョブを最初からやり直すのではなく、最後に保存したチェックポイントから再開できます。
  • シャットダウン スクリプトを使用する。Compute Engine が Spot VM をプリエンプトする場合は、シャットダウン スクリプトを使用して、VM がプリエンプトされる前にクリーンアップ アクションの実行を試みることができます。詳細については、シャットダウン スクリプトを使用してプリエンプションを処理するをご覧ください。

Spot VM を使用して予測を取得する

モデルをデプロイして予測を取得するときに Spot VM を使用するには、REST API または Vertex AI SDK for Python を使用します。

REST

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

  • LOCATION_ID: Vertex AI を使用するリージョン。
  • PROJECT_ID: 実際のプロジェクト ID
  • ENDPOINT_ID: エンドポイントの ID。
  • MODEL_ID: デプロイするモデルの ID。
  • DEPLOYED_MODEL_NAME: DeployedModel の名前。DeployedModelModel の表示名を使用することもできます。
  • MACHINE_TYPE: 省略可。このデプロイの各ノードで使用するマシンリソース。デフォルトの設定は n1-standard-2 です。マシンタイプの詳細。
  • ACCELERATOR_TYPE: 省略可。マシンにアタッチするアクセラレータのタイプ。詳細
  • ACCELERATOR_COUNT: 省略可。各レプリカで使用するアクセラレータの数。
  • 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):

{


"acceleratorCount": 1}, "spot": true, "minReplicaCount": 1, "maxReplicaCount": 1}}, "trafficSplit": {"0": 100}}' \
  "https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel"

  "deployedModel": {
    "model": "projects/PROJECT/locations/us-central1/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_NAME",
    "enableContainerLogging": true,
    "dedicatedResources": {
      "machineSpec": {
        "machineType": "MACHINE_TYPE",
        "acceleratorType": "ACCELERATOR_TYPE",
        "acceleratorCount": ACCELERATOR_COUNT
      },
      "spot": true,
      "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/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 のリファレンス ドキュメントをご覧ください。

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,
    min_replica_count=MIN_REPLICA_COUNT,
    max_replica_count=MAX_REPLICA_COUNT,
    spot=True,
    sync=True
)

次のステップ