Usare le attività a istanze multiple per eseguire applicazioni MPI (Message Passing Interface) in BatchUse multi-instance tasks to run Message Passing Interface (MPI) applications in Batch

Le attività a istanze multiple permettono di eseguire un'attività di Azure Batch in più nodi di calcolo contemporaneamenteMulti-instance tasks allow you to run an Azure Batch task on multiple compute nodes simultaneously. e di abilitare scenari high performance computing, ad esempio le applicazioni MPI (Message Passing Interface) in Batch.These tasks enable high performance computing scenarios like Message Passing Interface (MPI) applications in Batch. Questo articolo illustra come eseguire attività a istanze multiple usando la libreria Batch .NET.In this article, you learn how to execute multi-instance tasks using the Batch .NET library.

Nota

Gli esempi in questo articolo sono incentrati sui nodi di calcolo Batch .NET, MS-MPI e Windows, mentre i concetti relativi alle attività a istanze multiple illustrati di seguito sono applicabili ad altre piattaforme e tecnologie, ad esempio Python e Intel MPI sui nodi Linux.While the examples in this article focus on Batch .NET, MS-MPI, and Windows compute nodes, the multi-instance task concepts discussed here are applicable to other platforms and technologies (Python and Intel MPI on Linux nodes, for example).

Panoramica sulle attività a istanze multipleMulti-instance task overview

In Batch ogni attività viene in genere eseguita in un singolo nodo di calcolo, si inviano più attività a un processo e il servizio Batch pianifica l'esecuzione di ogni attività in un nodo.In Batch, each task is normally executed on a single compute node--you submit multiple tasks to a job, and the Batch service schedules each task for execution on a node. Tuttavia, configurando le impostazioni per istanze multiple, si indica a Batch invece di creare un'attività primaria e svariate sottoattività per che quindi sono eseguite su più nodi.However, by configuring a task's multi-instance settings, you tell Batch to instead create one primary task and several subtasks that are then executed on multiple nodes.

Panoramica sulle attività a istanze multipleMulti-instance task overview

