Eseguire attività contemporaneamente per ottimizzare l'uso dei nodi di calcolo BatchRun tasks concurrently to maximize usage of Batch compute nodes

Eseguendo più attività contemporaneamente in ogni nodo di calcolo nel pool di Azure Batch, è possibile ottimizzare l'utilizzo delle risorse in un numero inferiore di nodi nel pool.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. Per alcuni carichi di lavoro, questo può consentire tempi di processo più brevi e riduzione del costo.For some workloads, this can result in shorter job times and lower cost.

In alcuni scenari è utile che le risorse di un nodo siano dedicate a una singola attività, ma in molti casi è consigliabile che più attività possano condividere tali risorse: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:

  • Riduzione dei trasferimenti di dati nei casi in cui le risorse possono condividere i dati.Minimizing data transfer when tasks are able to share data. In questo scenario, è possibile ridurre notevolmente i costi di trasferimento dei dati copiando i dati condivisi in un numero inferiore di nodi ed eseguendo le attività in parallelo in ogni nodo.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. Questa opzione è praticabile soprattutto se i dati da copiare in ogni nodo devono essere trasferiti tra aree geografiche.This especially applies if the data to be copied to each node must be transferred between geographic regions.
  • Ottimizzazione dell'utilizzo della memoria quando le attività richiedono quantità di memoria elevate ma solo per brevi periodi di tempo e in ore variabili durante l'esecuzione.Maximizing memory usage when tasks require a large amount of memory, but only during short periods of time, and at variable times during execution. È possibile usare un numero minore di istanze dei nodi, ma di dimensioni maggiori e con più memoria per gestire in modo efficiente i picchi.You can employ fewer, but larger, compute nodes with more memory to efficiently handle such spikes. Queste istanze dei nodi avranno più attività in esecuzione in parallelo su ogni nodo, ma ogni attività può sfruttare i vantaggi offerti dall'uso di una memoria con molti nodi in momenti diversi.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.
  • Riduzione dei limiti del numero di nodi quando è necessaria la comunicazione tra nodi all'interno di un pool.Mitigating node number limits when inter-node communication is required within a pool. Attualmente, per i pool configurati per la comunicazione tra nodi è previsto un limite di 50 nodi di calcolo,Currently, pools configured for inter-node communication are limited to 50 compute nodes. quindi, se ogni nodo nel pool può eseguire attività in parallelo, è possibile eseguire simultaneamente un maggior numero di attività.If each node in such a pool is able to execute tasks in parallel, a greater number of tasks can be executed simultaneously.
  • Replica di un cluster di elaborazione locale, ad esempio durante il primo spostamento di un ambiente di calcolo in Azure.Replicating an on-premises compute cluster, such as when you first move a compute environment to Azure. Se la soluzione locale corrente esegue più attività per ogni nodo di calcolo, è possibile aumentare il numero massimo di attività dei nodi per rispecchiare maggiormente tale configurazione.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.

Scenario di esempioExample scenario

Per mostrare i vantaggi dell'esecuzione parallela di attività, si supponga che l'applicazione delle attività abbia requisiti di CPU e memoria che possono essere soddisfatti da dimensioni del nodo 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. Per poter terminare il processo nei tempi previsti sono tuttavia necessari 1.000 nodi.But, in order to finish the job in the required time, 1,000 of these nodes are needed.

Invece di usare nodi Standard_D1 con 1 core CPU, è possibile usare nodi Standard_D14 con 16 core ognuno e abilitare l'esecuzione parallela delle attività.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. Sarà quindi possibile usare un numero di nodi inferiore di 16 volte e invece di 1.000 nodi ne serviranno solo 63.Therefore, 16 times fewer nodes could be used--instead of 1,000 nodes, only 63 would be required. Se ogni nodo usa file dell'applicazione o dati di riferimento di grandi dimensioni, è anche possibile ottimizzare la durata e l'efficienza dei processi perché i dati vengono copiati solo in 63 nodi.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.

Abilitare l'esecuzione parallela di attivitàEnable parallel task execution

I nodi di calcolo per l'esecuzione di attività parallele vengono configurati a livello di pool.You configure compute nodes for parallel task execution at the pool level. Con la libreria Batch .NET, impostare la proprietà CloudPool.MaxTasksPerComputeNode durante la creazione di un pool.With the Batch .NET library, set the CloudPool.MaxTasksPerComputeNode property when you create a pool. Se si usa l'API REST Batch, impostare l'elemento maxTasksPerNode nel corpo della richiesta durante la creazione del pool.If you are using the Batch REST API, set the maxTasksPerNode element in the request body during pool creation.

Con Azure Batch è possibile impostare il numero massimo di attività consentite per nodo fino a quattro volte (4x) il numero di core del nodo.Azure Batch allows you to set maximum tasks per node up to four times (4x) the number of node cores. Ad esempio, se il pool è configurato con nodi di grandi dimensioni (quattro core), è possibile impostare il valore di maxTasksPerNode su 16.For example, if the pool is configured with nodes of size "Large" (four cores), then maxTasksPerNode may be set to 16. Per informazioni dettagliate sul numero di core per ognuna delle dimensioni del nodo, vedere Dimensioni dei servizi cloud.For details on the number of cores for each of the node sizes, see Sizes for Cloud Services. Per altre informazioni sui limiti del servizio, vedere Quote e limiti per il servizio Azure Batch.For more information on service limits, see Quotas and limits for the Azure Batch service.

Suggerimento

