Uso de tareas de instancias múltiples para ejecutar aplicaciones de la Interfaz de paso de mensajes (MPI) en BatchUse multi-instance tasks to run Message Passing Interface (MPI) applications in Batch

Las tareas de instancias múltiples le permiten ejecutar una tarea de Azure Batch en varios nodos de proceso al mismo tiempo.Multi-instance tasks allow you to run an Azure Batch task on multiple compute nodes simultaneously. Estas tareas permiten escenarios de informática de alto rendimiento como las aplicaciones de interfaz de paso de mensajes (MPI) en Batch.These tasks enable high performance computing scenarios like Message Passing Interface (MPI) applications in Batch. En este artículo, aprenderá a ejecutar tareas de instancias múltiples mediante la biblioteca .NET de Batch.In this article, you learn how to execute multi-instance tasks using the Batch .NET library.

Nota

Aunque los ejemplos de este artículo se centran en .NET de Batch, MS-MPI y los nodos de proceso de Windows, los conceptos de tareas de múltiples instancias aquí tratados son aplicables a otras plataformas y tecnologías (Python e Intel MPI en nodos de Linux, por ejemplo).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).

Información general de las tareas de instancias múltiplesMulti-instance task overview

En Batch, cada tarea se ejecuta normalmente en un solo nodo de proceso: se envían varias tareas a un trabajo y el servicio Batch programa la ejecución de cada tarea en 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. No obstante, si establece la configuración de instancias múltiples en una tarea, le estará diciendo a Batch que cree una tarea principal y varias tareas secundarias que se ejecutarán después en varios nodos.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.

Información general de las tareas de instancias múltiplesMulti-instance task overview

Al enviar una tarea con configuración de instancias múltiples a un trabajo, el servicio Batch realiza varios pasos que son específicos de las tareas de instancias múltiples:When you submit a task with multi-instance settings to a job, Batch performs several steps unique to multi-instance tasks:

  1. El servicio Batch crea una tarea principal y varias tareas secundarias en función de la configuración de instancias múltiples definida.The Batch service creates one primary and several subtasks based on the multi-instance settings. El número total de tareas (principales y todas las subtareas) coincide con el número de instancias (nodos de proceso) especificado en la configuración de múltiples instancias.The total number of tasks (primary plus all subtasks) matches the number of instances (compute nodes) you specify in the multi-instance settings.
  2. Batch designa uno de los nodos de proceso como el maestro, y programa la tarea principal para que se ejecute en el maestro.Batch designates one of the compute nodes as the master, and schedules the primary task to execute on the master. Programa las subtareas para que se ejecuten en el resto de los nodos de proceso asignados a la tarea de múltiples instancias, una subtarea por 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. Estas tareas, tanto la principal como las subtareas, descargan los archivos de recursos comunes que se especifican en la configuración de múltiples instancias.The primary and all subtasks download any common resource files you specify in the multi-instance settings.
  4. Cuando se han descargado los archivos de recursos comunes, la tarea principal y las subtareas ejecutan el comando de coordinación que se especifica en la configuración de instancias múltiples.After the common resource files have been downloaded, the primary and subtasks execute the coordination command you specify in the multi-instance settings. El comando de coordinación normalmente se utiliza para preparar los nodos para ejecutar la tarea.The coordination command is typically used to prepare nodes for executing the task. Esto puede incluir iniciar servicios en segundo plano (como los de Microsoft MPIsmpd.exe) y comprobar que los nodos están listos para procesar los mensajes entre nodos.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. La tarea principal ejecuta el comando de aplicación en el nodo maestro después de que la principal y todas las subtareas hayan completado correctamente el comando de coordinación.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. Solo la tarea principal ejecuta el comando de aplicación, que es la línea de comandos especificada de la tarea de múltiples instancias.The application command is the command line of the multi-instance task itself, and is executed only by the primary task. En una solución basada en MS-MPI, se trata del lugar donde ejecuta la aplicación habilitada para MPI mediante mpiexec.exe.In an MS-MPI-based solution, this is where you execute your MPI-enabled application using mpiexec.exe.

Nota

Aunque es funcionalmente distinta, la "tarea de instancias múltiples" no es un tipo de tarea única como StartTask o JobPreparationTask.Though it is functionally distinct, the "multi-instance task" is not a unique task type like the StartTask or JobPreparationTask. La tarea de instancias múltiples es simplemente una tarea de Batch estándar (CloudTask en .NET de Batch) cuya opción de instancias múltiples se ha configurado.The multi-instance task is simply a standard Batch task (CloudTask in Batch .NET) whose multi-instance settings have been configured. En este artículo, nos referiremos a ella como tarea de instancias múltiples.In this article, we refer to this as the multi-instance task.

