Použití úkolů s více instancemi ke spouštění aplikací rozhraní MPI (Message Passing Interface) ve BatchUse multi-instance tasks to run Message Passing Interface (MPI) applications in Batch

Úlohy s více instancemi umožňují spouštět úlohu Azure Batch na několika výpočetních uzlech současně.Multi-instance tasks allow you to run an Azure Batch task on multiple compute nodes simultaneously. Tyto úlohy umožňují vysoce výkonné výpočetní scénáře jako aplikace MPI (Message Passing Interface) v dávce.These tasks enable high performance computing scenarios like Message Passing Interface (MPI) applications in Batch. V tomto článku se dozvíte, jak spouštět úlohy s více instancemi pomocí knihovny Batch .NET .In this article, you learn how to execute multi-instance tasks using the Batch .NET library.

Poznámka

I když příklady v tomto článku se zaměřují na výpočetní uzly Batch .NET, MS-MPI a Windows, jsou zde popsané koncepty úkolů s více instancemi pro jiné platformy a technologie (například Python a Intel MPI na uzlech 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).

Přehled úlohy s více instancemiMulti-instance task overview

V dávce se každý úkol obvykle spouští na jednom výpočetním uzlu – do úlohy odešlete více úkolů a služba Batch naplánuje každou úlohu k provedení na uzlu.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. Když ale konfigurujete nastavení více instancí úlohy, řekněte službě Batch, aby vytvořila jednu primární úlohu a několik dílčích úloh, které se pak spustí na více uzlech.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.

Přehled úlohy s více instancemiMulti-instance task overview

Když odešlete úlohu s nastavením více instancí do úlohy, dávka provede několik kroků, které jsou jedinečné pro úlohy s více instancemi:When you submit a task with multi-instance settings to a job, Batch performs several steps unique to multi-instance tasks:

  1. Služba Batch vytvoří jeden primární a několik dílčích úloh na základě nastavení s více instancemi.The Batch service creates one primary and several subtasks based on the multi-instance settings. Celkový počet úloh (primární a všechny dílčí úkoly) odpovídá počtu instancí (výpočetních uzlů), které zadáte v nastavení více instancí.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 označí jeden z výpočetních uzlů jako Hlavní a naplánuje primární úlohu, která se má spustit na hlavním serveru.Batch designates one of the compute nodes as the master, and schedules the primary task to execute on the master. Naplánuje dílčí úkoly, které se mají provést, na zbytek výpočetních uzlů přidělených úloze s více instancemi, jednoho dílčího úkolu na uzel.It schedules the subtasks to execute on the remainder of the compute nodes allocated to the multi-instance task, one subtask per node.
  3. Primární a všechny dílčí úkoly stáhnou všechny běžné soubory prostředků , které zadáte v nastavení více instancí.The primary and all subtasks download any common resource files you specify in the multi-instance settings.
  4. Po stažení běžných souborů prostředků provede primární a dílčí úkoly příkaz koordinace , který zadáte v nastavení více instancí.After the common resource files have been downloaded, the primary and subtasks execute the coordination command you specify in the multi-instance settings. Příkaz koordinace se obvykle používá k přípravě uzlů pro provedení úlohy.The coordination command is typically used to prepare nodes for executing the task. To může zahrnovat spouštění služeb na pozadí (například Microsoft MPI smpd.exe ) a ověření, že uzly jsou připravené na zpracování zpráv mezi uzly.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. Primární úloha spustí příkaz aplikace na hlavním uzlu po úspěšném dokončení příkazu koordinace primárním a všemi dílčími úkoly.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. Příkaz aplikace je příkazový řádek samotného úkolu s více instancemi a je proveden pouze primárním úkolem.The application command is the command line of the multi-instance task itself, and is executed only by the primary task. V řešení založeném na MS-MPIse jedná o místo, kde spouštíte aplikaci s povoleným MPI pomocí mpiexec.exe .In an MS-MPI-based solution, this is where you execute your MPI-enabled application using mpiexec.exe.

Poznámka

I když je funkce velmi odlišná, nejedná se o jedinečný typ úlohy, jako je StartTask nebo JobPreparationTask.Though it is functionally distinct, the "multi-instance task" is not a unique task type like the StartTask or JobPreparationTask. Úloha s více instancemi je jednoduše standardní dávková úloha (CloudTask v dávce .NET), jejíž nastavení s více instancemi je nakonfigurované.The multi-instance task is simply a standard Batch task (CloudTask in Batch .NET) whose multi-instance settings have been configured. V tomto článku budeme tento postup označovat jako úlohu s více instancemi.In this article, we refer to this as the multi-instance task.

