次の方法で共有


Batch ワークロードでスポット VM を使用する

Azure Batchは、Batch ワークロードのコストを削減するためにスポット仮想マシン (VM) を提供します。 スポット VM は、低コストで大量のコンピューティング能力を使用できるようにすることで、新しい種類の Batch ワークロードを可能にします。

スポット VM は、Azureの余分な容量を利用します。 使用可能な余分な容量の量は、VM ファミリ、VM サイズ、リージョン、時間帯などの要因によって異なります。 プールでスポット VM を指定する場合、Azure Batchはこの過剰を使用できます (使用可能な場合)。

スポット VM を使用する場合のトレードオフは、これらの VM に SLA がなく、可用性が保証されていないことです。 スポット VM は、作成された時点を含め、いつでもプリエンプトされる可能性があります。 このため、スポット VM は、ジョブの完了時間に柔軟性があり、作業が多数の VM に分散されているバッチや非同期処理ワークロードに最も適しています。

プリエンプションが発生すると、スポット コンピューティング ノードが削除され、適切にチェックポイント処理されなかったすべての作業が失われます。 チェックポイント処理は省略可能であり、実装するかどうかは Batch エンド ユーザーが決定します。 プリエンプションのために中断された実行中の Batch タスクは、別のコンピューティング ノードによって実行されるように自動的にキューに再登録されます。 プリエンプションされた VM は後で Azure プラットフォームによって復元される可能性がありますが、復元はプリエンプション後の最初の 48 時間のみ試行され、最終的に成功するとは限りません。

スポット VM は、専用 VM と比較して割引価格で提供されます。 価格の詳細については、「Batch の価格」を参照してください。

スポット VM に対する Batch のサポート

Azure Batchには、スポット VM を簡単に使用してメリットを得られるいくつかの機能が用意されています。

  • Batch プールには専用 VM とスポット VM の両方を入れることができます。 各種 VM の数はプール作成時に指定するか、既存プールで明示的なサイズ変更操作や自動スケールを使用していつでも変更できます。 ジョブやタスクの送信は、プール内の VM の種類に関係なく、変更しないままにできます。 また、完全にスポット VM を使用してジョブを可能な限り低料金で実行するが、容量が最小しきい値を下回った場合は専用 VM を起動してジョブの実行を維持するようにプールを構成できます。
  • Batch プールではスポット VM のターゲット数が自動的にシークされます。 VM が割り込まれたり、利用できなくなったりした場合、Batch は失われた容量に対して置き換えを試行し、ターゲットに戻します。
  • タスクが中断された場合、Batch は再度実行するタスクを検出して自動的にキューに再登録します。
  • スポット VM には、専用 VM 用とは異なる別個の vCPU クォータがあります。 スポット VM のコストは低いため、スポット VM のクォータは専用 VM のクォータよりも高くなります。 詳しくは、「Batch サービスのクォータと制限」をご覧ください。

考慮事項とユース ケース

多くの Batch ワークロードは、スポット VM に適しています。 ジョブが多数の並列タスクに分割されている場合や、スケールアウトされた多数のジョブが多数の VM に分散されている場合にスポット VM を使用することを検討してください。

スポット VM に適したバッチ処理ユース ケースの例を次に示します。

  • 開発とテスト:特に、大規模なソリューションを開発する場合に大幅な節約を実現できます。 あらゆる種類のテストでメリットがありますが、特に大規模なロード テストや回帰テストに最適です。
  • オンデマンド容量の補完: スポット VM は、通常の専用 VM を補完するために使用できます。 利用可能な場合は、ジョブをスケーリングして短時間で完了することで、コストを削減できます。利用できない場合は、専用 VM のベースラインを引き続き利用できます。
  • 柔軟なジョブ実行時間: ジョブの完了時間に柔軟性がある場合、潜在的な容量の低下は許容することができます。 ただしスポット VM を追加することで、多くの場合、より速く、より低いコストでジョブを実行することができます。

スポット VM を使用するように Batch プールを構成するには、いくつかの方法があります。

  • プールではスポット VM のみを使用できます。 この場合、Batch は、使用可能な場合は割り込まれた容量を回復します。 この構成は、ジョブを実行する上でコストが最もかからない方法です。
  • 専用 VM の固定ベースラインと組み合わせてスポット VM を使用できます。 専用 VM の数を固定することにより、ジョブの進行を維持するための容量が常に確保されます。
  • プールでは、専用とスポット VM の動的な組み合わせを使用できます。このため、使用可能なときは低コストのスポット VM のみが使用されますが、必要に応じてフルプライスの専用 VM がスケールアップされます。 この構成では、ジョブの進行を維持するために利用できる最小限の容量が確保されます。

