동시에 태스크를 실행하여 Batch 컴퓨팅 노드의 사용량 극대화Run tasks concurrently to maximize usage of Batch compute nodes

각 노드에서 두 개 이상의 작업을 동시에 실행 하 여 풀의 계산 노드에서 리소스 사용량을 최대화할 수 있습니다.You can maximize resource usage on a smaller number of compute nodes in your pool by running more than one task simultaneously on each node.

일부 시나리오는 단일 작업 전용 노드의 모든 리소스에서 가장 잘 작동 하지만, 여러 작업이 이러한 리소스를 공유 하는 경우 특정 워크 로드에서 작업 시간이 단축 되 고 비용이 절감 될 수 있습니다.While some scenarios work best with all of a node's resources dedicated to a single task, certain workloads may see shorter job times and lower costs when multiple tasks share those resources. 다음 시나리오를 고려하세요.Consider the following scenarios:

  • 데이터를 공유할 수 있는 태스크에 대 한 데이터 전송을 최소화 합니다.Minimize data transfer for tasks that are able to share data. 공유 데이터를 더 적은 수의 노드로 복사 하 고 각 노드에서 병렬로 태스크를 실행 하 여 데이터 전송 요금을 크게 줄일 수 있습니다.You can dramatically reduce data transfer charges by copying shared data to a smaller number of nodes, then 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.
  • 많은 양의 메모리를 필요로 하는 태스크에 대 한 메모리 사용을 최대화 합니다. 단, 짧은 기간 동안에만 실행 중에 변수를 사용 합니다.Maximize memory usage for tasks which 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 will have multiple tasks running in parallel on each node, but each task can take advantage of the nodes' plentiful memory at different times.
  • 풀 내에서 노드 간 통신이 필요한 경우 노드 번호 제한을 완화 합니다.Mitigate 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로 이동 하는 경우와 같이 온-프레미스 계산 클러스터를 복제 합니다.Replicate 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 및 메모리 요구 사항이 포함 된 작업 응용 프로그램에서 표준 _ D1 노드가 충분 하다 고 가정 합니다.As an example, imagine a task application with CPU and memory requirements such that Standard_D1 nodes are sufficient. 그러나 필요한 시간 내에 작업을 완료 하기 위해 이러한 노드의 1000이 필요 합니다.However, 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. 즉, 1000 노드 대신 16 배 작은 노드를 사용할 수 있습니다. 63만 필요 합니다.This means that 16 times fewer nodes could be used--instead of 1,000 nodes, only 63 would be required. 각 노드에 규모가 많은 응용 프로그램 파일 또는 참조 데이터가 필요한 경우 데이터가 63 노드에만 복사 되기 때문에 작업 기간 및 효율성이 향상 됩니다.If large application files or reference data are required for each node, job duration and efficiency are 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 라이브러리를 사용 하 여 풀을 만들 때 TaskSlotsPerNode 속성을 설정 합니다.With the Batch .NET library, set the CloudPool.TaskSlotsPerNode property when you create a pool. 일괄 처리 REST API 사용 하는 경우 풀을 만드는 동안 요청 본문에서 taskSlotsPerNode 요소를 설정 합니다.If you're using the Batch REST API, set the taskSlotsPerNode element in the request body during pool creation.

참고

taskSlotsPerNode풀을 만들 때만 요소 및 TaskSlotsPerNode 속성을 설정할 수 있습니다.You can set the taskSlotsPerNode element and TaskSlotsPerNode property only at pool creation time. 풀을 이미 만든 후에는 수정할 수 없습니다.They can't be modified after a pool has already been created.

Azure Batch를 사용 하 여 노드당 작업 슬롯을 노드 코어 수 (최대 4x)로 설정할 수 있습니다.Azure Batch allows you to set task slots per node up to (4x) the number of node cores. 예를 들어, 풀이 노드 크기 “Large”로 구성되었다면(4코어) taskSlotsPerNode 는 16으로 설정될 수 있습니다.For example, if the pool is configured with nodes of size "Large" (four cores), then taskSlotsPerNode may be set to 16. 그러나 노드에 있는 코어 수에 관계 없이 노드당 작업 슬롯을 256 개 이상 포함할 수 없습니다.However, regardless of how many cores the node has, you can't have more than 256 task slots 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.