Požadavky na úlohy s více instancemiRequirements for multi-instance tasks

Úkoly s více instancemi vyžadují fond se zapnutou komunikací mezi uzly a Souběžné spouštění úloh je zakázané.Multi-instance tasks require a pool with inter-node communication enabled, and with concurrent task execution disabled. Chcete-li zakázat souběžné provádění úloh, nastavte vlastnost CloudPool. TaskSlotsPerNode na hodnotu 1.To disable concurrent task execution, set the CloudPool.TaskSlotsPerNode property to 1.

Poznámka

Batch omezuje velikost fondu, který má povolenou komunikaci mezi uzly.Batch limits the size of a pool that has inter-node communication enabled.

Tento fragment kódu ukazuje, jak vytvořit fond pro úlohy s více instancemi pomocí knihovny 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: "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.TaskSlotsPerNode = 1;

Poznámka

Pokud se pokusíte spustit úlohu s více instancemi ve fondu s zakázáním komunikace mezi uzly nebo s hodnotou taskSlotsPerNode větší než 1, úloha není nikdy naplánována – zůstane neomezeně ve stavu "aktivní".If you try to run a multi-instance task in a pool with internode communication disabled, or with a taskSlotsPerNode value greater than 1, the task is never scheduled--it remains indefinitely in the "active" state.

Použití StartTask k instalaci MPIUse a StartTask to install MPI

Pokud chcete spouštět aplikace MPI s úlohou s více instancemi, musíte nejdřív do výpočetních uzlů ve fondu nainstalovat MPI implementaci (například MS-MPI nebo Intel MPI).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. To je vhodný čas pro použití StartTask, který se spustí pokaždé, když se uzel připojí k fondu, nebo se restartuje.This is a good time to use a StartTask, which executes whenever a node joins a pool, or is restarted. Tento fragment kódu vytvoří StartTask, který určuje instalační balíček MS-MPI jako soubor prostředků.This code snippet creates a StartTask that specifies the MS-MPI setup package as a resource file. Příkazový řádek spouštěcího úkolu se spustí po stažení souboru prostředků do uzlu.The start task's command line is executed after the resource file is downloaded to the node. V takovém případě příkazový řádek provede bezobslužnou instalaci 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();

Přímý přístup do paměti vzdáleného počítače (RDMA)Remote direct memory access (RDMA)

Když pro výpočetní uzly ve fondu služby Batch zvolíte Velikost podporující RDMA , jako je třeba, může vaše aplikace MPI využívat výhod sítě RDMA (Remote Direct Memory Access) s nízkou latencí v 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.

V následujících článcích vyhledejte velikosti zadané jako "RDMA podporuje":Look for the sizes specified as "RDMA capable" in the following articles:

Poznámka

Pokud chcete využít výhod RDMA na výpočetních uzlech pro Linux, musíte na uzlech použít Intel MPI .To take advantage of RDMA on Linux compute nodes, you must use Intel MPI on the nodes.

Vytvoření úlohy s více instancemi pomocí batch .NETCreate a multi-instance task with Batch .NET

Teď, když jsme pokryli požadavky na fond a instalaci balíčku MPI, pojďme vytvořit úlohu s více instancemi.Now that we've covered the pool requirements and MPI package installation, let's create the multi-instance task. V tomto fragmentu kódu vytvoříme standardní CloudTaska pak nakonfigurujeme jeho vlastnost MultiInstanceSettings .In this snippet, we create a standard CloudTask, then configure its MultiInstanceSettings property. Jak už bylo zmíněno dříve, úloha více instancí není jedinečný typ úlohy, ale standardní úloha dávky konfigurovaná s nastavením více instancí.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);

Primární úkol a dílčí úkolyPrimary task and subtasks

Při vytváření nastavení s více instancemi pro úlohu zadáte počet výpočetních uzlů, ve kterých se má úloha spustit.When you create the multi-instance settings for a task, you specify the number of compute nodes that are to execute the task. Když úlohu odešlete do úlohy, vytvoří služba Batch jednu primární úlohu a dostatek dílčích úloh , které společně odpovídají počtu zadaných uzlů.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.

