タスクの同時実行による Batch コンピューティング ノードの使用率の最大化Run tasks concurrently to maximize usage of Batch compute nodes

Azure Batch プールでは、各コンピューティング ノードで複数のタスクを同時に実行することによって、リソースの使用率を最大限に高めつつ、プールに必要なノード数を減らすことができます。By running more than one task simultaneously on each compute node in your Azure Batch pool, you can maximize resource usage on a smaller number of nodes in the pool. ワークロードによっては、ジョブの時間が短縮され、コストを削減できます。For some workloads, this can result in shorter job times and lower cost.

単一のタスクにすべてのノードのリソースを割り当てることでメリットがあるシナリオもありますが、複数のタスクでリソースを共有することにメリットがある状況もあります。While some scenarios benefit from dedicating all of a node's resources to a single task, several situations benefit from allowing multiple tasks to share those resources:

  • データ転送を最小限に抑えるMinimizing data transfer when tasks are able to share data. このシナリオでは、共有データを少数のノードにコピーし、各ノードでタスクを並列実行することにより、データ転送の費用を大幅に削減できます。In this scenario, you can dramatically reduce data transfer charges by copying shared data to a smaller number of nodes and executing tasks in parallel on each node. これが特に当てはまるのは、各ノードにコピーするデータを、リージョン間で転送する必要がある場合です。This especially applies if the data to be copied to each node must be transferred between geographic regions.
  • メモリの使用率を最大化するMaximizing memory usage when tasks require a large amount of memory, but only during short periods of time, and at variable times during execution. より多くのメモリを使用する少数の大きなコンピューティング ノードを使用することで、このようなスパイクを効率的に処理できます。You can employ fewer, but larger, compute nodes with more memory to efficiently handle such spikes. これらのノードには、各ノードで並列で実行されるタスクが割り当てられますが、各タスクは、ノードの豊富なメモリを異なるタイミングで利用できます。These nodes would have multiple tasks running in parallel on each node, but each task would take advantage of the nodes' plentiful memory at different times.
  • ノード数の制限を緩和するMitigating node number limits when inter-node communication is required within a pool. 現時点では、ノード間通信用に構成されるプールは 50 のコンピューティング ノードに制限されています。Currently, pools configured for inter-node communication are limited to 50 compute nodes. このようなプール内の各ノードがタスクを並列に実行できると、より多くのタスクが同時に実行できるようになります。If each node in such a pool is able to execute tasks in parallel, a greater number of tasks can be executed simultaneously.
  • 初めてコンピューティング環境を Azure に移行するときなどに、オンプレミスのコンピューティング クラスターをレプリケートするReplicating an on-premises compute cluster, such as when you first move a compute environment to Azure. 現在のオンプレミスのソリューションがコンピューティング ノードごとに複数のタスクを実行している場合、ノード タスクの最大数を増やすことで、その構成をより厳密に反映できます。If your current on-premises solution executes multiple tasks per compute node, you can increase the maximum number of node tasks to more closely mirror that configuration.

サンプル シナリオExample scenario

並列タスク実行の利点を示す例として、タスク アプリケーションの CPU とメモリの要件を満たすノードのサイズが Standard_D1 である場合について考えてみます。As an example to illustrate the benefits of parallel task execution, let's say that your task application has CPU and memory requirements such that Standard_D1 nodes are sufficient. ただし、必要な時間内にジョブを終えるには、そのようなサイズのノードが 1,000 個必要です。But, in order to finish the job in the required time, 1,000 of these nodes are needed.

1 個の CPU コアを持つ Standard_D1 ノードを使用する代わりに、それぞれが 16 個のコアを持つ Standard_D14 ノードを使用して、並列タスクの実行を有効にすることもできます。Instead of using Standard_D1 nodes that have 1 CPU core, you could use Standard_D14 nodes that have 16 cores each, and enable parallel task execution. この場合、" ノードの数は 16 分の 1 " で済むため、必要なのは 1,000 ノードではなく 63 ノードのみになります。Therefore, 16 times fewer nodes could be used--instead of 1,000 nodes, only 63 would be required. 加えて、大きなアプリケーション ファイルまたは参照データが各ノードに必要である場合、データのコピー先がわずか 63 ノードで済むため、ジョブの実行時間と効率の面でも改善が期待できます。Additionally, if large application files or reference data are required for each node, job duration and efficiency are again improved since the data is copied to only 63 nodes.

並列タスク実行を有効にするEnable parallel task execution