풀에 자동 크기 조정 수식을 구성할 때는 taskSlotsPerNode 값을 고려해야 합니다.Be sure to take into account the taskSlotsPerNode 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 풀에서 자동으로 계산 노드 크기 조정을 참조 하세요.For more information, see Automatically scale compute nodes in an Azure Batch pool.

작업 배포 지정Specify task distribution

동시 태스크를 사용 하도록 설정할 때 풀의 노드 간에 작업을 분산 하는 방법을 지정 하는 것이 중요 합니다.When enabling concurrent tasks, 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"). 또는 작업이 풀의 다른 노드로 할당되기 전에 최대한 많은 작업이 각 노드에 할당되도록 지정할 수 있습니다.("압축")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").

예를 들어, TaskSlotsPerNode 값 16으로 구성 된 표준 _ D14 노드의 풀 (위 예제에서는)을 고려 합니다 .As an example, consider the pool of Standard_D14 nodes (in the example above) that is configured with a CloudPool.TaskSlotsPerNode value of 16. Cloudpool.taskschedulingpolicyPackComputeNodeFillType 로 구성 된 경우 각 노드의 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 remove unused nodes (nodes without any tasks assigned) from the pool. 리소스 사용량을 최소화하고 비용을 절감합니다.This minimizes resource usage and saves money.

작업당 가변 슬롯 정의Define variable slots per task

작업은 클라우드 노드를 실행 하는 데 필요한 슬롯 수를 지정 하 여 Cloudtask. RequiredSlots 속성으로 정의할 수 있습니다.A task can be defined with CloudTask.RequiredSlots property, specifying how many slots it requires to run on a compute node. 기본값은 1입니다.The default value is 1. 계산 노드의 리소스 사용량과 관련 하 여 작업의 가중치가 다른 경우 가변 작업 슬롯을 설정할 수 있습니다.You can set variable task slots if your tasks have different weights regarding to resource usage on the compute node. 이렇게 하면 CPU 또는 메모리와 같은 과도 한 시스템 리소스 없이 각 계산 노드에 적절 한 수의 동시 실행 태스크가 있을 수 있습니다.This lets each compute node have a reasonable number of concurrent running tasks without overwhelming system resources like CPU or memory.

예를 들어 속성이 있는 풀의 경우에는를 taskSlotsPerNode = 8 사용 하 여 다중 코어 필수 CPU 집약적 작업을 전송할 수 requiredSlots = 8 있지만 다른 작업은로 설정할 수 있습니다 requiredSlots = 1 .For example, for a pool with property taskSlotsPerNode = 8, you can submit multi-core required CPU-intensive tasks with requiredSlots = 8, while other tasks can be set to requiredSlots = 1. 이 혼합 된 워크 로드가 예약 되 면 CPU를 많이 사용 하는 작업이 해당 계산 노드에서 독점적으로 실행 되지만 다른 태스크는 동시에 (한 번에 최대 8 개의 작업) 다른 노드에서 실행 될 수 있습니다.When this mixed workload is scheduled, the CPU-intensive tasks will run exclusively on their compute nodes, while other tasks can run concurrently (up to eight tasks at once) on other nodes. 이를 통해 계산 노드에서 워크 로드의 균형을 조정 하 고 리소스 사용 효율성을 향상 시킬 수 있습니다.This helps you balance your workload across compute nodes and improve resource usage efficiency.

작업의를 requiredSlots 풀의 보다 크게 지정 하지 않아야 taskSlotsPerNode 합니다.Be sure you don't specify a task's requiredSlots to be greater than the pool's taskSlotsPerNode. 이렇게 하면 작업을 실행할 수 없습니다.This will result in the task never being able to run. 일괄 처리 서비스는 작업을 제출할 때 작업을 제출할 때이 충돌의 유효성을 검사 하지 않습니다. 즉, 작업에 전송 시간에 바인딩된 풀이 없거나 사용 하지 않도록 설정 하거나 다시 사용 하도록 설정 하 여 다른 풀로 변경할 수 있습니다.The Batch Service doesn't currently validate this conflict when you submit tasks because a job may not have a pool bound at submission time, or it could be changed to a different pool by disabling/re-enabling.

