VM 予約を使用してリソースの可用性を確保する

このドキュメントでは、予約済みリソースで実行されるジョブを作成する方法と、ジョブが予約を使用するのをブロックする方法について説明します。

予約は Compute Engine の機能です。予約を使用すると、指定したハードウェア構成で 1 つ以上の VM の容量を確実に確保できます。VM の予約を行うと、予約を作成した時点から削除するまでの VM の料金が発生します。ただし、その VM を使用している間、合計費用は予約なしの VM と同じです。

一般に、予約は、容量の可用性が極めて重要である場合や、リソース取得時のエラーを防止する場合に役立ちます。特に Batch の場合は、専用の予約を使用してジョブのスケジューリング時間を最小限に抑えるか、使用されていない既存の予約を使用してみてください。予約が十分に活用されていない場合(確約利用割引に必要な予約など)、ジョブが使用されていないときに使用するようにジョブを構成でき、発生した費用を最適化するのに役立ちます。また、プロジェクト内の他のワークロードのリソース可用性を優先する場合は、ジョブが予約を消費しないように明示的にブロックできます。

予約の詳細については、Compute Engine のドキュメント(予約)をご覧ください。

準備

  1. Batch を以前に使用したことがなかった場合は、Batch を使ってみるを確認し、プロジェクトとユーザーの前提条件を完了して Batch を有効にします。
  2. 必要に応じてジョブの VM で使用する予約を作成する権限または既存の予約を表示する権限があることを確認してください。
  3. ジョブの作成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

制限事項

予約の一般的な制限に加えて、Batch には次の制限もあります。

  • ジョブの VM では共有予約を使用できません。
  • コンパクト プレースメント ポリシーを指定した場合、ジョブの VM で予約を使用できません。
  • Google Cloud コンソールを使用してジョブを作成すると、その VM は一致する予約を自動的に使用します。特定の予約を使用するか、VM が予約を使用するのをブロックするには、gcloud CLI または Batch API を使用してジョブを作成するときに reservation フィールドを定義する必要があります。

要件

このセクションでは、ジョブの VM で予約を使用するための要件の概要について説明します。すべての要件の詳細については、Compute Engine のドキュメントの予約に関する一般的な要件とこのドキュメントの後半の構成の計画手順をご覧ください。

  • ジョブの VM で一般的に予約を使用できるようにするには、次のすべての条件を満たす必要があります。

    • ジョブと予約で、完全に一致する VM プロパティを指定する必要があります。

    • このドキュメントに記載されているすべての制限事項と、予約に関するその他の一般的な要件をすべて遵守する必要があります。

  • ジョブの各 VM で予約を正常に使用するには、VM の実行中に予約に使用できる未使用の容量が必要です。

    予約の未使用容量は、VM 数と現在使用している VM の数の差です。VM は、未使用の予約容量があると、予約を使用しようとします。そのため、VM の作成時かその後の実行時に、予約の使用を開始できます。VM は、VM の実行が停止するか、予約が削除されるまで、予約の使用を停止しません。

    未使用の予約容量の合計に応じて、ジョブの VM は予約容量をまったく使用しないか、予約容量の一部またはすべてを使用します。予約済み VM の容量はジョブの実行時全体で異なる場合があります。