スポット VM の使用を計画するときは、次のやり方に注意してください。

  • Azureでの余分な容量の使用を最大化するために、適切なジョブをスケールアウトできます。
  • VM は使用できない場合や割り込まれる場合があり、その結果ジョブに使用できる容量が減り、タスクの中断や再実行につながることがあります。
  • 実行時間の短いタスクは、スポット VM で最適に動作する傾向があります。 時間のかかるジョブが中断されると影響がより大きくなります。 長時間実行されるタスクについては、チェックポイント処理を実装して実行時に進行状況を保存すると、この影響が軽減される可能性があります。
  • 複数の VM が使用される実行時間の長い MPI ジョブには、スポット VM は適していません。これは、1 つの VM が割り込まれると、ジョブ全体を再度実行する必要が生じる可能性があるからです。
  • ネットワーク セキュリティ グループ (NSG) 規則が正しく構成されていない場合、スポット ノードは使用不可としてマークされることがあります。

スポット VM を使用してプールを作成して管理する

Batch プールには、専用とスポット VM (計算ノードとも呼ばれる) の両方を入れることができます。 専用とスポット VM の両方について計算ノードのターゲット数を設定できます。 ノードのターゲット数はプールに入れておく VM の数を指定します。

スポット VM は、割り込まれることがあります。 割り込みが起こった場合は、割り込まれたノードの VM で実行されていたタスクが再度キューに入れられて、容量が回復した時点でもう一度実行されます。 Batch では、次の動作も実行されます。

  • 割り込まれた VM の状態が割り込みに更新されます。
  • その VM は事実上削除され、VM のローカルに保存されているすべてのデータが削除されます。
  • プールのノード一覧表示操作でも、割り込まれたノードが返されます。
  • プールでは引き続き、使用可能なスポット ノードのターゲット数達成が試行されます。 代替の容量が見つかると、ノードは ID を保持しつつ再初期化され、作成中状態、開始状態を経て、その後タスクをスケジュールできるようになります。
  • プリエンプション数は、Azure ポータルでメトリックとして使用できます。

Azure Batch SDK

次の例では、Azure仮想マシン (この場合は Linux VM) を使用してプールを作成し、ターゲットは 5 つの専用 VM と 20 個のスポット VM を使用します。

ImageReference imageRef = new ImageReference(
    publisher: "Canonical",
    offer: "ubuntu-24_04-lts",
    sku: "server",
    version: "latest");

// Create the pool
VirtualMachineConfiguration virtualMachineConfiguration =
    new VirtualMachineConfiguration("batch.node.ubuntu 24.04", imageRef);

pool = batchClient.PoolOperations.CreatePool(
    poolId: "vmpool",
    targetDedicatedComputeNodes: 5,
    targetLowPriorityComputeNodes: 20,
    virtualMachineSize: "Standard_D4s_v3",
    virtualMachineConfiguration: virtualMachineConfiguration);

次のようにして、専用とスポット VM 両方の現在のノード数を取得できます。

int? numDedicated = pool1.CurrentDedicatedComputeNodes;
int? numLowPri = pool1.CurrentLowPriorityComputeNodes;

プールのノードには、ノードが専用とスポット VM のどちらかを示すプロパティがあります。

bool? isNodeDedicated = poolNode.IsDedicated;

専用 VM のみで構成されるプールと同じように、Resize メソッドを呼び出すか自動スケールを使用して、スポット VM が含まれるプールをスケーリングできます。

プールのサイズ変更操作は 2 番目のオプション パラメーターを取り、targetLowPriorityNodes の値を更新します。

pool.Resize(targetDedicatedComputeNodes: 0, targetLowPriorityComputeNodes: 25);

Azure CLI

スポット インスタンスを使用して新しいプールを作成します。

az batch pool create \
  --id "vmpool" \
  --vm-size "Standard_D4s_v3" \
  --target-dedicated-nodes 5 \
  --target-low-priority-nodes 20 \
  --enable-inter-node-communication false \
  --image "Canonical:ubuntu-24_04-lts:server" \
  --node-agent-sku-id "batch.node.ubuntu 24.04" \
  --account-name <your-batch-account-name> \
  --account-endpoint "https://<your-batch-account-name>.<region>.batch.azure.com"