Quando si invia a un processo un'attività con impostazioni per istanze multiple, Batch esegue diversi passaggi relativi esclusivamente alle attività a istanze multiple:When you submit a task with multi-instance settings to a job, Batch performs several steps unique to multi-instance tasks:

  1. Il servizio Batch crea un'attività primaria e diverse sottoattività in base alle impostazioni multi-istanza.The Batch service creates one primary and several subtasks based on the multi-instance settings. Il numero totale di attività, ovvero quella primaria e tutte le sottoattività, corrisponde al numero di istanze (nodi di calcolo) specificato nelle impostazioni per istanze multiple.The total number of tasks (primary plus all subtasks) matches the number of instances (compute nodes) you specify in the multi-instance settings.
  2. Il servizio Batch definisce uno dei nodi di calcolo come master e pianifica l'attività primaria da eseguire sul master.Batch designates one of the compute nodes as the master, and schedules the primary task to execute on the master. Pianifica le sottoattività da eseguire sugli altri nodi di calcolo allocati all'attività a istanze multiple, una sottoattività per ogni nodo.It schedules the subtasks to execute on the remainder of the compute nodes allocated to the multi-instance task, one subtask per node.
  3. L'attività primaria e tutte le sottoattività scaricano gli eventuali file di risorse comuni specificati nelle impostazioni per istanze multiple.The primary and all subtasks download any common resource files you specify in the multi-instance settings.
  4. Dopo aver scaricato i file di risorse comuni, l'attività primaria e le sottoattività eseguono il comando di coordinamento specificato nelle impostazioni per istanze multiple.After the common resource files have been downloaded, the primary and subtasks execute the coordination command you specify in the multi-instance settings. Il comando di coordinamento viene usato in genere per preparare i nodi per l'esecuzione dell'attività.The coordination command is typically used to prepare nodes for executing the task. Un esempio è l'avvio di servizi in background, come smpd.exe di Microsoft MPI, e la verifica che i nodi siano pronti per elaborare messaggi tra i nodi.This can include starting background services (such as Microsoft MPI's smpd.exe) and verifying that the nodes are ready to process inter-node messages.
  5. L'attività primaria esegue il comando applicazione sul nodo master dopo il completamento del comando di coordinamento da parte dell'attività primaria e di tutte le sottoattività.The primary task executes the application command on the master node after the coordination command has been completed successfully by the primary and all subtasks. Il comando applicazione, vale a dire la riga di comando dell'attività a istanze multiple stessa, viene eseguito solo dall'attività primaria.The application command is the command line of the multi-instance task itself, and is executed only by the primary task. In una soluzione basata su MS-MPI, qui viene eseguita l'applicazione abilitata per MPI tramite mpiexec.exe.In an MS-MPI-based solution, this is where you execute your MPI-enabled application using mpiexec.exe.

Nota

Anche se distinta a livello funzionale, l'attività a istanze multiple non è un tipo di attività univoco come ad esempio StartTask o JobPreparationTask.Though it is functionally distinct, the "multi-instance task" is not a unique task type like the StartTask or JobPreparationTask. Si tratta semplicemente di un'attività Batch standard, CloudTask in Batch .NET, per cui sono state configurate le impostazioni per istanze multiple.The multi-instance task is simply a standard Batch task (CloudTask in Batch .NET) whose multi-instance settings have been configured. In questo articolo viene definita attività a istanze multiple.In this article, we refer to this as the multi-instance task.

Requisiti delle attività a istanze multipleRequirements for multi-instance tasks

Per le attività a istanze multiple è necessario un pool in cui sia abilitata la comunicazione tra i nodi e disabilitata l'esecuzione di attività simultanee.Multi-instance tasks require a pool with inter-node communication enabled, and with concurrent task execution disabled. Per disabilitare l'esecuzione di attività simultanee, impostare la proprietà CloudPool.MaxTasksPerComputeNode su 1.To disable concurrent task execution, set the CloudPool.MaxTasksPerComputeNode property to 1.

Questo frammento di codice illustra come creare un pool per le attività a istanze multiple usando la libreria Batch .NET.This code snippet shows how to create a pool for multi-instance tasks using the Batch .NET library.

CloudPool myCloudPool =
    myBatchClient.PoolOperations.CreatePool(
        poolId: "MultiInstanceSamplePool",
        targetDedicatedComputeNodes: 3
        virtualMachineSize: "small",
        cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "4"));

// Multi-instance tasks require inter-node communication, and those nodes
// must run only one task at a time.
myCloudPool.InterComputeNodeCommunicationEnabled = true;
myCloudPool.MaxTasksPerComputeNode = 1;

Nota

Se si prova a eseguire un'attività a istanze multiple in un pool con la comunicazione tra i nodi disabilitata o con un valore maxTasksPerNode maggiore di 1, l'attività non viene pianificata e rimane nello stato "attivo" per un periodo illimitato.If you try to run a multi-instance task in a pool with internode communication disabled, or with a maxTasksPerNode value greater than 1, the task is never scheduled--it remains indefinitely in the "active" state.

Le attività a istanze multiple possono essere eseguite solo in nodi di pool creati dopo il 14 dicembre 2015.Multi-instance tasks can execute only on nodes in pools created after 14 December 2015.

Utilizzare uno StartTask per installare MPIUse a StartTask to install MPI

Per eseguire applicazioni MPI con un'attività a più istanze, è necessario innanzitutto installare un'implementazione MPI (MS-MPI o Intel MPI, ad esempio) sui nodi di calcolo nel pool.To run MPI applications with a multi-instance task, you first need to install an MPI implementation (MS-MPI or Intel MPI, for example) on the compute nodes in the pool. Questo è il momento giusto per usare un oggetto StartTask, che viene eseguito ogni volta che un nodo viene aggiunto a un pool o viene riavviato.This is a good time to use a StartTask, which executes whenever a node joins a pool, or is restarted. Questo frammento di codice crea un oggetto StartTask che specifica il pacchetto di installazione di MS-MPI come file di risorse.This code snippet creates a StartTask that specifies the MS-MPI setup package as a resource file. La riga di comando dell'attività di avvio viene eseguita dopo avere scaricato il file di risorse sul nodo.The start task's command line is executed after the resource file is downloaded to the node. In questo caso, la riga di comando esegue un'installazione automatica di MS-MPI.In this case, the command line performs an unattended install of MS-MPI.