Requisitos de las tareas de instancias múltiplesRequirements for multi-instance tasks

Las tareas de múltiples instancias requieren un grupo con la comunicación ente nodos habilitada y la ejecución simultánea de tareas deshabilitada.Multi-instance tasks require a pool with inter-node communication enabled, and with concurrent task execution disabled. Para deshabilitar la ejecución de tareas simultáneas, establezca la propiedad CloudPool.MaxTasksPerComputeNode en 1.To disable concurrent task execution, set the CloudPool.MaxTasksPerComputeNode property to 1.

Nota

Batch limita el tamaño de un grupo que tiene habilitada la comunicación entre nodos.Batch limits the size of a pool that has inter-node communication enabled.

Este fragmento de código muestra cómo crear un grupo para tareas de varias instancias mediante la biblioteca de .NET de Batch.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: "standard_d1_v2",
        cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "5"));

// 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

Si intenta ejecutar una tarea de instancias múltiples en un grupo con la comunicación entre nodos deshabilitada o con un valor de maxTasksPerNode superior a 1, la tarea nunca será programada, sino que permanecerá indefinidamente en estado "activo".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.

Uso de StartTask para instalar MPIUse a StartTask to install MPI

Para ejecutar aplicaciones MPI con una tarea de instancias múltiples, primero debe instalar una implementación de MPI (por ejemplo, MS-MPI o Intel MPI) en los nodos de proceso del grupo.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. Es un buen momento para utilizar una instancia de StartTask, que se ejecuta cada vez que un nodo se une a un grupo o se ha reiniciado.This is a good time to use a StartTask, which executes whenever a node joins a pool, or is restarted. En este fragmento de código se crea un objeto StartTask que especifica el paquete de instalación de MS-MPI como un archivo de recursos.This code snippet creates a StartTask that specifies the MS-MPI setup package as a resource file. La línea de comandos de la tarea de inicio se ejecuta una vez que el archivo de recurso se ha descargado en el nodo.The start task's command line is executed after the resource file is downloaded to the node. En este caso, la línea de comandos realiza una instalación desatendida de 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();

Acceso directo a memoria remota (RDMA)Remote direct memory access (RDMA)

Cuando elige el tamaño con capacidad RDMA como A9 para los nodos de proceso del grupo de Batch, la aplicación de MPI puede aprovechar la red de acceso directo a memoria remota (RDMA) de alto rendimiento y baja latencia de 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.

Consulte los tamaños compatibles con RDMA en los siguientes artículos:Look for the sizes specified as "RDMA capable" in the following articles:

Nota

Para sacar el máximo provecho a RDMA en los nodos de proceso de Linux, debe utilizar Intel MPI en esos nodos.To take advantage of RDMA on Linux compute nodes, you must use Intel MPI on the nodes.

Creación de una tarea de instancias múltiples con .NET de BatchCreate a multi-instance task with Batch .NET

Ahora que hemos analizado los requisitos de grupo y la instalación del paquete MPI, vamos a crear la tarea de instancias múltiples.Now that we've covered the pool requirements and MPI package installation, let's create the multi-instance task. En este fragmento de código, creamos una instancia de CloudTask estándar y luego configuramos su propiedad MultiInstanceSettings.In this snippet, we create a standard CloudTask, then configure its MultiInstanceSettings property. Como se mencionó anteriormente, la tarea de instancias múltiples no es un tipo de tarea distinto, sino una tarea de Batch estándar configurada con la opción de instancias múltiples.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);

Tarea principal y subtareasPrimary task and subtasks

Cuando se crea la configuración de instancias múltiples para una tarea, se especifica el número de nodos de proceso que ejecutarán la tarea.When you create the multi-instance settings for a task, you specify the number of compute nodes that are to execute the task. Cuando se envía la tarea a un trabajo, el servicio Batch crea una tarea principal y suficientes subtareas que, juntas, coinciden con el número de nodos especificado.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.

A estas tareas se les asigna a un identificador entero del intervalo de 0 a numberOfInstances - 1.These tasks are assigned an integer id in the range of 0 to numberOfInstances - 1. La tarea con el identificador 0 es la tarea principal y todos los demás identificadores son subtareas.The task with id 0 is the primary task, and all other ids are subtasks. Por ejemplo, si crea la siguiente configuración de instancias múltiples para una tarea, la tarea principal tendrá un identificador de 0 y las subtareas tendrán los identificadores del 1 al 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 maestroMaster node