スポット インスタンスを使用するように既存のプールをスケーリングする:

az batch pool resize \
  --pool-id <existing-pool-id> \
  --target-dedicated-nodes 5 \
  --target-low-priority-nodes 20 \
  --account-name <your-batch-account-name> \
  --account-endpoint "https://<your-batch-account-name>.<region>.batch.azure.com"

プールの状態とノードの割り当てを確認する

az batch pool show \
  --account-name <your-batch-account-name> \
  --account-endpoint "https://<your-batch-account-name>.<region>.batch.azure.com" \
  --pool-id <your-pool-id> \
  --query "{State:state, CurrentSpotNodes:currentLowPriorityNodes, TargetSpotNodes:scaleSettings.targetLowPriorityNodes, ResizeErrors:resizeErrors}"

Azure PowerShell

スポット インスタンスを使用してプールを作成する:

New-AzBatchPool `
  -Id "vmpool" `
  -VirtualMachineSize "Standard_D4s_v3" `
  -TargetDedicatedComputeNodes 5 `
  -TargetLowPriorityComputeNodes 20 `
  -VirtualMachineImageId "/subscriptions/{subscription}/resourceGroups/{rg}/providers/Microsoft.Compute/images/{image}" `
  -BatchContext $context

PowerShell を使用して検証する:

$pool = Get-AzBatchPool -Id "vmpool" -BatchContext $context
$pool | Select-Object Id, VmSize, @{Name="SpotNodes";Expression={$_.TargetLowPriorityComputeNodes}}, State

Azure ポータル

  1. Azure ポータルで Batch アカウントを選択し、既存のプールを表示するか、新しいプールを作成します。

  2. [スケーリング] で、[ターゲットの専用ノード数] または [ターゲットのスポットまたは低優先度ノード] を選択します。

    ターゲット ノードをスケーリングする方法を示すスクリーンショット。

  3. 既存のプールの場合は、プールを選択し、[ スケール ] を選択して、必要なスポット ノードの数を更新します。

  4. 保存を選びます。

スポット VM を使用した自動スケーリング

ターゲット VM 数を直接設定するだけでなく、必要に応じてプールの自動スケール式を定義することもできます。 プールの自動スケーリング式では、次のようにスポット VM がサポートされます。

  • サービス定義変数 $TargetLowPriorityNodes の値を取得または設定できます。
  • サービス定義変数 $CurrentLowPriorityNodes の値を取得できます。
  • サービス定義変数 $PreemptedNodeCount の値を取得できます。 この変数は割り込み状態にあるノードの数を返し、使用できない割り込みノードの数に応じて、専用ノードの数をスケールアップまたはスケールダウンできます。

詳細については、「 Batch 自動スケール ガイド」を参照してください。

ジョブとタスクを構成する

ジョブとタスクでは、スポット ノード用の追加構成がいくらか必要になる場合があります。

  • ジョブの JobManagerTask プロパティには AllowLowPriorityNode プロパティがあります。 このプロパティが true の場合、専用またはスポット ノードのいずれかでジョブ マネージャー タスクをスケジュールできます。 これが false の場合、ジョブ マネージャー タスクは専用のノードに対してのみスケジュールされます。
  • タスク アプリケーションに対して AZ_BATCH_NODE_IS_DEDICATED環境変数が使用可能になっているため、スポットまたは専用のノードのどちらで実行されているかを判別できます。

スポット VM のメトリックを表示する

スポット ノードのAzure ポータルで新しいメトリックを使用できます。 これらのメトリックは次のとおりです。

  • Low-Priority Node Count (優先順位の低いノードの数)
  • Low-Priority Core Count (優先順位の低いコアの数)
  • Preempted Node Count (割り込まれたノードの数)

Azure ポータルでこれらのメトリックを表示するには、

  1. Azure ポータルで Batch アカウントに移動します。
  2. [監視] セクションから [メトリック] を選択します。
  3. [メトリック] 一覧から目的のメトリックを選択します。

制限事項

  • Batch 内の スポット VM では、最大価格の設定はサポートされておらず、価格ベースの削除もサポートされていません。 それらは、容量の理由でのみ削除できます。
  • 一部のクラウド、VM サイズ、サブスクリプション オファーの種類では、スポット VM を利用できません。 スポット VM の制限に関する詳細情報を参照してください。
  • 現在、エフェメラル OS ディスクは、"停止 - 割り当て解除" のサービス マネージド削除ポリシーのため、スポット VM ではサポートされていません。

次のステップ