// Create a StartTask for the pool which we use for installing MS-MPI on
// the nodes as they join the pool (or when they are restarted).
StartTask startTask = new StartTask
{
    CommandLine = "cmd /c MSMpiSetup.exe -unattend -force",
    ResourceFiles = new List<ResourceFile> { new ResourceFile("https://mystorageaccount.blob.core.windows.net/mycontainer/MSMpiSetup.exe", "MSMpiSetup.exe") },
    UserIdentity = new UserIdentity(new AutoUserSpecification(elevationLevel: ElevationLevel.Admin)),
    WaitForSuccess = true
};
myCloudPool.StartTask = startTask;

// Commit the fully configured pool to the Batch service to actually create
// the pool and its compute nodes.
await myCloudPool.CommitAsync();

Accesso diretto a memoria remota (RDMA)Remote direct memory access (RDMA)

Quando si sceglie una dimensione che supporta RDMA come ad esempio A9 per i nodi di calcolo nel pool Batch, l'applicazione MPI può sfruttare i vantaggi legati alle prestazioni elevate e alla latenza ridotta della rete con Accesso diretto a memoria remota (RDMA) di Azure.When you choose an RDMA-capable size such as A9 for the compute nodes in your Batch pool, your MPI application can take advantage of Azure's high-performance, low-latency remote direct memory access (RDMA) network.

Cercare le dimensioni specificate come "Co supporto di RDMA" nei seguenti articoli:Look for the sizes specified as "RDMA capable" in the following articles:

Nota

Per sfruttare i RDMA in nodi di calcolo Linux, è necessario utilizzare Intel MPI sui nodi.To take advantage of RDMA on Linux compute nodes, you must use Intel MPI on the nodes. Per ulteriori informazioni sui pool CloudServiceConfiguration e VirtualMachineConfiguration, vedere la sezione Pool di Cenni preliminari sulla funzionalità di Batch.For more information on CloudServiceConfiguration and VirtualMachineConfiguration pools, see the Pool section of the Batch feature overview.

Creare un'attività a istanze multiple con Batch .NETCreate a multi-instance task with Batch .NET

Ora che sono stati illustrati i requisiti del pool e l'installazione del pacchetto MPI, è possibile passare alla creazione dell'attività a istanze multiple.Now that we've covered the pool requirements and MPI package installation, let's create the multi-instance task. In questo frammento di codice viene creato un oggetto CloudTask standard e viene quindi configurata la relativa proprietà MultiInstanceSettings.In this snippet, we create a standard CloudTask, then configure its MultiInstanceSettings property. Come specificato in precedenza, l'attività a istanze multiple non è un tipo di attività distinto ma un'attività Batch Standard configurata con impostazioni per istanze multiple.As mentioned earlier, the multi-instance task is not a distinct task type, but a standard Batch task configured with multi-instance settings.

// Create the multi-instance task. Its command line is the "application command"
// and will be executed *only* by the primary, and only after the primary and
// subtasks execute the CoordinationCommandLine.
CloudTask myMultiInstanceTask = new CloudTask(id: "mymultiinstancetask",
    commandline: "cmd /c mpiexec.exe -wdir %AZ_BATCH_TASK_SHARED_DIR% MyMPIApplication.exe");

// Configure the task's MultiInstanceSettings. The CoordinationCommandLine will be executed by
// the primary and all subtasks.
myMultiInstanceTask.MultiInstanceSettings =
    new MultiInstanceSettings(numberOfNodes) {
    CoordinationCommandLine = @"cmd /c start cmd /c ""%MSMPI_BIN%\smpd.exe"" -d",
    CommonResourceFiles = new List<ResourceFile> {
    new ResourceFile("https://mystorageaccount.blob.core.windows.net/mycontainer/MyMPIApplication.exe",
                     "MyMPIApplication.exe")
    }
};

// Submit the task to the job. Batch will take care of splitting it into subtasks and
// scheduling them for execution on the nodes.
await myBatchClient.JobOperations.AddTaskAsync("mybatchjob", myMultiInstanceTask);

Attività primaria e sottoattivitàPrimary task and subtasks