Cuando se envía una tarea de múltiples instancias, el servicio Batch designa uno de los nodos de proceso como el nodo "maestro" y programa la tarea principal para que se ejecute en el nodo maestro.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. Las subtareas se programan para ejecutarse en el resto de los nodos asignados a la tarea de múltiples instancias.The subtasks are scheduled to execute on the remainder of the nodes allocated to the multi-instance task.

comando de coordinaciónCoordination command

El comando de coordinación ejecuta tanto tareas principales como subtareas.The coordination command is executed by both the primary and subtasks.

La invocación del comando de coordinación se bloquea: el servicio Batch no ejecuta el comando de aplicación hasta que el comando de coordinación se ha devuelto correctamente para todas las subtareas.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. Por lo tanto, el comando de coordinación debe iniciar los servicios en segundo plano necesarios, comprobar que están listos para utilizarse y luego cerrarse.The coordination command should therefore start any required background services, verify that they are ready for use, and then exit. Por ejemplo, este comando de coordinación para una solución que utiliza la versión 7 de MS-MPI inicia el servicio SMPD en el nodo y luego se cierra: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

Observe el uso de start en este comando de coordinación.Note the use of start in this coordination command. Esto es necesario porque la aplicación smpd.exe no devuelve resultados inmediatamente después de la ejecución.This is required because the smpd.exe application does not return immediately after execution. Sin el uso del comando start, este comando de coordinación no devolvería resultados y, por tanto, impediría que se ejecutara el comando de aplicación.Without the use of the start command, this coordination command would not return, and would therefore block the application command from running.

Comando de aplicaciónApplication command

Una vez que la tarea principal y todas las subtareas han terminado de ejecutar el comando de coordinación, solola tarea principal ejecuta la línea de comandos de la tarea de instancias múltiples.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. Llamaremos a este el comando de aplicación para distinguirlo del comando de coordinación.We call this the application command to distinguish it from the coordination command.

Para las aplicaciones de MS-MPI, use el comando de aplicación para ejecutar la aplicación habilitada para MPI con mpiexec.exe.For MS-MPI applications, use the application command to execute your MPI-enabled application with mpiexec.exe. Por ejemplo, este es un comando de aplicación para una solución mediante la versión 7 de MS-MPI: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

Dado que mpiexec.exe de MS-MPI utiliza la variable CCP_NODES de forma predeterminada (consulte Variables de entorno), la línea de comandos de aplicación del ejemplo anterior la excluye.Because MS-MPI's mpiexec.exe uses the CCP_NODES variable by default (see Environment variables) the example application command line above excludes it.

Variables de entornoEnvironment variables

Batch crea varias variables de entorno específicas de las tareas de múltiples instancias en los nodos de proceso asignados a una tarea de múltiples instancias.Batch creates several environment variables specific to multi-instance tasks on the compute nodes allocated to a multi-instance task. Las líneas de comando de coordinación y de la aplicación pueden hacer referencia a estas variables de entorno, como los scripts y programas que se ejecutan.Your coordination and application command lines can reference these environment variables, as can the scripts and programs they execute.

Las siguientes variables de entorno las crea el servicio Batch para su uso por las tareas de múltiples instancias: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

Para obtener detalles completos sobre estas y las demás variables de entorno del nodo de proceso de Batch, incluido su contenido y la visibilidad, consulte Variables de entorno del nodo de proceso.For full details on these and the other Batch compute node environment variables, including their contents and visibility, see Compute node environment variables.

Sugerencia

El ejemplo de código de Linux MPI de Batch contiene un ejemplo de cómo se pueden usar varias de estas variables de entorno.The Batch Linux MPI code sample contains an example of how several of these environment variables can be used. El script de Batch coordination-cmd descarga archivos de aplicación y entrada comunes desde Azure Storage, permite a un recurso compartido de Network File System (NFS) en el nodo maestro y configura los demás nodos asignados a la tarea de múltiples instancias, como clientes 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.

Archivos de recursosResource files

Hay dos conjuntos de archivos de recursos que se deben tener en cuenta para las tareas de múltiples instancias: archivos de recursos comunes que descargan todas las tareas (tanto principales como subtareas) y archivos de recursos especificados para la propia tarea de múltiples instancias, que descarga solo la tarea principal.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.