Těmto úkolům je přiřazeno celé číslo ID v rozsahu od 0 do numberOfInstances -1.These tasks are assigned an integer id in the range of 0 to numberOfInstances - 1. Úloha s ID 0 je primární úlohou a všechna ostatní ID jsou dílčí úkoly.The task with id 0 is the primary task, and all other ids are subtasks. Například pokud pro úlohu vytvoříte následující nastavení s více instancemi, primární úkol by měl mít ID 0 a dílčí úkoly budou mít ID 1 až 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);

Hlavní uzelMaster node

Když odešlete úlohu s více instancemi, služba Batch označí jeden z výpočetních uzlů jako hlavní uzel a naplánuje spuštění primární úlohy na hlavním uzlu.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. U dílčích úkolů je naplánováno spuštění ve zbývající části uzlů přidělených úloze s více instancemi.The subtasks are scheduled to execute on the remainder of the nodes allocated to the multi-instance task.

Příkaz koordinaceCoordination command

Příkaz koordinace je proveden primárním i dílčím úkolem.The coordination command is executed by both the primary and subtasks.

Vyvolání příkazu koordinace je blokováno – dávka nespustí příkaz aplikace, dokud se příkaz koordinace nevrátil úspěšně pro všechny dílčí úkoly.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. Příkaz koordinace by proto měl spustit všechny požadované služby na pozadí, ověřit, že jsou připravené k použití, a pak ukončit.The coordination command should therefore start any required background services, verify that they are ready for use, and then exit. Například tento příkaz koordinace pro řešení pomocí MS-MPI verze 7 spustí službu SMPD na uzlu a pak ukončí: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

Všimněte si použití start v tomto příkazu koordinace.Note the use of start in this coordination command. To je nutné, protože smpd.exe aplikace se po provedení nevrátí hned.This is required because the smpd.exe application does not return immediately after execution. Bez použití příkazu Start by tento příkaz koordinace nevrátil, a proto zablokoval spuštění příkazu aplikace.Without the use of the start command, this coordination command would not return, and would therefore block the application command from running.

Příkaz aplikaceApplication command

Jakmile primární úkol a všechny dílčí úkoly dokončí příkaz koordinace, příkazový řádek úlohy s více instancemi se spustí jenom primární úlohou.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. Tento příkaz aplikace voláme, aby se lišil od příkazu koordinace.We call this the application command to distinguish it from the coordination command.

Pro aplikace MS-MPI použijte příkaz aplikace a spusťte aplikaci s podporou MPI mpiexec.exe .For MS-MPI applications, use the application command to execute your MPI-enabled application with mpiexec.exe. Například tady je příkaz aplikace pro řešení s použitím MS-MPI verze 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

Poznámka

Vzhledem k tomu, že MS-MPI mpiexec.exe používá CCP_NODES proměnnou ve výchozím nastavení (viz proměnné prostředí) výše uvedený příkazový řádek aplikace je vyloučí.Because MS-MPI's mpiexec.exe uses the CCP_NODES variable by default (see Environment variables) the example application command line above excludes it.

Proměnné prostředíEnvironment variables

Batch vytvoří několik proměnných prostředí specifických pro úlohy s více instancemi výpočetních uzlů přidělených úloze s více instancemi.Batch creates several environment variables specific to multi-instance tasks on the compute nodes allocated to a multi-instance task. Na tyto proměnné prostředí se můžou odkazovat příkazové řádky vaší koordinace a aplikace, stejně jako můžou skripty a programy, které provádějí.Your coordination and application command lines can reference these environment variables, as can the scripts and programs they execute.

Následující proměnné prostředí vytváří služba Batch pro použití v úlohách s více instancemi: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

Úplné podrobnosti o těchto a dalších proměnných prostředí výpočetních uzlů pro dávkové zpracování, včetně jejich obsahu a viditelnosti, najdete v tématu proměnné prostředí výpočetního uzlu.For full details on these and the other Batch compute node environment variables, including their contents and visibility, see Compute node environment variables.

Tip

Ukázka kódu MPI služby Batch pro Linux obsahuje příklad toho, jak lze použít několik těchto proměnných prostředí.The Batch Linux MPI code sample contains an example of how several of these environment variables can be used.

Soubory prostředkůResource files

Existují dvě sady souborů prostředků, které je třeba vzít v úvahu pro úlohy s více instancemi: běžné soubory prostředků , které všechny úlohy stahují (primární i dílčí úkoly), a soubory prostředků zadané pro vlastní úlohu s více instancemi, které se pouze stahují primární úlohy.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.