Quando si creano le impostazioni per istanze multiple per un'attività, è necessario specificare il numero di nodi di calcolo che devono eseguire l'attività.When you create the multi-instance settings for a task, you specify the number of compute nodes that are to execute the task. Quando si invia l'attività a un processo, il servizio Batch crea un'attività primaria e un numero sufficiente di sottoattività che, insieme, corrispondono al numero di nodi specificato.When you submit the task to a job, the Batch service creates one primary task and enough subtasks that together match the number of nodes you specified.

Alle attività viene assegnato un ID intero compreso tra 0 e numberOfInstances -1.These tasks are assigned an integer id in the range of 0 to numberOfInstances - 1. L'attività con ID 0 è quella primaria, tutti gli altri ID corrispondono a sottoattività.The task with id 0 is the primary task, and all other ids are subtasks. Ad esempio, se si creano le impostazioni per istanze multiple seguenti per un'attività, l'attività primaria avrà l'ID 0 e le sottoattività avranno un ID compreso tra 1 e 9.For example, if you create the following multi-instance settings for a task, the primary task would have an id of 0, and the subtasks would have ids 1 through 9.

int numberOfNodes = 10;
myMultiInstanceTask.MultiInstanceSettings = new MultiInstanceSettings(numberOfNodes);

Nodo masterMaster node

Quando si invia un'attività a istanze multiple, il servizio Batch definisce uno dei nodi di calcolo come nodo "master" e pianifica l'attività primaria da eseguire sul nodo master.When you submit a multi-instance task, the Batch service designates one of the compute nodes as the "master" node, and schedules the primary task to execute on the master node. Le sottoattività vengono pianificate da eseguire sugli altri nodi allocati all'attività a istanze multiple.The subtasks are scheduled to execute on the remainder of the nodes allocated to the multi-instance task.

comando di coordinamentoCoordination command

Il comando di coordinamento viene eseguita sia dall'attività primaria che dalle sottoattività.The coordination command is executed by both the primary and subtasks.

La chiamata del comando di coordinamento blocca l'esecuzione del comando applicazione da parte del servizio Batch fino a quando il comando di coordinamento non viene restituito per tutte le sottoattività.The invocation of the coordination command is blocking--Batch does not execute the application command until the coordination command has returned successfully for all subtasks. Il comando di coordinamento deve quindi avviare eventuali servizi in background necessari, verificare che siano pronti per l'uso e chiudersi.The coordination command should therefore start any required background services, verify that they are ready for use, and then exit. Ad esempio, questo comando di coordinamento per una soluzione con MS-MPI versione 7 avvia il servizio SMPD nel nodo e quindi viene chiuso:For example, this coordination command for a solution using MS-MPI version 7 starts the SMPD service on the node, then exits:

cmd /c start cmd /c ""%MSMPI_BIN%\smpd.exe"" -d

Si noti che l'uso di start in questo comando di coordinamentoNote the use of start in this coordination command. è necessario perché l'applicazione smpd.exe non viene restituita immediatamente dopo l'esecuzione.This is required because the smpd.exe application does not return immediately after execution. Senza l'uso del comando start, questo comando di coordinamento non verrebbe restituito e bloccherebbe l'esecuzione del comando applicazione.Without the use of the start command, this coordination command would not return, and would therefore block the application command from running.

Comando applicazioneApplication command

Al termine dell'esecuzione del comando di coordinamento da parte dell'attività primaria e di tutte le sottoattività, la riga di comando dell'attività a istanze multiple viene eseguita solodall'attività primaria.Once the primary task and all subtasks have finished executing the coordination command, the multi-instance task's command line is executed by the primary task only. La riga di comando viene definita comando applicazione per distinguerla dal comando di coordinamento.We call this the application command to distinguish it from the coordination command.

Per le applicazioni di MS-MPI, usare il comando applicazione per eseguire l'applicazione abilitata per MPI con mpiexec.exe.For MS-MPI applications, use the application command to execute your MPI-enabled application with mpiexec.exe. Di seguito è riportato, a titolo di esempio, il comando applicazione per una soluzione con MS-MPI versione 7:For example, here is an application command for a solution using MS-MPI version 7:

cmd /c ""%MSMPI_BIN%\mpiexec.exe"" -c 1 -wdir %AZ_BATCH_TASK_SHARED_DIR% MyMPIApplication.exe

Nota

Dato che mpiexec.exe in MS-MPI usa la variabile CCP_NODES per impostazione predefinita, come illustrato nella sezione Variabili di ambiente, questa viene esclusa dalla riga di comando del comando applicazione di esempio precedente.Because MS-MPI's mpiexec.exe uses the CCP_NODES variable by default (see Environment variables) the example application command line above excludes it.

Variabili di ambienteEnvironment variables

Batch crea più variabili di ambiente specifiche delle attività a istanze multiple sui nodi di calcolo allocati a un'attività a istanze multiple.Batch creates several environment variables specific to multi-instance tasks on the compute nodes allocated to a multi-instance task. Le righe dei comandi applicazione e di coordinamento possono fare riferimento a queste variabili di ambiente, come agli script e ai programmi che eseguono.Your coordination and application command lines can reference these environment variables, as can the scripts and programs they execute.

Le variabili di ambiente seguenti vengono create dal servizio Batch per l'uso da parte di attività a istanze multiple:The following environment variables are created by the Batch service for use by multi-instance tasks:

  • CCP_NODES
  • AZ_BATCH_NODE_LIST
  • AZ_BATCH_HOST_LIST
  • AZ_BATCH_MASTER_NODE
  • AZ_BATCH_TASK_SHARED_DIR
  • AZ_BATCH_IS_CURRENT_NODE_MASTER

Per informazioni dettagliate su queste e altre variabili di ambiente dei nodi di calcolo, inclusi i contenuti e la visibilità, vedere l'argomento relativo alle variabili di ambiente dei nodi di calcolo.For full details on these and the other Batch compute node environment variables, including their contents and visibility, see Compute node environment variables.

Suggerimento

L'esempio di codice MPI per Linux su Batch contiene un esempio d'uso di alcune di queste variabili di ambiente.The Batch Linux MPI code sample contains an example of how several of these environment variables can be used. Lo script Bash coordination-cmd scarica l'applicazione comune e i file di input da Archiviazione di Azure, consente una condivisione Network File System (NFS) sul nodo master e configura gli altri nodi allocati all'attività a istanze multiple come client NFS.The coordination-cmd Bash script downloads common application and input files from Azure Storage, enables a Network File System (NFS) share on the master node, and configures the other nodes allocated to the multi-instance task as NFS clients.

File di risorseResource files

Sono disponibili due set di file di risorse da prendere in considerazione per le attività a istanze multiple: file di risorse comuni, scaricati da tutte le attività, sia da quella primaria che dalle sottoattività, e file di risorse specifici per la stessa attività a istanze multiple, scaricati solo dall'attività primaria.There are two sets of resource files to consider for multi-instance tasks: common resource files that all tasks download (both primary and subtasks), and the resource files specified for the multi-instance task itself, which only the primary task downloads.

È possibile specificare uno o più file di risorse comuni nelle impostazioni per istanze multiple relative a un'attività.You can specify one or more common resource files in the multi-instance settings for a task. Questi file di risorse comuni vengono scaricati da Archiviazione di Azure dall'attività primaria e da tutte le sottoattività nella directory condivisa dell'attività di ogni nodo.These common resource files are downloaded from Azure Storage into each node's task shared directory by the primary and all subtasks. È possibile accedere alla directory condivisa dell'attività dalle righe del comando applicazione e del comando di coordinamento usando la variabile di ambiente AZ_BATCH_TASK_SHARED_DIR .You can access the task shared directory from application and coordination command lines by using the AZ_BATCH_TASK_SHARED_DIR environment variable. Il percorso AZ_BATCH_TASK_SHARED_DIR è identico in ogni nodo allocato all'attività a istanze multiple ed è quindi possibile condividere un singolo comando di coordinamento tra l'attività primaria e tutte le sottoattività.The AZ_BATCH_TASK_SHARED_DIR path is identical on every node allocated to the multi-instance task, thus you can share a single coordination command between the primary and all subtasks. Il servizio Batch non "condivide" la directory nel senso di consentire un accesso remoto, ma è possibile usarla come punto di montaggio o condivisione, come indicato in precedenza nel suggerimento sulle variabili di ambiente.Batch does not "share" the directory in a remote access sense, but you can use it as a mount or share point as mentioned earlier in the tip on environment variables.