변수 작업 슬롯을 사용 하는 경우 일부 노드에 여전히 유휴 슬롯이 있는 경우에도 모든 계산 노드에서 충분 한 슬롯을 사용할 수 없기 때문에 더 많은 필수 슬롯을 가진 대량 작업을 일시적으로 예약 하지 못할 수 있습니다.When using variable task slots, it's possible that large tasks with more required slots can temporarily fail to be scheduled because not enough slots are available on any compute node, even when there are still idle slots on some nodes. 이러한 작업에 대 한 작업 우선 순위를 높여 노드의 사용 가능한 슬롯에 대해 경쟁 하는 기회를 높일 수 있습니다.You can raise the job priority for these tasks to increase their chance to compete for available slots on nodes.

일괄 처리 서비스는 실행할 작업을 예약 하지 못할 때 TaskScheduleFailEvent 을 내보내고, 필수 슬롯을 사용할 수 있을 때까지 일정을 다시 시도 합니다.The Batch service emits the TaskScheduleFailEvent when it fails to schedule a task to run, and keeps retrying the scheduling until required slots become available. 이 이벤트를 수신 하 여 잠재적인 작업 예약 문제를 감지 하 고 적절 하 게 완화할 수 있습니다.You can listen to that event to detect potential task scheduling issues and mitigate accordingly.

Batch .NET 예Batch .NET example

다음 Batch .Net API 코드 조각은 노드당 여러 작업 슬롯과 함께 풀을 만드는 방법 및 필수 슬롯을 사용 하 여 작업을 제출 하는 방법을 보여 줍니다.The following Batch .NET API code snippets show how to create a pool with multiple task slots per node and how to submit a task with required slots.

노드당 여러 작업 슬롯을 사용 하 여 풀 만들기Create a pool with multiple task slots per node

이 코드 조각은 노드당 4 개의 작업 슬롯이 허용 된 4 개의 노드를 포함 하는 풀을 만드는 요청을 보여 줍니다.This code snippet shows a request to create a pool that contains four nodes, with four task slots allowed per node. 풀의 다른 노드로 작업을 할당하기 전에 각 노드를 채울 정책을 예약하는 작업을 지정합니다.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.TaskSlotsPerNode = 4;
pool.TaskSchedulingPolicy = new TaskSchedulingPolicy(ComputeNodeFillType.Pack);
pool.Commit();

필수 슬롯을 사용 하 여 작업 만들기Create a task with required slots

이 코드 조각은 기본값이 아닌 작업을 만듭니다 requiredSlots .This code snippet creates a task with non-default requiredSlots. 이 작업은 계산 노드에 사용할 수 있는 사용 가능한 슬롯이 충분 한 경우에만 실행 됩니다.This task will only run when there are enough free slots available on a compute node.

CloudTask task = new CloudTask(taskId, taskCommandLine)
{
    RequiredSlots = 2
};

작업 및 슬롯 실행 횟수를 포함 하는 계산 노드 나열List compute nodes with counts for running tasks and slots

이 코드 조각은 풀의 모든 계산 노드를 나열 하 고 노드당 실행 중인 태스크 및 태스크 슬롯 수를 출력 합니다.This code snippet lists all compute nodes in the pool, and prints out the counts for running tasks and task slots per node.

ODATADetailLevel nodeDetail = new ODATADetailLevel(selectClause: "id,runningTasksCount,runningTaskSlotsCount");
IPagedEnumerable<ComputeNode> nodes = batchClient.PoolOperations.ListComputeNodes(poolId, nodeDetail);

await nodes.ForEachAsync(node =>
{
    Console.WriteLine(node.Id + " :");
    Console.WriteLine($"RunningTasks = {node.RunningTasksCount}, RunningTaskSlots = {node.RunningTaskSlotsCount}");

}).ConfigureAwait(continueOnCapturedContext: false);

작업의 작업 수를 나열 합니다.List task counts for the job

이 코드 조각은 태스크에 대 한 태스크 수를 가져오며 태스크 상태 마다 태스크 및 태스크 슬롯 수를 모두 포함 합니다.This code snippet gets task counts for the job, which includes both tasks and task slots count per task state.

TaskCountsResult result = await batchClient.JobOperations.GetJobTaskCountsAsync(jobId);

Console.WriteLine("\t\tActive\tRunning\tCompleted");
Console.WriteLine($"TaskCounts:\t{result.TaskCounts.Active}\t{result.TaskCounts.Running}\t{result.TaskCounts.Completed}");
Console.WriteLine($"TaskSlotCounts:\t{result.TaskSlotCounts.Active}\t{result.TaskSlotCounts.Running}\t{result.TaskSlotCounts.Completed}");