並列タスク実行のためのコンピューティング ノードの構成は、プール レベルで行います。You configure compute nodes for parallel task execution at the pool level. Batch .NET ライブラリを使用する場合は、プールを作成するときに CloudPool.MaxTasksPerComputeNode プロパティを設定します。With the Batch .NET library, set the CloudPool.MaxTasksPerComputeNode property when you create a pool. Batch REST API を使用する場合は、プール作成時の要求本文に maxTasksPerNode 要素を設定します。If you are using the Batch REST API, set the maxTasksPerNode element in the request body during pool creation.

Azure Batch では、ノードあたりのタスク数をコア ノードの数の最大 4 倍まで設定できます。Azure Batch allows you to set tasks per node up to (4x) the number of core nodes. たとえば、プールをノード サイズ "Large" (4 コア) で構成した場合、 maxTasksPerNode は 16 に設定できます。For example, if the pool is configured with nodes of size "Large" (four cores), then maxTasksPerNode may be set to 16. ただし、ノードのコア数には関係なく、ノードあたり 256 タスクを超えることはできません。However, regardless of how many cores the node has, you can't have more than 256 tasks per node. 各ノード サイズのコア数の詳細については、「 Cloud Services のサイズ」を参照してください。For details on the number of cores for each of the node sizes, see Sizes for Cloud Services. サービスの制限の詳細については、「 Azure Batch サービスのクォータと制限」を参照してください。For more information on service limits, see Quotas and limits for the Azure Batch service.

ヒント

プールの自動スケールの数式を作成するときは、maxTasksPerNode の値を考慮してください。Be sure to take into account the maxTasksPerNode value when you construct an autoscale formula for your pool. たとえば、 $RunningTasks を評価する式は、ノードあたりのタスク数の増加によって大きな影響を受ける可能性があります。For example, a formula that evaluates $RunningTasks could be dramatically affected by an increase in tasks per node. 詳細については、「 Azure Batch プール内のコンピューティング ノードの自動スケール 」を参照してください。See Automatically scale compute nodes in an Azure Batch pool for more information.

タスクの分散Distribution of tasks

プール内のコンピューティング ノードが複数のタスクを同時に実行できる場合、プール内の各ノードへのタスクの分散方法を指定することが重要です。When the compute nodes in a pool can execute tasks concurrently, it's important to specify how you want the tasks to be distributed across the nodes in the pool.

CloudPool.TaskSchedulingPolicy プロパティを使用することで、プール内のすべてのノードに対して均等にタスクを割り当てるように指定できます ("分散")。By using the CloudPool.TaskSchedulingPolicy property, you can specify that tasks should be assigned evenly across all nodes in the pool ("spreading"). または、1 つのノードにできる限り多くのタスクを割り当ててから、プール内の別のノードにタスクを割り当てるように指定することもできます ("圧縮")。Or you can specify that as many tasks as possible should be assigned to each node before tasks are assigned to another node in the pool ("packing").

この機能の有効性を示す例として、前述の Standard_D14 ノードのプールを CloudPool.MaxTasksPerComputeNode 値 16 で構成した場合について考えます。As an example of how this feature is valuable, consider the pool of Standard_D14 nodes (in the example above) that is configured with a CloudPool.MaxTasksPerComputeNode value of 16. ComputeNodeFillTypePack を指定して CloudPool.TaskSchedulingPolicy を構成した場合、各ノードの 16 コアすべての使用率が最大になり、自動スケーリング プールが未使用ノード (タスクが割り当てられていないノード) をプールから削除できます。If the CloudPool.TaskSchedulingPolicy is configured with a ComputeNodeFillType of Pack, it would maximize usage of all 16 cores of each node and allow an autoscaling pool to prune unused nodes from the pool (nodes without any tasks assigned). これによってリソース使用率は最小になり、コストを節約できます。This minimizes resource usage and saves money.

Batch .NET の例Batch .NET example

次の Batch .NET API コード スニペットは、ノードごとの最大タスク数が 4 である 4 個のノードを含むプールの作成要求を示しています。This Batch .NET API code snippet shows a request to create a pool that contains four nodes with a maximum of four tasks per node. ここでは、1 つのノードがタスクでいっぱいになってからプール内の別のノードにタスクを割り当てるタスク スケジュール ポリシーが指定されています。It specifies a task scheduling policy that will fill each node with tasks prior to assigning tasks to another node in the pool. Batch .NET API を使用したプールの追加方法の詳細については、BatchClient.PoolOperations.CreatePool に関するページを参照してください。For more information on adding pools by using the Batch .NET API, see BatchClient.PoolOperations.CreatePool.

CloudPool pool =
    batchClient.PoolOperations.CreatePool(
        poolId: "mypool",
        targetDedicatedComputeNodes: 4
        virtualMachineSize: "standard_d1_v2",
        cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "5"));