I file di risorse specificati per l'attività a istanze multiple stessa vengono scaricati nella directory di lavoro dell'attività, AZ_BATCH_TASK_WORKING_DIR, per impostazione predefinita.Resource files that you specify for the multi-instance task itself are downloaded to the task's working directory, AZ_BATCH_TASK_WORKING_DIR, by default. Come accennato, a differenza dei file di risorse comuni, solo l'attività primaria scarica i file di risorse specificati per l'attività a istanze multiple stessa.As mentioned, in contrast to common resource files, only the primary task downloads resource files specified for the multi-instance task itself.

Importante

Usare sempre le variabili di ambiente AZ_BATCH_TASK_SHARED_DIR e AZ_BATCH_TASK_WORKING_DIR per fare riferimento a tali directory nelle righe di comando.Always use the environment variables AZ_BATCH_TASK_SHARED_DIR and AZ_BATCH_TASK_WORKING_DIR to refer to these directories in your command lines. Evitare di provare a costruire i percorsi manualmente.Do not attempt to construct the paths manually.

Durata dell'attivitàTask lifetime

Dalla durata dell'attività principale dipende la durata dell'intera attività a istanze multiple.The lifetime of the primary task controls the lifetime of the entire multi-instance task. Quando viene chiusa l'attività primaria, vengono terminate tutte le sottoattività.When the primary exits, all of the subtasks are terminated. Il codice di uscita dell'attività primaria è il codice di uscita dell'attività e viene quindi usato per determinare l'esito positivo o negativo dell'attività per la ripetizione dei tentativi.The exit code of the primary is the exit code of the task, and is therefore used to determine the success or failure of the task for retry purposes.

Se una delle sottoattività ha esito negativo e viene chiusa con un codice restituito diverso da zero, ad esempio, l'intera attività a istanze multiple ha esito negativo.If any of the subtasks fail, exiting with a non-zero return code, for example, the entire multi-instance task fails. L'attività a istanze multiple viene quindi terminata e la sua esecuzione verrà ripetuta fino a raggiungere il limite di tentativi.The multi-instance task is then terminated and retried, up to its retry limit.

Quando si elimina un'attività a istanze multiple, il servizio Batch elimina anche l'attività primaria e tutte le sottoattività.When you delete a multi-instance task, the primary and all subtasks are also deleted by the Batch service. Dai nodi di calcolo vengono eliminate tutte le directory delle sottoattività e i relativi file, come avviene per un'attività standard.All subtask directories and their files are deleted from the compute nodes, just as for a standard task.

Le proprietà TaskConstraints per un'attività a istanze multiple, ad esempio MaxTaskRetryCount, MaxWallClockTime e RetentionTime, vengono rispettate come avviene per un'attività standard e si applicano all'attività primaria e a tutte le sottoattività.TaskConstraints for a multi-instance task, such as the MaxTaskRetryCount, MaxWallClockTime, and RetentionTime properties, are honored as they are for a standard task, and apply to the primary and all subtasks. Tuttavia, se si modifica la proprietà RetentionTime dopo aver aggiunto l'attività a istanze multiple al processo, la modifica viene applicata solo all'attività primaria.However, if you change the RetentionTime property after adding the multi-instance task to the job, this change is applied only to the primary task. Tutte le sottoattività continuano a usare la proprietà RetentionTime originale.All of the subtasks continue to use the original RetentionTime.

Se l'attività recente faceva parte di un'attività a istanze multiple, nell'elenco delle attività recenti di un nodo di calcolo è incluso l'ID di una sottoattività.A compute node's recent task list reflects the id of a subtask if the recent task was part of a multi-instance task.

Ottenere informazioni sulle sottoattivitàObtain information about subtasks