Puede especificar uno o más archivos de recursos comunes en la configuración de instancias múltiples de una tarea.You can specify one or more common resource files in the multi-instance settings for a task. La tarea principal y todas las subtareas descargan estos archivos de recursos comunes desde el Azure Storage en el directorio compartido de tareas de cada nodo.These common resource files are downloaded from Azure Storage into each node's task shared directory by the primary and all subtasks. Puede tener acceso al directorio compartido de tareas desde las líneas de comandos de coordinación y aplicación mediante la variable de entorno 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. La ruta de acceso AZ_BATCH_TASK_SHARED_DIR es idéntica en todos los nodos asignados a la tarea de múltiples instancias, por lo que puede compartir un único comando de coordinación entre el principal y todas las subtareas.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. Batch no "comparte" el directorio en un sentido de acceso remoto, pero puede usarlo como un montaje o punto de recurso compartido, tal como se mencionó anteriormente en la información sobre las variables de entorno.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.

Los archivos de recursos que especifique para la propia tarea de múltiples instancias se descargan en el directorio de trabajo de la tarea, AZ_BATCH_TASK_WORKING_DIR, de forma predeterminada.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. Como se mencionó, a diferencia de los archivos de recursos comunes, solo la tarea principal descarga los archivos de recursos especificados para la propia tarea de múltiples instancias.As mentioned, in contrast to common resource files, only the primary task downloads resource files specified for the multi-instance task itself.

Importante

Utilice siempre las variables de entorno AZ_BATCH_TASK_SHARED_DIR y AZ_BATCH_TASK_WORKING_DIR para hacer referencia a estos directorios en las líneas de 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. No intente construir las rutas de acceso manualmente.Do not attempt to construct the paths manually.

Duración de la tareaTask lifetime

La duración de la tarea principal controla la duración de toda la tarea de instancias múltiples.The lifetime of the primary task controls the lifetime of the entire multi-instance task. Cuando se cierra la tarea principal, todas las subtareas se terminan.When the primary exits, all of the subtasks are terminated. El código de salida de la tarea principal es el código de salida de la tarea y, por tanto, se utiliza para determinar el éxito o fracaso de la tarea con fines de reintento.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.

Si se produce un error en alguna de las subtareas, por ejemplo, se cierra con un código de error distinto de cero, la tarea de instancias múltiples entera dará error.If any of the subtasks fail, exiting with a non-zero return code, for example, the entire multi-instance task fails. Entonces la tarea de instancias múltiples se termina y se reintenta, hasta su límite de reintento.The multi-instance task is then terminated and retried, up to its retry limit.

Cuando se elimina una tarea de instancias múltiples, el servicio Batch también elimina la tarea principal y todas las subtareas.When you delete a multi-instance task, the primary and all subtasks are also deleted by the Batch service. Todos los directorios de subtarea y sus archivos se eliminan de los nodos de proceso, igual que en el caso de una tarea estándar.All subtask directories and their files are deleted from the compute nodes, just as for a standard task.

Los valores de TaskConstraints para una tarea de instancias múltiples, como las propiedades MaxTaskRetryCount, MaxWallClockTime y RetentionTime, se respetan ya que son para una tarea estándar, y se aplican a la tarea principal y a todas las subtareas.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. Sin embargo, si cambia la propiedad RetentionTime después de agregar la tarea de instancias múltiples al trabajo, este cambio solo se aplica a la tarea principal.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. Todas las subtareas seguirán usando la propiedad RetentionTime original.All of the subtasks continue to use the original RetentionTime.

La lista de tareas recientes de un nodo de proceso reflejará el identificador de una subtarea si la tarea reciente era parte de una tarea de instancias múltiples.A compute node's recent task list reflects the id of a subtask if the recent task was part of a multi-instance task.

Obtención de información sobre las subtareasObtain information about subtasks

Para obtener información sobre las subtareas mediante la biblioteca .NET de Batch, llame al método CloudTask.ListSubtasks.To obtain information on subtasks by using the Batch .NET library, call the CloudTask.ListSubtasks method. Este método devuelve información sobre todas las subtareas e información sobre el nodo de proceso que ejecuta las tareas.This method returns information on all subtasks, and information about the compute node that executed the tasks. A partir de esta información, puede determinar el directorio raíz de cada subtarea, el identificador de grupo, su estado actual, el código de salida, etc.From this information, you can determine each subtask's root directory, the pool id, its current state, exit code, and more. Esta información se puede utilizar en combinación con el método PoolOperations.GetNodeFile para obtener los archivos de la subtarea.You can use this information in combination with the PoolOperations.GetNodeFile method to obtain the subtask's files. Tenga en cuenta que este método no devuelve información de la tarea principal (id. 0).Note that this method does not return information for the primary task (id 0).

