トレーニングで 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 を使用することはできません。
  • Vertex AI トレーニングで使用できる Spot VM は、次のマシンシリーズに限られます。

    • A2
    • A3
  • 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 のベスト プラクティスをご覧ください。

カスタム トレーニング ジョブをフォールト トレラントにするには、次の方法があります。

  • チェックポイントを作成して、進行状況を保存する。モデルの進行状況を定期的に保存することで、終了したカスタム トレーニング ジョブを最初からやり直すのではなく、最後に保存したチェックポイントから再開できます。
  • Elastic Horovod を使用する。Elastic トレーニングにより、Horovod は再起動やチェックポイントからの再開を必要とせずにコンピューティング リソースをスケーリングできます。詳細については、Elastic Horovod をご覧ください。
  • シャットダウン スクリプトを使用する。Compute Engine が Spot VM をプリエンプトする場合は、シャットダウン スクリプトを使用して、VM がプリエンプトされる前にクリーンアップ アクションの実行を試みることができます。詳細については、シャットダウン スクリプトを使用してプリエンプションを処理するをご覧ください。

始める前に

カスタム トレーニング アプリケーションを準備します。

Spot VM を使用するようにトレーニング ジョブを構成する

スケジューリング構成で SPOT 戦略を指定すると、Spot VM を使用するようにカスタム トレーニング ジョブを構成できます。

REST

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

  • LOCATION: コンテナまたは Python パッケージを実行するリージョン。
  • PROJECT_ID: 実際のプロジェクト ID
  • JOB_NAME: 必須。CustomJob の表示名。
  • カスタム トレーニング ジョブを定義します。
    • MACHINE_TYPE: マシンのタイプ。トレーニングで使用可能なマシンタイプをご覧ください。
    • REPLICA_COUNT: 使用するワーカー レプリカの数。最初のワーカープールでは、ほとんどの場合、1 に設定します。
    • トレーニング アプリケーションがカスタム コンテナで実行される場合は、次のように指定します。
      • CUSTOM_CONTAINER_IMAGE_URI: トレーニング コードを含む Docker コンテナ イメージの URI。カスタム コンテナ イメージの作成方法を確認してください。
      • CUSTOM_CONTAINER_COMMAND: 省略可。コンテナの起動時に呼び出されるコマンド。このコマンドは、コンテナのデフォルトのエントリポイントをオーバーライドします。
      • CUSTOM_CONTAINER_ARGS: 省略可。コンテナの起動時に渡される引数。
    • トレーニング アプリケーションが事前ビルド済みのコンテナで実行される Python パッケージの場合は、以下の対象を指定します。
      • EXECUTOR_IMAGE_URI: 指定されたコードを実行するコンテナ イメージの URI。トレーニングに使用可能なビルド済みのコンテナをご覧ください。
      • PYTHON_PACKAGE_URIS: トレーニング プログラムとその依存パッケージである Python パッケージ ファイルを指定する Cloud Storage URI のカンマ区切りのリスト。パッケージ URI の最大数は 100 です。
      • PYTHON_MODULE: パッケージのインストール後に実行する Python モジュール名。
      • PYTHON_PACKAGE_ARGS: 省略可。Python モジュールに渡すコマンドライン引数。

HTTP メソッドと URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

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

{
  "displayName": "JOB_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": "MACHINE_TYPE"
          }
        },
        "replicaCount": REPLICA_COUNT,

        // Union field task can be only one of the following:
        "containerSpec": {
          "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
          "command": [
            CUSTOM_CONTAINER_COMMAND
          ],
          "args": [
            CUSTOM_CONTAINER_ARGS
          ]
        },
        "pythonPackageSpec": {
          "executorImageUri": EXECUTOR_IMAGE_URI,
          "packageUris": [
            PYTHON_PACKAGE_URIS
          ],
          "pythonModule": PYTHON_MODULE,
          "args": [
            PYTHON_PACKAGE_ARGS
          ]
        }
        // End of list of possible types for union field task.
      }
      // Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
      // for distributed training.
    ],
    "scheduling": {
      "strategy": "SPOT"
    }
  }
}

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

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content

レスポンスには、仕様と JOB_ID に関する情報が含まれています。

Python

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

customJob = aiplatform.CustomJob(
    display_name=TEST_CASE_NAME,
    worker_pool_specs=worker_pool_spec,
    staging_bucket=OUTPUT_DIRECTORY
)
customJob.run(
    scheduling_strategy=aiplatform.compat.types.custom_job.Scheduling.Strategy.SPOT
)

次のステップ