Verificare di tener conto del valore maxTasksPerNode durante la creazione di una formula di scalabilità automatica per il pool.Be sure to take into account the maxTasksPerNode value when you construct an autoscale formula for your pool. Ad esempio, l'impatto di un aumento delle attività per nodo può influire in modo significativo su una formula che valuta $RunningTasks .For example, a formula that evaluates $RunningTasks could be dramatically affected by an increase in tasks per node. Per altre informazioni, vedere Ridimensionare automaticamente i nodi di calcolo in un pool di Azure Batch .See Automatically scale compute nodes in an Azure Batch pool for more information.

Distribuzione delle attivitàDistribution of tasks

Quando i nodi di calcolo in un pool possono eseguire attività simultaneamente, è importante specificare come distribuire le attività tra i nodi nel pool.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.

La proprietà CloudPool.TaskSchedulingPolicy consente di specificare che le attività vengano assegnate in modo uniforme in tutti i nodi del pool ("distribuzione").By using the CloudPool.TaskSchedulingPolicy property, you can specify that tasks should be assigned evenly across all nodes in the pool ("spreading"). In alternativa, è possibile specificare che più attività possibili vengano assegnate a ciascun nodo prima di essere assegnate a un altro nodo del pool ("imballaggio").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").

Per comprendere l'importanza di questa funzionalità, si consideri il pool di nodi Standard_D14 (nell'esempio precedente) configurato con un valore per CloudPool.MaxTasksPerComputeNode pari a 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. Se CloudPool.TaskSchedulingPolicy è configurato con un tipo ComputeNodeFillType per Pack, viene ottimizzato l'uso di tutti i 16 core di ogni nodo e, per i pool con scalabilità automatica, è possibile escludere dal pool i nodi non usati, cioè quelli a cui non sono assegnate attività.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). Ciò consente di ridurre al minimo l'utilizzo delle risorse e di generare un risparmio sui costi.This minimizes resource usage and saves money.

Esempio per Batch .NETBatch .NET example

Questo frammento di codice dell'API Batch .NET specifica una richiesta per creare un pool contenente quattro nodi di grandi dimensioni con un massimo di quattro attività per nodo.This Batch .NET API code snippet shows a request to create a pool that contains four large nodes with a maximum of four tasks per node. Specifica i criteri di pianificazione delle attività che definiscono le attività da inserire in ogni nodo prima di assegnarle a un altro nodo nel pool.It specifies a task scheduling policy that will fill each node with tasks prior to assigning tasks to another node in the pool. Per altre informazioni sull'aggiunta di pool con l'API Batch .NET, vedere 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: "large",
        cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "4"));

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

Esempio per Batch RESTBatch REST example

Questo frammento di codice dell'API REST Batch specifica una richiesta per creare un pool contenente due nodi di grandi dimensioni con un massimo di quattro attività per nodo.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. Per altre informazioni sull'aggiunta di pool con l'API REST, vedere Aggiungere un pool a un account.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,
}

Nota

L'elemento maxTasksPerNode e la proprietà MaxTasksPerComputeNode possono essere impostati solo al momento della creazione del pool.You can set the maxTasksPerNode element and MaxTasksPerComputeNode property only at pool creation time. e non possono essere modificati una volta che il pool è stato creato.They cannot be modified after a pool has already been created.

Esempio di codiceCode sample

Il progetto ParallelNodeTasks in GitHub illustra l'uso della proprietà CloudPool.MaxTasksPerComputeNode.The ParallelNodeTasks project on GitHub illustrates the use of the CloudPool.MaxTasksPerComputeNode property.

Questa applicazione console C# usa la libreria Batch .NET per creare un pool con uno o più nodi di calcoloThis C# console application uses the Batch .NET library to create a pool with one or more compute nodes. ed esegue un numero configurabile di attività su tali nodi per simulare un carico variabile.It executes a configurable number of tasks on those nodes to simulate variable load. L'output dell'applicazione specifica quali nodi eseguono una specifica attività.Output from the application specifies which nodes executed each task. L'applicazione fornisce inoltre un riepilogo dei parametri e della durata del processo.The application also provides a summary of the job parameters and duration. Di seguito è visualizzato la parte relativa al riepilogo dell'output da due diverse esecuzioni dell'applicazione di esempio.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

La prima esecuzione dell'applicazione di esempio mostra che con un singolo nodo nel pool e con l'impostazione predefinita di un'attività per nodo, la durata del processo è superiore a 30 minuti.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

La seconda esecuzione dell'esempio illustra una diminuzione significativa nella durata del processo.The second run of the sample shows a significant decrease in job duration. In questo modo il pool è stato configurato con quattro attività per ogni nodo, consentendo all'esecuzione di attività parallele di completare il processo in circa un quarto del tempo.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.

Nota

Le durate del processo nei riepiloghi precedenti non includono il tempo di creazione del pool.The job durations in the summaries above do not include pool creation time. Tutti i processi precedenti sono stati inviati a pool creati in precedenza, i cui nodi di calcolo si trovavano nello stato inattivo al momento dell'invio.Each of the jobs above was submitted to previously created pools whose compute nodes were in the Idle state at submission time.

Passaggi successiviNext steps

Mappa termica di BatchLabsBatchLabs Heat Map

BatchLabs è uno strumento client autonomo, gratuito e ricco di funzionalità che semplifica la creazione, il debug e il monitoraggio delle applicazioni Azure Batch.BatchLabs is a free, rich-featured, standalone client tool to help create, debug, and monitor Azure Batch applications. BatchLabs contiene una funzione Mappa termica che fornisce una visualizzazione dell'esecuzione delle attività.BatchLabs contains a Heat Map feature that provides visualization of task execution. Durante l'esecuzione dell'applicazione di esempio ParallelTasks, è possibile usare la funzionalità Mappa termica per visualizzare facilmente l'esecuzione delle attività parallele in ogni nodo.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.