pool.MaxTasksPerComputeNode = 4;
pool.TaskSchedulingPolicy = new TaskSchedulingPolicy(ComputeNodeFillType.Pack);
pool.Commit();

Batch REST の例Batch REST example

次の Batch REST API スニペットには、ノードごとの最大タスク数が 4 である 2 個の大きいノードを含むプールの作成要求を示します。This Batch REST API snippet shows a request to create a pool that contains two large nodes with a maximum of four tasks per node. REST API を使用したプールの追加方法の詳細については、アカウントへのプールの追加に関するページを参照してください。For more information on adding pools by using the REST API, see Add a pool to an account.

{
  "odata.metadata":"https://myaccount.myregion.batch.azure.com/$metadata#pools/@Element",
  "id":"mypool",
  "vmSize":"large",
  "cloudServiceConfiguration": {
    "osFamily":"4",
    "targetOSVersion":"*",
  }
  "targetDedicatedComputeNodes":2,
  "maxTasksPerNode":4,
  "enableInterNodeCommunication":true,
}

注意

maxTasksPerNode 要素および MaxTasksPerComputeNode プロパティは、プール作成時にのみ設定できます。You can set the maxTasksPerNode element and MaxTasksPerComputeNode property only at pool creation time. これらは、プール作成後に変更することはできません。They cannot be modified after a pool has already been created.

サンプル コードCode sample

CloudPool.MaxTasksPerComputeNode プロパティの使用方法は、GitHub の ParallelNodeTasks プロジェクトで紹介されています。The ParallelNodeTasks project on GitHub illustrates the use of the CloudPool.MaxTasksPerComputeNode property.

この C# コンソール アプリケーションでは、Batch .NET ライブラリを使用して、1 つ以上のコンピューティング ノードを含むプールを作成します。This C# console application uses the Batch .NET library to create a pool with one or more compute nodes. さらに、これらのノードで構成可能な数のタスクを実行して、可変負荷をシミュレートします。It executes a configurable number of tasks on those nodes to simulate variable load. アプリケーションの出力には、各タスクを実行したノードが示されます。Output from the application specifies which nodes executed each task. また、ジョブのパラメーターと実行時間の概要も出力されます。The application also provides a summary of the job parameters and duration. サンプル アプリケーションの 2 つの異なる実行からの出力の概要部分を以下に示します。The summary portion of the output from two different runs of the sample application appears below.

Nodes: 1
Node size: large
Max tasks per node: 1
Tasks: 32
Duration: 00:30:01.4638023

サンプル アプリケーションの 1 回目の実行では、プール内の 1 つのノードと、ノードごとに 1 タスクという既定の設定が使用され、ジョブの実行時間は 30 分を超えていることがわかります。The first execution of the sample application shows that with a single node in the pool and the default setting of one task per node, the job duration is over 30 minutes.

Nodes: 1
Node size: large
Max tasks per node: 4
Tasks: 32
Duration: 00:08:48.2423500

2 回目の実行では、ジョブの実行時間が大幅に短縮されています。The second run of the sample shows a significant decrease in job duration. これは、ノードごとのタスク数を 4 にしてプールが構成されているためであり、並列タスク実行によってほぼ 4 分の 1 の時間でジョブを完了できます。This is because the pool was configured with four tasks per node, which allows for parallel task execution to complete the job in nearly a quarter of the time.

注意

上記のジョブ期間には、プールの作成時間は含まれません。The job durations in the summaries above do not include pool creation time. 上記の各ジョブは事前に作成されたプールに送信されており、そのプールのコンピューティング ノードは送信の時点で アイドル 状態でした。Each of the jobs above was submitted to previously created pools whose compute nodes were in the Idle state at submission time.

次の手順Next steps

Batch Explorer のヒート マップBatch Explorer Heat Map

Batch Explorer は、Azure Batch アプリケーションの作成、デバッグ、および監視を支援する、豊富な機能を備えた無料のスタンドアロン クライアント ツールです。Batch Explorer is a free, rich-featured, standalone client tool to help create, debug, and monitor Azure Batch applications. Batch Explorer には、タスクの実行を視覚化する "ヒート マップ" 機能が含まれます。Batch Explorer contains a Heat Map feature that provides visualization of task execution. ParallelTasks サンプル アプリケーションを実行すると、ヒート マップ機能を使用し、各ノードでの並列タスクの実行を簡単に視覚化できます。When you're executing the ParallelTasks sample application, you can use the Heat Map feature to easily visualize the execution of parallel tasks on each node.