Nota

A menos que se indique lo contrario, los métodos .NET de Batch que operan en la propia clase CloudTask de varias instancias, solo se aplican a la tarea principal.Unless otherwise stated, Batch .NET methods that operate on the multi-instance CloudTask itself apply only to the primary task. Por ejemplo, al llamar al método CloudTask.ListNodeFiles en una tarea de instancias múltiples, solo se devuelven los archivos de la tarea principal.For example, when you call the CloudTask.ListNodeFiles method on a multi-instance task, only the primary task's files are returned.

El fragmento de código siguiente muestra cómo obtener información de la subtarea y cómo solicitar contenido de archivos de los nodos en los que se ejecuta.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);
    }
});

Código de ejemploCode sample

En el ejemplo de código MultiInstanceTasks que se encuentra en GitHub se muestra cómo puede usarse una tarea de instancias múltiples para ejecutar una aplicación de MS-MPI en los nodos de proceso de 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. Siga los pasos que se describen en las secciones Preparación y Ejecución para ejecutar el ejemplo.Follow the steps in Preparation and Execution to run the sample.

PreparaciónPreparation

  1. Siga los dos primeros pasos que se indican en Compilación y ejecución de un sencillo programa de MS-MPI.Follow the first two steps in How to compile and run a simple MS-MPI program. De este modo, cumplirá los requisitos previos necesarios para el siguiente paso.This satisfies the prerequisites for the following step.
  2. Compile una versión de lanzamiento del programa de ejemplo MPIHelloWorld de MPI.Build a Release version of the MPIHelloWorld sample MPI program. La tarea de instancias múltiples ejecutará este programa en los nodos de proceso.This is the program that will be run on compute nodes by the multi-instance task.
  3. Cree un archivo zip que contenga MPIHelloWorld.exe (creado en el paso 2) y MSMpiSetup.exe (descargado en el paso 1).Create a zip file containing MPIHelloWorld.exe (which you built step 2) and MSMpiSetup.exe (which you downloaded step 1). En el siguiente paso, cargará este archivo zip como paquete de aplicación.You'll upload this zip file as an application package in the next step.
  4. Use Azure Portal para crear una aplicación de Batch llamada "MPIHelloWorld" y establezca el archivo zip que creó en el paso anterior como versión "1.0" del paquete de aplicación.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. Para más información, consulte Carga y administración de aplicaciones.See Upload and manage applications for more information.

Sugerencia

Cree una versión de lanzamiento de MPIHelloWorld.exe para que no tenga que incluir otras dependencias (por ejemplo, msvcp140d.dll o vcruntime140d.dll) en el paquete de aplicación.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.

EjecuciónExecution

  1. Descargue azure-batch-samples de GitHub.Download the azure-batch-samples from GitHub.

  2. Abra el MultiInstanceTasks solución en Visual Studio de 2019.Open the MultiInstanceTasks solution in Visual Studio 2019. El archivo de solución de MultiInstanceTasks.sln se encuentra en:The MultiInstanceTasks.sln solution file is located in:

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

  3. En el proyecto Microsoft.Azure.Batch.Samples.Common, especifique las credenciales de la cuenta de Batch y Storage en AccountSettings.settings.Enter your Batch and Storage account credentials in AccountSettings.settings in the Microsoft.Azure.Batch.Samples.Common project.

  4. Compile y ejecute la solución MultiInstanceTasks. De este modo, ejecutará la aplicación de ejemplo de MPI en los nodos de proceso de un grupo de Batch.Build and run the MultiInstanceTasks solution to execute the MPI sample application on compute nodes in a Batch pool.

  5. Opcional: Puede usar Azure Portal o el Batch Explorer para examinar el grupo, el trabajo y la tarea de ejemplo ("MultiInstanceSamplePool", "MultiInstanceSampleJob" y "MultiInstanceSampleTask") antes de eliminar los recursos.Optional: Use the Azure portal or Batch Explorer to examine the sample pool, job, and task ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") before you delete the resources.

Sugerencia

Si no tiene Visual Studio, puede descargar gratis Visual Studio Community.You can download Visual Studio Community for free if you do not have Visual Studio.

La salida de MultiInstanceTasks.exe será similar a la siguiente: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...

Pasos siguientesNext steps