予約済み VM を使用できるジョブを作成して実行する

  1. 構成を計画します。 ジョブと予約の互換性を確認するには、次の手順を実施します。

    すでに存在する予約を使用する場合は、対応する構成でジョブを作成する必要があります。それ以外の場合、新しい予約を作成するように計画するには、必要な構成オプションを選択します。

    1. 予約のプロパティを決定します。制限により、共有タイプは単一プロジェクトにする必要があります。これは、予約のデフォルト オプションです。次の予約プロパティに使用する値を決定します。

      • 使用タイプ*
      • VM 数

      * 予約の使用タイプ明示的にターゲットを設定するか、または自動的に使用される)によって、VM で使用できる予約が決定します。

      VM 数は、予約の合計容量を表します。この値を決定する際は、ジョブの VM 数を考慮してください。

    2. ジョブと予約の VM プロパティを決定します。制限により、ジョブと予約のどちらでもコンパクト プレースメント ポリシーを指定できません。これは、予約とジョブの両方のデフォルト オプションです。次の VM プロパティに使用する値を決定します。これは予約とジョブに対して正確に一致している必要があります。

      • プロジェクト
      • ゾーン*
      • マシンタイプ
      • 最小 CPU プラットフォーム(存在する場合
      • GPU のタイプと数(存在する場合
      • ローカル SSD のタイプと数(存在する場合
      • 予約アフィニティ#

      *ジョブ VM は予約済み VM と同じゾーンに配置する必要があります。このゾーンをジョブの allowedLocations[] フィールドに含めるか、allowedLocations[] フィールドを省略する場合は、ジョブのロケーションをこのゾーンを含むリージョンに設定する必要があります。

      ジョブでは、policy サブフィールドまたは VM インスタンス テンプレートを使用して、これらのプロパティをすべて定義する必要があります。ジョブで policy サブフィールドとテンプレートの組み合わせを指定することはできません。

      オプション フィールドは、1 つのリソースで定義し、別のリソースで省略することはできません。予約とジョブの両方に対してオプション フィールドを定義または省略します。ジョブで VM インスタンス テンプレートが指定されている場合、これは指定されたテンプレートのフィールドにも適用されます。

      #予約の使用タイプによって、ジョブの VM に必要な予約アフィニティが決定されます。これは、次に示すように、ジョブで指定する必要があります。

      • ジョブで VM インスタンス テンプレートを使用している場合は、テンプレートで予約のドキュメントで説明されているように予約アフィニティを構成する必要があります。
      • ジョブがテンプレートを使用せず、予約が明示的にターゲットに設定されている場合は、ジョブの reservation フィールドに予約の名前を指定します。
      • それ以外の場合は、ジョブがテンプレートを使用せず、予約が自動的に使用され、ジョブの reservation フィールドを省略します。
  2. 予約を準備します。まだ作成していない場合は、ジョブの VM で使用する予約を作成します。計画したプロパティが予約に含まれていることを確認します。

  3. ジョブを作成して実行します。準備された予約から VM を使用するジョブを作成して実行するには、gcloud CLI または Batch API を使用します。

    gcloud

    1. 予約の VM プロパティと完全に一致するように、VM インスタンス リソース(instances[])サブフィールドを設定するジョブの構成の詳細を指定する JSON ファイルを作成します。

      たとえば、予約から VM を使用する基本的なスクリプト ジョブを作成するには、次の内容の JSON ファイルを作成します。

      {
        "taskGroups": [
          {
            "taskSpec": {
              "runnables": [
                {
                  "script": {
                    "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                  }
                }
              ]
            },
            "taskCount": 3
          }
        ],
        "allocationPolicy": {
          "instances": [
            {
              VM_RESOURCES
            }
          ],
        },
        "logsPolicy": {
          "destination": "CLOUD_LOGGING"
        }
      }
      

      VM_RESOURCES は、前の手順で計画した instances[] サブフィールドを指定して、ジョブで使用する予約と一致する VM リソースに置き換えます。

      たとえば、VM_RESOURCES の値は次の値から始めます。

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }
      

      この値を使用するには、次の変更をすべて行います。

      1. インスタンス テンプレートを使用するか

        • はい: policy フィールドを instanceTemplate フィールドに置き換え、予約と一致する既存の VM インスタンス テンプレートを指定します。例については、VM インスタンス テンプレートの使用のコードサンプルをご覧ください。予約で GPU またはローカル SSD を使用する場合は、ジョブの installGpuDrivers フィールドと volumes[] フィールドをそれぞれ構成する必要もあります。それ以外の場合は、残りの変更をスキップします。

        • いいえ: MACHINE_TYPE は、予約と同じマシンタイプに置き換えます。

      2. 予約に最小 CPU プラットフォームが含まれていますか?

        • はい: MIN_CPU_PLATFORM は、同じ最小 CPU プラットフォームに置き換えます。

        • いいえ: minCpuPlatform フィールドを削除します。

      3. 予約に GPU は含まれていますか?

        • はい: INSTALL_GPU_DRIVERSGPU_TYPEGPU_COUNT は、予約と一致するように置き換えます。例については、GPU の使用のコードサンプルをご覧ください。

        • いいえ: installGpuDrivers フィールドと accelerators[] フィールドを削除します。

      4. 予約にローカル SSD は含まれていますか?

        • はい: LOCAL_SSD_SIZELOCAL_SSD_NAME は、予約と一致するように置き換え、volumes[] フィールドをジョブに追加してローカル SSD をマウントします。例については、ローカル SSD の使用のコードサンプルをご覧ください。

        • いいえ: disks[] フィールドを削除します。

      5. 予約で特定の使用タイプを使用していますか?

        • はい: SPECIFIC_RESERVATION_NAME は、予約の名前に置き換えます。

        • いいえ: reservation フィールドを削除します。

      たとえば、最小 CPU プラットフォーム、GPU、ローカル SSD を指定していない n2-standard-32 VM に自動消費予約を使用しているとします。また、VM インスタンス テンプレートは指定しません。その場合は、VM_RESOURCES を次の値に置き換える必要があります。

      "policy": {
        "machineType": "n2-standard-32"
      }
      
    2. ジョブを作成して実行するには、gcloud batch jobs submit コマンドを使用します:

      gcloud batch jobs submit JOB_NAME \
        --location LOCATION \
        --config JSON_CONFIGURATION_FILE
      

      以下を置き換えます。

      • JOB_NAME: ジョブの名前。

      • LOCATION: ジョブのロケーション。 ジョブで allowedLocations[] フィールドが指定されていない限り、これは予約のゾーンを含むリージョンである必要があります。

      • JSON_CONFIGURATION_FILE: ジョブの構成の詳細を含む JSON ファイルへのパス。

    API

    予約の VM プロパティと完全に一致するように、VM インスタンス リソース(instances[])サブフィールドを設定する jobs.create メソッドPOST リクエストを送信します。

    たとえば、予約から VM を使用する基本的なスクリプト ジョブを作成するには、次のリクエストを行います。

    POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            VM_RESOURCES
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    次のように置き換えます。

    • PROJECT_ID: プロジェクトのプロジェクト ID

    • LOCATION: ジョブのロケーション。 ジョブで allowedLocations[] フィールドが指定されていない限り、これは予約のゾーンを含むリージョンである必要があります。

    • JOB_NAME: ジョブの名前。

    • VM_RESOURCES: 前の手順で計画した instances[] サブフィールドを指定して、ジョブで使用する予約と一致する VM リソース。

      たとえば、VM_RESOURCES の値は次の値から始めます。

      "installGpuDrivers": INSTALL_GPU_DRIVERS,
      "policy": {
        "machineType": "MACHINE_TYPE",
        "minCpuPlatform": "MIN_CPU_PLATFORM",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_NAME"
      }

      この値を使用するには、次の変更をすべて行います。

      1. インスタンス テンプレートを使用するか

        • はい: policy フィールドを instanceTemplate フィールドに置き換え、予約と一致する既存の VM インスタンス テンプレートを指定します。例については、VM インスタンス テンプレートの使用のコードサンプルをご覧ください。予約で GPU またはローカル SSD を使用する場合は、ジョブの installGpuDrivers フィールドと volumes[] フィールドをそれぞれ構成する必要もあります。それ以外の場合は、残りの変更をスキップします。

        • いいえ: MACHINE_TYPE は、予約と同じマシンタイプに置き換えます。

      2. 予約に最小 CPU プラットフォームが含まれていますか?

        • はい: MIN_CPU_PLATFORM は、同じ最小 CPU プラットフォームに置き換えます。

        • いいえ: minCpuPlatform フィールドを削除します。

      3. 予約に GPU は含まれていますか?

        • はい: INSTALL_GPU_DRIVERSGPU_TYPEGPU_COUNT は、予約と一致するように置き換えます。例については、GPU の使用のコードサンプルをご覧ください。

        • いいえ: installGpuDrivers フィールドと accelerators[] フィールドを削除します。

      4. 予約にローカル SSD が含まれていますか?

        • はい: LOCAL_SSD_SIZELOCAL_SSD_NAME は、予約と一致するように置き換え、volumes[] フィールドをジョブに追加してローカル SSD をマウントします。例については、ローカル SSD の使用のコードサンプルをご覧ください。

        • いいえ: disks[] フィールドを削除します。

      5. 予約で特定の使用タイプを使用していますか?

        • はい: SPECIFIC_RESERVATION_NAME は、予約の名前に置き換えます。

        • いいえ: reservation フィールドを削除します。

      たとえば、最小 CPU プラットフォーム、GPU、ローカル SSD を指定していない n2-standard-32 VM に自動消費予約を使用しているとします。また、VM インスタンス テンプレートは指定しません。その場合は、VM_RESOURCES を次の値に置き換える必要があります。

      "policy": {
        "machineType": "n2-standard-32"
      }

予約済み VM を使用できないジョブを作成して実行する

ジョブが予約を使用できないようにするには、reservation フィールドNO_RESERVATION に設定します。予約の使用を防ぐ方法については、Compute Engine ドキュメントの予約を使用せずに VM を作成するをご覧ください。

予約済み VM を使用できないジョブを作成して実行するには、gcloud CLI または Batch API を使用します。

gcloud

  1. ジョブの構成の詳細を指定し、次の設定を行う JSON ファイルを作成し、reservation フィールドを NO_RESERVATION に設定します。

    たとえば、予約を使用できない基本的なスクリプト ジョブを作成するには、次の内容の JSON ファイルを作成します。

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
                }
              }
            ]
          },
          "taskCount": 3
        }
      ],
      "allocationPolicy": {
        "instances": [
          {
            "policy": {
              "reservation": "NO_RESERVATION"
            }
          }
        ],
      },
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    
  2. ジョブを作成して実行するには、gcloud batch jobs submit コマンドを使用します:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    以下を置き換えます。

    • JOB_NAME: ジョブの名前。

    • LOCATION: ジョブのロケーション

    • JSON_CONFIGURATION_FILE: ジョブの構成の詳細を含む JSON ファイルへのパス。

API

reservation フィールドを NO_RESERVATION に設定するjobs.create メソッドPOST リクエストを作成します。

たとえば、予約を使用できない基本的なスクリプト ジョブを作成するには、次のリクエストを送信します。

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello world from task ${BATCH_TASK_INDEX}"
            }
          }
        ]
      },
      "taskCount": 3
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "reservation": "NO_RESERVATION"
        }
      }
    ],
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

次のように置き換えます。

次のステップ