Per ottenere informazioni sulle sottoattività usando la libreria Batch .NET, chiamare il metodo CloudTask.ListSubtasks.To obtain information on subtasks by using the Batch .NET library, call the CloudTask.ListSubtasks method. Questo metodo restituisce informazioni su tutte le sottoattività e sul nodo di calcolo che ha eseguito le attività.This method returns information on all subtasks, and information about the compute node that executed the tasks. Queste informazioni permettono di determinare la directory radice di ogni sottoattività, l'ID del pool, lo stato corrente, il codice di uscita e altro ancora.From this information, you can determine each subtask's root directory, the pool id, its current state, exit code, and more. È possibile usare queste informazioni in combinazione con il metodo PoolOperations.GetNodeFile per ottenere i file della sottoattività.You can use this information in combination with the PoolOperations.GetNodeFile method to obtain the subtask's files. Si noti che questo metodo non restituisce informazioni per l'attività primaria, con ID 0.Note that this method does not return information for the primary task (id 0).

Nota

Se non diversamente specificato, i metodi Batch .NET che operano sull'attività a istanze multiple CloudTask stessa si applicano solo all'attività primaria.Unless otherwise stated, Batch .NET methods that operate on the multi-instance CloudTask itself apply only to the primary task. Ad esempio, quando si chiama il metodo CloudTask.ListNodeFiles in un'attività a istanze multiple, vengono restituiti solo i file dell'attività primaria.For example, when you call the CloudTask.ListNodeFiles method on a multi-instance task, only the primary task's files are returned.

Il frammento di codice seguente illustra come ottenere informazioni sulle sottoattività e come richiedere il contenuto dei file dai nodi in cui vengono eseguiti.The following code snippet shows how to obtain subtask information, as well as request file contents from the nodes on which they executed.

// Obtain the job and the multi-instance task from the Batch service
CloudJob boundJob = batchClient.JobOperations.GetJob("mybatchjob");
CloudTask myMultiInstanceTask = boundJob.GetTask("mymultiinstancetask");

// Now obtain the list of subtasks for the task
IPagedEnumerable<SubtaskInformation> subtasks = myMultiInstanceTask.ListSubtasks();

// Asynchronously iterate over the subtasks and print their stdout and stderr
// output if the subtask has completed
await subtasks.ForEachAsync(async (subtask) =>
{
    Console.WriteLine("subtask: {0}", subtask.Id);
    Console.WriteLine("exit code: {0}", subtask.ExitCode);

    if (subtask.State == SubtaskState.Completed)
    {
        ComputeNode node =
            await batchClient.PoolOperations.GetComputeNodeAsync(subtask.ComputeNodeInformation.PoolId,
                                                                 subtask.ComputeNodeInformation.ComputeNodeId);

        NodeFile stdOutFile = await node.GetNodeFileAsync(subtask.ComputeNodeInformation.TaskRootDirectory + "\\" + Constants.StandardOutFileName);
        NodeFile stdErrFile = await node.GetNodeFileAsync(subtask.ComputeNodeInformation.TaskRootDirectory + "\\" + Constants.StandardErrorFileName);
        stdOut = await stdOutFile.ReadAsStringAsync();
        stdErr = await stdErrFile.ReadAsStringAsync();

        Console.WriteLine("node: {0}:", node.Id);
        Console.WriteLine("stdout.txt: {0}", stdOut);
        Console.WriteLine("stderr.txt: {0}", stdErr);
    }
    else
    {
        Console.WriteLine("\tSubtask {0} is in state {1}", subtask.Id, subtask.State);
    }
});

Esempio di codiceCode sample

Il codice di esempio MultiInstanceTasks su GitHub illustra come usare un'attività a più istanze per eseguire un'applicazione MS-MPI nei nodi di calcolo di Batch.The MultiInstanceTasks code sample on GitHub demonstrates how to use a multi-instance task to run an MS-MPI application on Batch compute nodes. Seguire i passaggi in Preparazione e esecuzione per eseguire l'esempio.Follow the steps in Preparation and Execution to run the sample.

