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

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

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

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

予約の詳細については、 予約に関する Compute Engine ドキュメントをご覧ください。 ワークロードに使用する取得可能性機能の選択の詳細については、 リソースの取得可能性を改善するをご覧ください。

始める前に

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

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

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

制限事項

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

  • コンパクト プレースメント ポリシーを指定した場合、ジョブの 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[] フィールドに含める必要があります。それ以外の場合は、allowedLocations[] フィールドを省略する場合は、ジョブのロケーションをこのゾーンを含むリージョンに設定する必要があります。

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

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

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

  2. 予約を準備します。ジョブの VM で使用する予約をまだ作成していない場合は、 作成します 。計画したプロパティが予約に含まれていることを確認します。

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

    gcloud

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

      たとえば、予約から 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",
        "provisioningModel": "PROVISIONING_MODEL",
        "accelerators": [
          {
            "type": "GPU_TYPE",
            "count": GPU_COUNT
          }
        ],
        "disks": [
          {
            "newDisk": {
              "sizeGb": LOCAL_SSD_SIZE,
              "type": "local-ssd"
            },
            "deviceName": "LOCAL_SSD_NAME"
          }
        ],
        "reservation": "SPECIFIC_RESERVATION_URL"
      }
      

      この値を使用する前に、次のすべての質問に基づいて更新してください。

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

        • はい: policy フィールドを instanceTemplate フィールドに置き換え、予約と一致する既存の VM インスタンス テンプレートを指定します。たとえば、 VM インスタンス テンプレートを使用する手順を確認し、このドキュメントの残りの質問を確認して、インスタンス テンプレートの properties フィールドを確認します。予約で GPU またはローカル SSD を使用する場合は、フィールドinstallGpuDriversを構成し 、ローカル SSD の フィールドvolumes[]をそれぞれ構成する 必要があります。次に、ジョブを送信します。

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

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

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

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

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

        • はい: 次の手順を完了します。

          1. INSTALL_GPU_DRIVERS を置き換え、このジョブの GPU ドライバのインストールに必要な追加フィールドを指定します。手順については、 GPU ドライバをインストールするをご覧ください。
          2. 使用オプションに基づいてPROVISIONING_MODEL を置き換えます。 予約の場合は STANDARD(デフォルト)、カレンダーモードの予約の場合は RESERVATION_BOUND です。
          3. GPU マシンタイプに基づいて accelerators[] フィールドを更新します。

            • アクセラレータ最適化マシンタイプを使用している場合は、accelerators[] フィールドを削除します。
            • それ以外の場合、N1 アクセラレータ最適化マシンタイプを使用している場合は、GPU_TYPEGPU_COUNT を予約と一致するように置き換えます。
        • いいえ: installGpuDrivers フィールド、provisioningModel フィールド、accelerators[] フィールドを削除します。

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

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

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

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

        • はい: SPECIFIC_RESERVATION_URL を次のように置き換えます。

          projects/RESERVATION_OWNER_PROJECT_ID/reservations/RESERVATION_NAME
          

          以下を置き換えます。

          • RESERVATION_OWNER_PROJECT_ID は、予約が存在するプロジェクトのプロジェクト ID に置き換えます。

          • 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:ジョブのロケーション 。予約を使用するには、ジョブの Compute Engine リソースを予約と同じゾーンに作成する必要があります。

      • 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:ジョブのロケーション 。予約を使用するには、ジョブの Compute Engine リソースを予約と同じゾーンに作成する必要があります。

    • JOB_NAME: ジョブの名前。

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

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

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

      この値を使用する前に、次のすべての質問に基づいて更新してください。

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

        • はい: policy フィールドを instanceTemplate フィールドに置き換え、予約と一致する既存の VM インスタンス テンプレートを指定します。たとえば、 VM インスタンス テンプレートを使用する 手順を確認し、 このドキュメントの残りの質問を確認して、インスタンス テンプレートの properties フィールドを確認します。予約で GPU またはローカル SSD を使用する場合は、フィールドinstallGpuDriversを構成し 、ローカル SSD の フィールドvolumes[]をそれぞれ構成する 必要があります。次に、ジョブを送信します。

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

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

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

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

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

        • はい: 次の手順を完了します。

          1. INSTALL_GPU_DRIVERS を置き換え、このジョブの GPU ドライバのインストールに必要な追加フィールドを指定します。手順については、 GPU ドライバをインストールするをご覧ください。
          2. 使用オプションに基づいてPROVISIONING_MODEL を置き換えます。 予約の場合は STANDARD(デフォルト)、カレンダーモードの予約の場合は RESERVATION_BOUND です。
          3. GPU マシンタイプに基づいて accelerators[] フィールドを更新します。

            • アクセラレータ最適化マシンタイプを使用している場合は、accelerators[] フィールドを削除します。
            • それ以外の場合、N1 アクセラレータ最適化マシンタイプを使用している場合は、GPU_TYPEGPU_COUNT を予約と一致するように置き換えます。
        • いいえ: installGpuDrivers フィールド、provisioningModel フィールド、accelerators[] フィールドを削除します。

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

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

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

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

        • はい: SPECIFIC_RESERVATION_URL を次のように置き換えます。

          projects/RESERVATION_OWNER_PROJECT_ID/reservations/RESERVATION_NAME
          

          以下を置き換えます。

          • RESERVATION_OWNER_PROJECT_ID は、予約が存在するプロジェクトのプロジェクト ID に置き換えます。

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

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

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

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

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

ジョブが予約を使用しないようにブロックするには、 reservation フィールドNO_RESERVATION に設定します。予約の使用を防止する方法の詳細については、 Compute Engine ドキュメントのコンピューティングインスタンスが予約を使用しないようにする をご覧ください。

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

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"
  }
}

以下を置き換えます。

次のステップ