V nastaveních více instancí úlohy můžete určit jeden nebo více běžných souborů prostředků .You can specify one or more common resource files in the multi-instance settings for a task. Tyto běžné soubory prostředků se stáhnou z Azure Storage do sdíleného adresáře úkolů každého uzlu na základě primárního a všech dílčích úkolů.These common resource files are downloaded from Azure Storage into each node's task shared directory by the primary and all subtasks. Ke sdílenému adresáři úlohy můžete přistupovat z aplikace a příkazového řádku pro koordinaci pomocí AZ_BATCH_TASK_SHARED_DIR proměnné prostředí.You can access the task shared directory from application and coordination command lines by using the AZ_BATCH_TASK_SHARED_DIR environment variable. AZ_BATCH_TASK_SHARED_DIRCesta je shodná na všech uzlech přidělených k úloze s více instancemi, takže můžete sdílet jeden příkaz koordinace mezi primárním a dílčím úkolem.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 nesdílí adresář ve smyslu vzdáleného přístupu, ale můžete ho použít jako přípojný nebo sdílený bod, jak je uvedeno výše v popisu proměnné prostředí.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.

Soubory prostředků, které zadáte pro samotný úkol s více instancemi, se ve výchozím nastavení stáhnou do pracovního adresáře úlohy AZ_BATCH_TASK_WORKING_DIR .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. Jak je uvedeno na rozdíl od běžných souborů prostředků, stáhne pouze primární úlohy soubory prostředků zadané pro vlastní úlohu s více instancemi.As mentioned, in contrast to common resource files, only the primary task downloads resource files specified for the multi-instance task itself.

Důležité

Vždy používejte proměnné prostředí AZ_BATCH_TASK_SHARED_DIR a AZ_BATCH_TASK_WORKING_DIR k odkazování na tyto adresáře na příkazových řádcích.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. Nepokoušejte se vytvořit cesty ručně.Do not attempt to construct the paths manually.

Doba života úlohyTask lifetime

Doba života primární úlohy řídí dobu života celé úlohy s více instancemi.The lifetime of the primary task controls the lifetime of the entire multi-instance task. Při primárním ukončení se ukončí všechny dílčí úkoly.When the primary exits, all of the subtasks are terminated. Ukončovací kód primární služby je ukončovací kód úkolu, který se proto používá k určení úspěchu nebo neúspěchu úkolu pro účely opakování.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.

Pokud některý z dílčích úkolů selže, ukončí se nenulovým návratovým kódem, například celá úloha s více instancemi selže.If any of the subtasks fail, exiting with a non-zero return code, for example, the entire multi-instance task fails. Úloha s více instancemi se pak ukončí a zopakuje, až do jejího limitu opakování.The multi-instance task is then terminated and retried, up to its retry limit.

Když odstraníte úlohu s více instancemi, odstraní se i hlavní a všechny dílčí úkoly služby Batch.When you delete a multi-instance task, the primary and all subtasks are also deleted by the Batch service. Všechny adresáře podúloh a jejich soubory jsou z výpočetních uzlů smazány stejně jako u standardních úloh.All subtask directories and their files are deleted from the compute nodes, just as for a standard task.

TaskConstraints pro úlohu s více instancemi, jako jsou vlastnosti MaxTaskRetryCount, proměnné maxwallclocktimea RetentionTime , se respektují tak, jak jsou pro standardní úlohu, a platí pro primární a všechny dílčí úkoly.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. Pokud však změníte vlastnost RetentionTime po přidání úlohy s více instancemi do úlohy, tato změna se použije pouze pro primární úlohu.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. Všechny dílčí úkoly pokračují v používání původního RetentionTime.All of the subtasks continue to use the original RetentionTime.

Seznam úkolů v nedávném výpočetním uzlu odráží ID dílčího úkolu, pokud byl poslední úkol součástí úlohy s více instancemi.A compute node's recent task list reflects the id of a subtask if the recent task was part of a multi-instance task.

Získat informace o dílčích úkolechObtain information about subtasks

Chcete-li získat informace o dílčích úkolech pomocí knihovny Batch .NET, zavolejte metodu CloudTask. ListSubtasks .To obtain information on subtasks by using the Batch .NET library, call the CloudTask.ListSubtasks method. Tato metoda vrací informace o všech dílčích úkolech a informace o výpočetním uzlu, který provedl úlohy.This method returns information on all subtasks, and information about the compute node that executed the tasks. Z těchto informací můžete určit kořenový adresář každého dílčího úkolu, ID fondu, jeho aktuální stav, ukončovací kód a další.From this information, you can determine each subtask's root directory, the pool id, its current state, exit code, and more. Tyto informace můžete použít v kombinaci s metodou PoolOperations. GetNodeFile pro získání souborů dílčího úkolu.You can use this information in combination with the PoolOperations.GetNodeFile method to obtain the subtask's files. Všimněte si, že tato metoda nevrací informace pro primární úlohu (ID 0).Note that this method does not return information for the primary task (id 0).

