Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Multi-instance tasks allow you to run an Azure Batch task on multiple compute nodes simultaneously. Dessa uppgifter möjliggör högpresterande datorscenarier såsom Message Passing Interface (MPI) applikationer i Batch. I den här artikeln lär du dig hur du kan utföra multi-instans uppgifter med hjälp av Batch .NET-biblioteket.
Note
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).
Översikt av uppgifter med flera instanser
I Batch utförs normalt varje uppgift på en enda beräkningsnoden -- du skickar flera uppgifter till ett jobb, och Batch-tjänsten schemalägger varje uppgift för körning på en nod. Genom att konfigurera en uppgifts inställningar för flera instanser, instruerar du Batch att istället skapa en primär uppgift och flera deluppgifter som sedan körs på flera noder.
När du skickar en uppgift med inställningar för flera instanser till ett jobb, utför Batch flera steg som är unika för uppgifter med flera instanser.
- Batchtjänsten skapar en primär och flera undertasker baserat på inställningarna för flera instanser. The total number of tasks (primary plus all subtasks) matches the number of instances (compute nodes) you specify in the multi-instance settings.
- Batch designates one of the compute nodes as the master, and schedules the primary task to execute on the master. Den schemalägger deluppgifter att utföras på återstoden av de datornoder som tilldelats den flerinstansuppgiften, en deluppgift per nod.
- Primären och alla underuppgifter hämtar alla gemensamma resursfiler som du anger i multi-instance-inställningarna.
- Efter att de gemensamma resursfilerna har hämtats, utför primära och underuppgifter det samordningskommando du anger i inställningarna för flera instanser. Koordinationskommandot används vanligtvis för att förbereda noderna för att utföra uppgiften. Detta kan inkludera att starta bakgrundstjänster (så som Microsoft MPIs
smpd.exe
) och verifiera att noderna är redo att bearbeta meddelanden mellan noder. - 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. The application command is the command line of the multi-instance task itself, and is executed only by the primary task. I en MS-MPI-baserad lösning är det här platsen där du kör din MPI-aktiverade applikation med hjälp av
mpiexec.exe
.
Note
Även om den är funktionellt distinct, är "multi-instance task" inte en unik uppgiftstyp som StartTask eller JobPreparationTask. The multi-instance task is simply a standard Batch task (CloudTask in Batch .NET) whose multi-instance settings have been configured. I den här artikeln hänvisar vi till detta som multi-instance-uppgift.
Requirements for multi-instance tasks
Multi-instansuppgifter kräver en pool med kommunikation mellan noder aktiverad och med samtidig uppgiftsutförande avaktiverad. För att inaktivera samtidig uppgiftskörning, ställ in egenskapen CloudPool.TaskSlotsPerNode till 1.
Note
Batch begränsar storleken på en pool som har aktiverad inter-node-kommunikation.
Denna kodsnutt visar hur man skapar en pool för multi-instansuppgifter med .NET Batch-biblioteket.
CloudPool myCloudPool =
myBatchClient.PoolOperations.CreatePool(
poolId: "MultiInstanceSamplePool",
targetDedicatedComputeNodes: 3
virtualMachineSize: "standard_d1_v2",
VirtualMachineConfiguration: new VirtualMachineConfiguration(
imageReference: new ImageReference(
publisher: "MicrosoftWindowsServer",
offer: "WindowsServer",
sku: "2019-datacenter-core",
version: "latest"),
nodeAgentSkuId: "batch.node.windows amd64");
// Multi-instance tasks require inter-node communication, and those nodes
// must run only one task at a time.
myCloudPool.InterComputeNodeCommunicationEnabled = true;
myCloudPool.TaskSlotsPerNode = 1;
Anteckning
Om du försöker köra en multi-instanstask i en pool där kommunikation mellan noder är inaktiverad, eller med ett taskSlotsPerNode-värde större än 1, blir tasken aldrig schemalagd--den förblir oändligt i det "aktiva" tillståndet.
Pooler med aktiverad InterComputeNodeCommunication kommer inte automatiskt tillåta att noder deprovisioneras.
Använd en Startuppgift för att installera MPI
För att köra MPI-program med en multi-instansuppgift behöver du först installera en MPI-implementation (till exempel MS-MPI eller Intel MPI) på beräkningsnoderna i poolen. Det här är en bra tidpunkt att använda en StartTask, som körs varje gång en nod ansluter till en pool eller startas om. Den här kodsekvensen skapar en StartTask som anger installationspaketet för MS-MPI som en resursfil. Startuppgiftens kommandorad körs efter att resursfilen har laddats ner till noden. I det här fallet utför kommandoraden en obevakad installation av 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();
Fjärrdirekt minnesåtkomst (RDMA)
När du väljer en RDMA-kapabel storlek som A9 för beräkningsnoderna i din Batch-pool, kan din MPI-applikation dra nytta av Azures högpresterande, låglatens närdirektminnesåtkomst (RDMA) nätverk.
Sök efter storlekarna som specificeras som "RDMA-kapabla" i Storlekar för virtuella maskiner i Azure (för VirtualMachineConfiguration-pooler) eller Storlekar för molntjänster (för CloudServicesConfiguration-pooler).
Anteckning
För att dra nytta av RDMA på Linux compute nodes, måste du använda Intel MPI på noderna.
Skapa en flerinstansuppgift med Batch .NET
Nu när vi har gått igenom poolkraven och installationen av MPI-paketet, låt oss skapa uppgiften för flera instanser. I detta kodexempel skapar vi en standard CloudTask och konfigurerar därefter dess MultiInstanceSettings-egenskap. Som nämnts tidigare, är multi-instans-uppgiften inte en särskild uppgiftstyp, utan en standard Batch-uppgift konfigurerad med multi-instans-inställningar.
// 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);
Huvuduppgift och deluppgifter
När du skapar flerinställningsinställningarna för en uppgift, anger du antalet beräkningsnoder som ska utföra uppgiften. När du skickar in uppgiften till ett jobb skapar Batch-tjänsten en primär uppgift och tillräckligt med deluppgifter så att de tillsammans motsvarar antalet noder du specificerade.
Dessa uppgifter tilldelas ett heltals-ID i intervallet från 0 till numberOfInstances - 1. Uppgiften med ID 0 är huvuduppgiften, och alla andra ID:n är deluppgifter. Till exempel, om du skapar följande inställningar för flera instanser för en uppgift, skulle huvuduppgiften ha ett ID på 0, och deluppgifterna skulle ha ID:n från 1 till 9.
int numberOfNodes = 10;
myMultiInstanceTask.MultiInstanceSettings = new MultiInstanceSettings(numberOfNodes);
Masternod
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. The subtasks are scheduled to execute on the remainder of the nodes allocated to the multi-instance task.
Koordineringskommando
Koordineringskommandot utförs av både huvud- och deluppgifter.
Anropet av samordningskommandot är blockerande; Batch utför inte applikationskommandot förrän samordningskommandot har returnerat framgångsrikt för alla deluppgifter. The coordination command should therefore start any required background services, verify that they are ready for use, and then exit. Till exempel startar denna samordningskommando för en lösning med MS-MPI version 7 SMPD-tjänsten på noden och avslutas sedan.
cmd /c start cmd /c ""%MSMPI_BIN%\smpd.exe"" -d
Observera användningen av start
i det här koordinationskommandot. Detta är nödvändigt eftersom smpd.exe
-applikationen inte återgår omedelbart efter exekvering. Utan att använda startkommandot skulle detta samordningskommando inte återvända, och det skulle därför blockera applikationskommandot från att köras.
Applikationskommando
När huvuduppgiften och alla deluppgifter har avslutat genomförandet av samordningskommandot, körs kommandoraden för flerinstansuppgiften endast av huvuduppgiften endast. We call this the application command to distinguish it from the coordination command.
För MS-MPI-applikationer, använd applikationskommandot för att köra din MPI-aktiverade applikation med mpiexec.exe
. Till exempel är här ett programkommando för en lösning som använder MS-MPI version 7:
cmd /c ""%MSMPI_BIN%\mpiexec.exe"" -c 1 -wdir %AZ_BATCH_TASK_SHARED_DIR% MyMPIApplication.exe
Note
Eftersom MS-MPI's mpiexec.exe
som standard använder variabeln CCP_NODES
(se Miljövariabler), utesluter kommandoraden för exempelapplikationen ovan denna.
Environment variables
Batch skapar flera miljövariabler som är specifika för flerstegsuppgifter på de beräkningsnoder som är tilldelade en flerstegsuppgift. Dina koordinations- och applikationskommandorader kan referera till dessa miljövariabler, liksom de skript och program som de kör.
Följande miljövariabler skapas av Batch-tjänsten för användning av flera instanser:
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
För fullständig information om dessa och de andra Batch beräkningsnodens miljövariabler, inklusive deras innehåll och synlighet, se Beräkningsnodens miljövariabler.
Tips
Exemplet på Batch Linux MPI-kod innehåller ett exempel på hur flera av dessa miljövariabler kan användas.
Resource files
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.
Du kan ange en eller flera gemensamma resursfiler i inställningarna för flera instanser för en uppgift. Dessa vanliga resursfiler laddas ner från Azure Storage till varje nods delade aktivitetskatalog av huvuduppgiften och alla deluppgifter. Du kan komma åt den delade uppgiftskatalogen från applikations- och samordningskommandorader genom att använda miljövariabeln AZ_BATCH_TASK_SHARED_DIR
. Vägen AZ_BATCH_TASK_SHARED_DIR
är identisk på varje nod som tilldelas till multiinstancesuppgiften, därför kan du dela ett enda samordningskommando mellan huvuduppgiften och alla underuppgifter. Batch "delar" inte katalogen i en fjärråtkomstbetydelse, men du kan använda den som en monterings- eller delningspunkt som nämnts tidigare i tipset om miljövariabler.
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. Som nämnts, i kontrast till vanliga resursfiler, laddar endast huvuduppgiften ner resursfiler som är specifikt angivna för själva multiinstansuppgiften.
Viktigt
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. Försök inte att konstruera vägarna manuellt.
Uppgiftens livslängd
Livslängden för den primära uppgiften styr livslängden för hela multi-instansuppgiften. När huvudsakliga processen avslutas, avbryts alla deluppgifter. Avslutningskoden för primärprocessen är avslutningskoden för uppgiften, och används därför för att bestämma om uppgiften har lyckats eller misslyckats i syfte att göra ett nytt försök.
If any of the subtasks fail, exiting with a non-zero return code, for example, the entire multi-instance task fails. Multi-instansuppgiften avslutas sedan och försöks på nytt, upp till dess gräns för försök.
När du tar bort en multi-instansuppgift raderas även huvud- och alla deluppgifter av Batch-tjänsten. Alla deluppgiftskataloger och deras filer raderas från beräkningsnoderna, precis som för en standarduppgift.
TaskConstraints för en flera instans uppgift, såsom egenskaperna MaxTaskRetryCount, MaxWallClockTime och RetentionTime, respekteras på samma sätt som för en standarduppgift och gäller för den primära och alla underuppgifter. Om du emellertid ändrar egenskapen RetentionTime efter att ha lagt till flerinstansuppgiften till jobbet, gäller denna ändring endast för huvuduppgiften, och alla underuppgifter fortsätter att använda den ursprungliga RetentionTime.
En beräkningsnods senaste arbetslista återspeglar ID:t för en deluppgift ifall den senaste uppgiften var en del av en multiansistuppgift.
Skaffa information om deluppgifter
För att få information om deluppgifter med hjälp av Batch .NET-biblioteket, anropa metoden CloudTask.ListSubtasks. Denna metod returnerar information om alla deluppgifter och information om beräkningsnoden som utförde uppgifterna. Från denna information kan du fastställa varje deluppgifts rotkatalog, pool-ID, dess aktuella status, avslutningskod och mer. Du kan använda denna information i kombination med metoden PoolOperations.GetNodeFile för att få åtkomst till underuppgiftens filer. Note that this method does not return information for the primary task (ID 0).
Note
Unless otherwise stated, Batch .NET methods that operate on the multi-instance CloudTask itself apply only to the primary task. Till exempel, när du anropar metoden CloudTask.ListNodeFiles på en flerinstansuppgift, returneras endast den primära uppgiftens filer.
Följande kodexempel visar hur man hämtar information om deluppgifter och begär innehåll från filer på de noder där de kördes.
// 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);
}
});
Code sample
Exemplet på koden för MultiInstanceTasks på GitHub visar hur man använder en multi-instansuppgift för att köra en MS-MPI-applikation på Batch-beräkningsnoder. Follow the steps below to run the sample.
Förberedelse
- Download the MS-MPI SDK and Redist installers and install them. Efter installationen kan du kontrollera att MS-MPI-miljövariablerna har ställts in.
- Build a Release version of the MPIHelloWorld sample MPI program. Detta är programmet som kommer att köras på beräkningsnoder av multi-instans uppgiften.
- Skapa en zip-fil som innehåller
MPIHelloWorld.exe
(som du byggde i steg 2) ochMSMpiSetup.exe
(som du laddade ner i steg 1). You'll upload this zip file as an application package in the next step. - Använd Azure-portalen för att skapa en Batch-applikation kallad "MPIHelloWorld", och ange zip-filen du skapade i det föregående steget som version "1.0" av applikationspaketet. Se Ladda upp och hantera applikationer för mer information.
Tips
Building a Release version of MPIHelloWorld.exe
ensures that you don't have to include any additional dependencies (for example, msvcp140d.dll
or vcruntime140d.dll
) in your application package.
Utförande
Ladda ner azure-batch-samples .zip filen från GitHub.
Öppna MultiInstanceTasks lösning i Visual Studio 2019. Lösningsfilen
MultiInstanceTasks.sln
finns i:azure-batch-samples\CSharp\ArticleProjects\MultiInstanceTasks\
Enter your Batch and Storage account credentials in
AccountSettings.settings
in the Microsoft.Azure.Batch.Samples.Common project.Bygg och kör MultiInstanceTasks-lösningen för att köra MPI-exempelprogrammet på beräkningsnoder i en Batch-pool.
Optional: Use the Azure portal or Batch Explorer to examine the sample pool, job, and task ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") before you delete the resources.
Tips
Du kan ladda ner Visual Studio Community gratis om du inte redan har Visual Studio.
Utdata från MultiInstanceTasks.exe
är liknande följande:
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...
Nästa steg
- Läs mer om MPI-support för Linux på Azure Batch.
- Lär dig hur du skapar pooler av Linux-datornoder för användning i dina Azure Batch MPI-lösningar.