Operazioni preliminariPreparation

  1. Seguire i primi due passaggi in How to compile and run a simple MS-MPI program (Come compilare ed eseguire un semplice programma MS-MPI).Follow the first two steps in How to compile and run a simple MS-MPI program. In tal modo sono soddisfatti i prerequisiti per il passaggio seguente.This satisfies the prerequisites for the following step.
  2. Compilare una versione Release del programma MPI di esempio MPIHelloWorld.Build a Release version of the MPIHelloWorld sample MPI program. Questo è il programma che verrà eseguito sui nodi di calcolo dall'attività a più istanze.This is the program that will be run on compute nodes by the multi-instance task.
  3. Creare un file zip contenente MPIHelloWorld.exe (compilato per il passaggio 2) e MSMpiSetup.exe (scaricato al passaggio 1).Create a zip file containing MPIHelloWorld.exe (which you built step 2) and MSMpiSetup.exe (which you downloaded step 1). Il file zip verrà caricato come un pacchetto dell'applicazione nel passaggio successivo.You'll upload this zip file as an application package in the next step.
  4. Usare il portale di Azure per creare un'applicazione Batch chiamata "MPIHelloWorld" e specificare il file zip creato nel passaggio precedente come versione "1.0" del pacchetto dell'applicazione.Use the Azure portal to create a Batch application called "MPIHelloWorld", and specify the zip file you created in the previous step as version "1.0" of the application package. Vedere Caricare e gestire le applicazioni per maggiori informazioni.See Upload and manage applications for more information.

Suggerimento

Compilare una versione Release di MPIHelloWorld.exe in modo che non sia necessario includere dipendenze aggiuntive (ad esempio, msvcp140d.dll o vcruntime140d.dll) nel pacchetto dell'applicazione.Build a Release version of MPIHelloWorld.exe so that you don't have to include any additional dependencies (for example, msvcp140d.dll or vcruntime140d.dll) in your application package.

EsecuzioneExecution

  1. Scaricare azure-batch-samples da GitHub.Download the azure-batch-samples from GitHub.
  2. Aprire la soluzione MultiInstanceTasks in Visual Studio 2015 o versione più recente.Open the MultiInstanceTasks solution in Visual Studio 2015 or newer. Il MultiInstanceTasks.sln file della soluzione si trova:The MultiInstanceTasks.sln solution file is located in:

    azure-batch-samples\CSharp\ArticleProjects\MultiInstanceTasks\

  3. Immettere le credenziali dell'account di archiviazione e Batch in AccountSettings.settings nel progetto Microsoft.Azure.Batch.Samples.Common.Enter your Batch and Storage account credentials in AccountSettings.settings in the Microsoft.Azure.Batch.Samples.Common project.
  4. Compilare ed eseguire la soluzione MultiInstanceTasks per eseguire l'applicazione di esempio MPI sui nodi di calcolo in un pool di Batch.Build and run the MultiInstanceTasks solution to execute the MPI sample application on compute nodes in a Batch pool.
  5. Facoltativo: usare il portale di Azure o BatchLabs per esaminare il pool di esempio, il processo e l'attività ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") prima di eliminare le risorse.Optional: Use the Azure portal or BatchLabs to examine the sample pool, job, and task ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") before you delete the resources.

Suggerimento

È possibile scaricare Visual Studio Community gratuitamente se non si dispone di Visual Studio.You can download Visual Studio Community for free if you do not have Visual Studio.

L'output di MultiInstanceTasks.exeè simile al seguente:Output from MultiInstanceTasks.exe is similar to the following:

Creating pool [MultiInstanceSamplePool]...
Creating job [MultiInstanceSampleJob]...
Adding task [MultiInstanceSampleTask] to job [MultiInstanceSampleJob]...
Awaiting task completion, timeout in 00:30:00...

Main task [MultiInstanceSampleTask] is in state [Completed] and ran on compute node [tvm-1219235766_1-20161017t162002z]:
---- stdout.txt ----
Rank 2 received string "Hello world" from Rank 0
Rank 1 received string "Hello world" from Rank 0

---- stderr.txt ----

Main task completed, waiting 00:00:10 for subtasks to complete...

---- Subtask information ----
subtask: 1
        exit code: 0
        node: tvm-1219235766_3-20161017t162002z
        stdout.txt:
        stderr.txt:
subtask: 2
        exit code: 0
        node: tvm-1219235766_2-20161017t162002z
        stdout.txt:
        stderr.txt:

Delete job? [yes] no: yes
Delete pool? [yes] no: yes

Sample complete, hit ENTER to exit...

Passaggi successiviNext steps