Poznámka

Pokud není uvedeno jinak, metody Batch .NET, které pracují s více instancemi CloudTask , se vztahují pouze na primární úlohu.Unless otherwise stated, Batch .NET methods that operate on the multi-instance CloudTask itself apply only to the primary task. Například při volání metody CloudTask. ListNodeFiles u úlohy s více instancemi se vrátí pouze soubory primární úlohy.For example, when you call the CloudTask.ListNodeFiles method on a multi-instance task, only the primary task's files are returned.

Následující fragment kódu ukazuje, jak získat informace o dílčím úkolu a také požadovat obsah souboru z uzlů, ve kterých byly provedeny.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);
    }
});

Ukázka kóduCode sample

Ukázka kódu MultiInstanceTasks na GitHubu ukazuje, jak používat úlohu s více instancemi ke spuštění aplikace MS-MPI na výpočetních uzlech služby 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. Pokud chcete ukázku spustit, postupujte podle kroků v části Příprava a spuštění .Follow the steps in Preparation and Execution to run the sample.

PřípravaPreparation

  1. Použijte první dva kroky v tématu jak zkompilovat a spustit jednoduchý program MS-MPI.Follow the first two steps in How to compile and run a simple MS-MPI program. Splňuje požadavky pro následující krok.This satisfies the prerequisites for the following step.
  2. Sestavte prodejní verzi programu MPIHelloWorld Sample MPI.Build a Release version of the MPIHelloWorld sample MPI program. Toto je program, který bude spuštěn na výpočetních uzlech pomocí úlohy více instancí.This is the program that will be run on compute nodes by the multi-instance task.
  3. Vytvořte soubor ZIP obsahující MPIHelloWorld.exe (který jste vytvořili krok 2) a MSMpiSetup.exe (který jste si stáhli krok 1).Create a zip file containing MPIHelloWorld.exe (which you built step 2) and MSMpiSetup.exe (which you downloaded step 1). Tento soubor zip nahrajete jako balíček aplikace v dalším kroku.You'll upload this zip file as an application package in the next step.
  4. Pomocí Azure Portal vytvořte aplikaci Batch s názvem "MPIHelloWorld" a zadejte soubor zip, který jste vytvořili v předchozím kroku, jako verze "1,0" balíčku aplikace.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. Další informace najdete v tématu nahrání a Správa aplikací .See Upload and manage applications for more information.

Tip

Sestavte prodejní verzi MPIHelloWorld.exe , abyste nemuseli do balíčku aplikace zahrnout žádné další závislosti (například msvcp140d.dll nebo vcruntime140d.dll ).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.

SpuštěníExecution

  1. Stáhněte si Azure-Batch-Samples z GitHubu.Download the azure-batch-samples from GitHub.

  2. Otevřete řešení MultiInstanceTasks v aplikaci Visual Studio 2019.Open the MultiInstanceTasks solution in Visual Studio 2019. MultiInstanceTasks.slnSoubor řešení je umístěný v:The MultiInstanceTasks.sln solution file is located in:

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

  3. Zadejte přihlašovací údaje služby Batch a účtu úložiště v AccountSettings.settings projektu Microsoft.Azure.Batch. Samples. Common .Enter your Batch and Storage account credentials in AccountSettings.settings in the Microsoft.Azure.Batch.Samples.Common project.

  4. Sestavte a spusťte řešení MultiInstanceTasks, které spustí ukázkovou aplikaci MPI na výpočetních uzlech ve fondu Batch.Build and run the MultiInstanceTasks solution to execute the MPI sample application on compute nodes in a Batch pool.

  5. Volitelné: před odstraněním prostředků použijte Azure Portal nebo Batch Explorer a Projděte si ukázkový fond, úlohu a úlohu ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask").Optional: Use the Azure portal or Batch Explorer to examine the sample pool, job, and task ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") before you delete the resources.

Tip

Pokud nemáte Visual Studio, můžete si zdarma stáhnout Visual Studio Community .You can download Visual Studio Community for free if you do not have Visual Studio.

Výstup z MultiInstanceTasks.exe je podobný následujícímu: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...

Další krokyNext steps