Batch REST 예Batch REST example

다음 BATCH REST API 코드 조각은 노드당 여러 개의 작업 슬롯과 함께 풀을 만드는 방법 및 필수 슬롯을 사용 하 여 작업을 제출 하는 방법을 보여 줍니다.The following Batch REST API code snippets show how to create a pool with multiple task slots per node and how to submit a task with required slots.

노드당 여러 작업 슬롯을 사용 하 여 풀 만들기Create a pool with multiple task slots per node

이 코드 조각은 노드당 최대 4 개의 작업을 포함 하는 두 개의 대량 노드가 포함 된 풀을 만드는 요청을 보여 줍니다.This 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,
  "taskSlotsPerNode":4,
  "enableInterNodeCommunication":true,
}

필수 슬롯을 사용 하 여 작업 만들기Create a task with required slots

이 코드 조각은 기본값이 아닌 작업을 추가 하는 요청을 보여 줍니다 requiredSlots .This snippet shows a request to add a task with non-default requiredSlots. 이 작업은 계산 노드에 사용할 수 있는 사용 가능한 슬롯이 충분 한 경우에만 실행 됩니다.This task will only run when there are enough free slots available on the compute node.

{
  "id": "taskId",
  "commandLine": "bash -c 'echo hello'",
  "userIdentity": {
    "autoUser": {
      "scope": "task",
      "elevationLevel": "nonadmin"
    }
  },
  "requiredSLots": 2
}

GitHub의 코드 샘플Code sample on GitHub

GitHub의 ParallelTasks 프로젝트에서는 TaskSlotsPerNode 속성을 사용 하는 방법을 보여 줍니다.The ParallelTasks project on GitHub illustrates the use of the CloudPool.TaskSlotsPerNode property.

이 C# 콘솔 애플리케이션은 Batch .NET 라이브러리를 사용하여 하나 이상의 컴퓨팅 노드가 있는 풀을 만듭니다.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 a variable load. 응용 프로그램의 출력에는 각 작업을 실행 한 노드가 표시 됩니다.Output from the application shows which nodes executed each task. 또한 애플리케이션은 작업 매개 변수 및 기간의 요약을 제공합니다.The application also provides a summary of the job parameters and duration.

예를 들어, 아래는 ParallelTasks 샘플 응용 프로그램의 두 가지 다른 실행에서 출력의 요약 부분입니다.As an example, below is the summary portion of the output from two different runs of the ParallelTasks sample application. 전송 시간에 계산 노드가 유휴 상태 였던 이전에 만든 풀로 각 작업을 제출 했으므로 여기에 표시 된 작업 기간에는 풀 생성 시간이 포함 되지 않습니다.Job durations shown here don't include pool creation time, since each job was submitted to a previously created pool whose compute nodes were in the Idle state at submission time.

샘플 애플리케이션의 최초 실행에서는 풀 내 단일 노드 및 노드 당 작업의 기본값 설정을 보여주며 작업 길이는 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
Task slots per node: 1
Max slots per task: 1
Tasks: 32
Duration: 00:30:01.4638023

샘플의 두 번째 실행은 작업 기간에서 크게 감소합니다.The second run of the sample shows a significant decrease in job duration. 이는 풀이 노드당 4 개의 작업으로 구성 되었기 때문입니다. 병렬 작업 실행이 거의 시간 동안 작업을 완료할 수 있습니다.This is because the pool was configured with four tasks per node, allowing for parallel task execution to complete the job in nearly a quarter of the time.

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

다음 단계Next steps

  • Batch Explorer 열 지도를 사용해 보세요.Try the 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. ParallelTasks 샘플 응용 프로그램을 실행 하는 경우 Batch Explorer 열 지도 기능을 사용 하면 각 노드에서 병렬 작업의 실행을 쉽게 시각화할 수 있습니다.When you're executing the ParallelTasks sample application, the Batch Explorer Heat Map feature lets you easily visualize the execution of parallel tasks on each node.
  • GitHub에서 Azure Batch 샘플을탐색 합니다.Explore Azure Batch samples on GitHub.
  • Batch 태스크 종속성에 대해 자세히 알아보세요.Learn more about Batch task dependencies.