Megosztás a következőn keresztül:


Többpéldányos feladatok használata Message Passing Interface (MPI) alkalmazások futtatásához a Batchben

A többpéldányos feladatok lehetővé teszik egy Azure Batch-feladat egyidejű futtatását több számítási csomóponton. Ezek a feladatok olyan nagy teljesítményű számítási forgatókönyveket tesznek lehetővé, mint a Message Passing Interface (MPI) alkalmazások a Batchben. Ebből a cikkből megtudhatja, hogyan hajthat végre többpéldányos feladatokat a Batch .NET-kódtár használatával.

Feljegyzés

Bár a cikkben szereplő példák a Batch .NET, az MS-MPI és a Windows számítási csomópontokra összpontosítanak, az itt tárgyalt többpéldányos feladatfogalmak más platformokra és technológiákra (például Linux-csomópontokon futó Python és Intel MPI) is alkalmazhatók.

Többpéldányos feladat áttekintése

A Batchben az egyes tevékenységeket általában egyetlen számítási csomóponton hajtják végre – több feladatot is elküldhet egy feladatnak, a Batch szolgáltatás pedig ütemezi az egyes feladatokat a csomóponton való végrehajtáshoz. A tevékenység többpéldányos beállításainak konfigurálásával azonban azt kell mondania a Batchnek, hogy ehelyett hozzon létre egy elsődleges feladatot és több altevékenységet, amelyeket aztán több csomóponton hajtanak végre.

A többpéldányos beállítások áttekintését bemutató diagram.

Ha többpéldányos beállításokat tartalmazó feladatot küld el egy feladatnak, a Batch több példányos tevékenységekre egyedi lépéseket hajt végre:

  1. A Batch szolgáltatás egy elsődleges és több altevékenységet hoz létre a többpéldányos beállítások alapján. A tevékenységek teljes száma (elsődleges és az összes altevékenység) megegyezik a többpéldányos beállításokban megadott példányok (számítási csomópontok) számával.
  2. A Batch az egyik számítási csomópontot jelöli ki főkiszolgálóként, és ütemezi a főkiszolgálón végrehajtandó elsődleges feladatot. Az altevékenységeket a többpéldányos tevékenységhez lefoglalt számítási csomópontok fennmaradó részének végrehajtására ütemezi, csomópontonként egy altevékenységet.
  3. Az elsődleges és az összes altevékenység letölti a többpéldányos beállításokban megadott gyakori erőforrásfájlokat .
  4. A gyakori erőforrásfájlok letöltése után az elsődleges és altevékenységek végrehajtják a többpéldányos beállításokban megadott koordinációs parancsot . A koordinációs parancs általában csomópontok előkészítésére szolgál a feladat végrehajtásához. Ez magában foglalhatja a háttérszolgáltatások (például a Microsoft MPIsmpd.exe) elindítását, valamint annak ellenőrzését, hogy a csomópontok készen állnak-e a csomópontok közötti üzenetek feldolgozására.
  5. Az elsődleges feladat végrehajtja az alkalmazásparancsot a fő csomóponton , miután az elsődleges és az összes altevékenység sikeresen végrehajtotta a koordinációs parancsot. Az alkalmazásparancs maga a többpéldányos feladat parancssora, és csak az elsődleges tevékenység hajtja végre. Ms-MPI-alapú megoldásban itt hajthatja végre az MPI-kompatibilis alkalmazást a használatávalmpiexec.exe.

Feljegyzés

Bár funkcionálisan eltérő, a "többpéldányos tevékenység" nem egyedi tevékenységtípus, mint például a StartTask vagy a JobPreparationTask. A többpéldányos tevékenység egyszerűen egy standard Batch-tevékenység (CloudTask a Batch .NET-ben), amelynek többpéldányos beállításai konfigurálva vannak. Ebben a cikkben többpéldányos feladatként hivatkozunk erre.

A többpéldányos feladatokra vonatkozó követelmények

A többpéldányos tevékenységekhez olyan készletre van szükség, amely engedélyezve van a csomópontok közötti kommunikációban, és az egyidejű feladatvégrehajtás le van tiltva. Az egyidejű feladatvégrehajtás letiltásához állítsa a CloudPool.TaskSlotsPerNode tulajdonságot 1-re.

Feljegyzés

A Batch korlátozza a csomópontok közötti kommunikációt engedélyező készlet méretét.

Ez a kódrészlet bemutatja, hogyan hozhat létre készletet többpéldányos feladatokhoz a Batch .NET-kódtár használatával.

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;

Feljegyzés

Ha többpéldányos feladatot próbál futtatni egy olyan készletben, amelyben a csomópontok közötti kommunikáció le van tiltva, vagy ha a taskSlotsPerNode értéke 1-nél nagyobb, a tevékenység soha nem lesz ütemezve – az "aktív" állapotban marad határozatlan ideig.

Az InterComputeNodeCommunication engedélyezett készletei nem engedélyezik automatikusan a csomópont felbontását.

MpI telepítése StartTask használatával

Ha többpéldányos feladattal szeretne MPI-alkalmazásokat futtatni, először telepítenie kell egy MPI-implementációt (például MS-MPI vagy Intel MPI) a készlet számítási csomópontjaira. Itt az ideje, hogy egy StartTaskot használjon, amely akkor fut, amikor egy csomópont csatlakozik egy készlethez, vagy újraindul. Ez a kódrészlet létrehoz egy StartTaskot, amely erőforrásfájlként adja meg az MS-MPI telepítőcsomagot. Az erőforrásfájl csomópontra való letöltése után a rendszer végrehajtja a kezdő tevékenység parancssorát. Ebben az esetben a parancssor végrehajtja az MS-MPI felügyelet nélküli telepítését.

// 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();

Távoli közvetlen memóriahozzáférés (RDMA)

Ha olyan RDMA-kompatibilis méretet választ, mint például az A9 a Batch-készlet számítási csomópontjaihoz, az MPI-alkalmazás kihasználhatja az Azure nagy teljesítményű, kis késésű távoli közvetlen memóriahozzáférési (RDMA) hálózatát.

Keresse meg az Azure-beli virtuális gépek méreteiben (VirtualMachineConfiguration-készletek esetén) vagy a Cloud Services méreteiben (CloudServicesConfiguration-készletek esetén) az "RDMA-kompatibilis" méreteket.

Feljegyzés

Az RDMA linuxos számítási csomópontokon való kihasználásához Intel MPI-t kell használnia a csomópontokon.

Többpéldányos feladat létrehozása a Batch .NET-tel

Most, hogy már foglalkoztunk a készletkövetelményekkel és az MPI-csomag telepítésével, hozzuk létre a többpéldányos feladatot. Ebben a kódrészletben létrehozunk egy standard CloudTaskot, majd konfiguráljuk annak MultiInstanceSettings tulajdonságát. Ahogy korábban említettük, a többpéldányos tevékenység nem különálló tevékenységtípus, hanem többpéldányos beállításokkal konfigurált standard Batch-tevékenység.

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

Elsődleges tevékenység és altevékenységek

Amikor létrehoz egy tevékenység többpéldányos beállításait, meg kell adnia a feladat végrehajtásához szükséges számítási csomópontok számát. Amikor egy feladatnak küldi el a feladatot, a Batch szolgáltatás létrehoz egy elsődleges tevékenységet, és elegendő altevékenységet hoz létre, amelyek együttesen megfelelnek a megadott csomópontok számának.

Ezek a tevékenységek egy egész számazonosítót kapnak a 0 tartományban a numberOfInstances - 1 értékhez. A 0 azonosítójú tevékenység az elsődleges tevékenység, az összes többi azonosító pedig altevékenység. Ha például az alábbi többpéldányos beállításokat hozza létre egy tevékenységhez, az elsődleges tevékenység azonosítója 0, az altevékenységek pedig 1–9 azonosítóval rendelkeznek.

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

Fő csomópont

Többpéldányos feladat elküldésekor a Batch szolgáltatás az egyik számítási csomópontot fő csomópontként jelöli ki, és ütemezi az elsődleges feladatot a főcsomóponton való végrehajtásra. Az altevékenységek végrehajtása a többpéldányos tevékenységhez lefoglalt csomópontok fennmaradó részén lesz ütemezve.

Koordinációs parancs

A koordinációs parancsot az elsődleges és az altevékenységek is végrehajtják.

A koordinációs parancs meghívása blokkolva van – a Batch nem hajtja végre az alkalmazásparancsot, amíg a koordinációs parancs sikeresen vissza nem tér az összes altevékenységhez. A koordinációs parancsnak ezért minden szükséges háttérszolgáltatást el kell indítania, ellenőriznie kell, hogy készen állnak-e a használatra, majd ki kell lépnie. Az MS-MPI 7-es verzióját használó megoldás koordinációs parancsa például elindítja az SMPD szolgáltatást a csomóponton, majd kilép:

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

Figyelje meg a koordinációs parancs használatát start . Erre azért van szükség, mert az smpd.exe alkalmazás nem tér vissza azonnal a végrehajtás után. A start parancs használata nélkül ez a koordinációs parancs nem tér vissza, ezért letiltaná az alkalmazásparancs futtatását.

Alkalmazásparancs

Miután az elsődleges tevékenység és az összes altevékenység befejezte a koordinációs parancs végrehajtását, a többpéldányos tevékenység parancssorát csak az elsődleges tevékenység hajtja végre. Ezt az alkalmazásparancsnak nevezzük, hogy megkülönböztessük a koordinációs parancstól.

MS-MPI-alkalmazások esetén az alkalmazás paranccsal hajtsa végre az MPI-kompatibilis alkalmazást a következővel mpiexec.exe: . Íme például egy alkalmazásparancs az MS-MPI 7-es verzióját használó megoldáshoz:

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

Feljegyzés

Mivel az mpiexec.exe MS-MPI alapértelmezés szerint a CCP_NODES változót használja (lásd a környezeti változókat), a fenti példaalkalmazás parancssora kizárja azt.

Környezeti változók

A Batch több példányos tevékenységre jellemző környezeti változót hoz létre a többpéldányos tevékenységhez lefoglalt számítási csomópontokon. A koordinációs és alkalmazás-parancssorok hivatkozhatnak ezekre a környezeti változókra, valamint az általuk végrehajtott szkriptekre és programokra.

A Batch szolgáltatás a következő környezeti változókat hozza létre többpéldányos feladatokhoz:

  • 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

Ezekről és a Batch számítási csomópont egyéb környezeti változóiról, beleértve azok tartalmát és láthatóságát, tekintse meg a számítási csomópont környezeti változóit.

Tipp.

A Batch Linux MPI-kódmintája egy példát tartalmaz arra, hogy ezek közül a környezeti változók közül több hogyan használható.

Erőforrásfájlok

A többpéldányos tevékenységekhez két erőforrásfájlt kell figyelembe venni: az összes tevékenység által letöltött közös erőforrásfájlokat (mind az elsődleges, mind az altevékenységeket), valamint magát a többpéldányos tevékenységhez megadott erőforrásfájlokat, amelyeket csak az elsődleges tevékenység tölt le.

A feladat többpéldányos beállításaiban megadhat egy vagy több gyakori erőforrásfájlt . Ezeket a gyakori erőforrásfájlokat az elsődleges és az összes altevékenység letölti az Azure Storage-ból az egyes csomópontok feladatmegosztási könyvtárába. A feladat megosztott könyvtárát az alkalmazás- és koordinációs parancssorokból érheti el a AZ_BATCH_TASK_SHARED_DIR környezeti változó használatával. Az AZ_BATCH_TASK_SHARED_DIR elérési út azonos a többpéldányos feladathoz lefoglalt összes csomóponton, így egyetlen koordinációs parancsot oszthat meg az elsődleges és az összes altevékenység között. A Batch nem "osztja meg" a könyvtárat távelérési értelemben, de csatlakoztatási vagy megosztási pontként is használhatja, amint azt a környezeti változókra vonatkozó tipp korábban említette.

A többpéldányos tevékenységhez megadott erőforrásfájlok alapértelmezés szerint a tevékenység munkakönyvtárába AZ_BATCH_TASK_WORKING_DIRlesznek letöltve. Mint említettük, a gyakori erőforrásfájlokkal ellentétben csak az elsődleges tevékenység tölti le a többpéldányos tevékenységhez megadott erőforrásfájlokat.

Fontos

Mindig használja a környezeti változókat AZ_BATCH_TASK_SHARED_DIR , és AZ_BATCH_TASK_WORKING_DIR hivatkozzon ezekre a címtárakra a parancssorokban. Ne próbálja meg manuálisan létrehozni az útvonalakat.

Tevékenység élettartama

Az elsődleges tevékenység élettartama határozza meg a teljes többpéldányos tevékenység élettartamát. Amikor az elsődleges kilép, az összes altevékenység leáll. Az elsődleges kilépési kód a tevékenység kilépési kódja, ezért a feladat sikerességének vagy sikertelenségének meghatározására szolgál újrapróbálkozási célokra.

Ha az altevékenységek bármelyike sikertelen, a kilépés nem nulla visszatérési kóddal történik, például a teljes többpéldányos feladat meghiúsul. A többpéldányos feladat ezután leáll, és újra próbálkozik, egészen az újrapróbálkozási korlátig.

Többpéldányos tevékenység törlésekor az elsődleges és az összes altevékenységet a Batch szolgáltatás is törli. Az altevékenység-könyvtárak és fájljaik törlődnek a számítási csomópontokról, csakúgy, mint egy standard feladat esetében.

A többpéldányos tevékenységekhez tartozó TaskConstraints-értékeket, például a MaxTaskRetryCount, a MaxWallClockTime és a RetentionTime tulajdonságokat a rendszer úgy tartja tiszteletben, mint egy standard tevékenységhez, és az elsődleges és az összes altevékenységre vonatkozik. Ha azonban módosítja a RetentionTime tulajdonságot, miután hozzáadta a többpéldányos feladatot a feladathoz, a módosítás csak az elsődleges tevékenységre lesz alkalmazva, és az összes altevékenység továbbra is az eredeti RetentionTime-ot használja.

A számítási csomópont legutóbbi tevékenységlistája egy altevékenység azonosítóját tükrözi, ha a legutóbbi tevékenység egy többpéldányos tevékenység része volt.

Információk beszerzése az altevékenységekről

Ha a Batch .NET-kódtár használatával szeretne információt szerezni az altevékenységekről, hívja meg a CloudTask.ListSubtasks metódust. Ez a metódus az összes altevékenység adatait, valamint a feladatokat végrehajtó számítási csomópont adatait adja vissza. Ebből az információból meghatározhatja az egyes altevékenységek gyökérkönyvtárát, a készlet azonosítóját, az aktuális állapotát, a kilépési kódot stb. Ezeket az információkat a PoolOperations.GetNodeFile metódussal kombinálva szerezheti be az altevékenység fájljait. Vegye figyelembe, hogy ez a metódus nem ad vissza információt az elsődleges tevékenységről (0-s azonosító).

Feljegyzés

Ha másként nem rendelkezik, a többpéldányos CloudTaskon működő Batch .NET-metódusok csak az elsődleges tevékenységre vonatkoznak. Ha például meghívja a CloudTask.ListNodeFiles metódust egy többpéldányos tevékenységen, a rendszer csak az elsődleges tevékenység fájljait adja vissza.

Az alábbi kódrészlet bemutatja, hogyan szerezhet be altevékenységi adatokat, valamint hogyan kérhet le fájltartalmat azoktól a csomópontoktól, amelyeken végrehajtották őket.

// 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);
    }
});

Kódminta

A GitHub MultiInstanceTasks kódmintája bemutatja, hogyan futtathat MS-MPI-alkalmazást többpéldányos feladatokkal a Batch számítási csomópontokon. A minta futtatásához kövesse az alábbi lépéseket.

Előkészítés

  1. Töltse le az MS-MPI SDK és a Redist telepítőit , és telepítse őket. A telepítés után ellenőrizheti, hogy az MS-MPI környezeti változók be lettek-e állítva.
  2. Készítse el az MPIHelloWorld minta MPI-program kiadási verzióját. Ez az a program, amelyet a többpéldányos feladat a számítási csomópontokon fog futtatni.
  3. Hozzon létre egy zip-fájlt, MPIHelloWorld.exe amely tartalmazza (amelyet a 2. lépésben készített) és MSMpiSetup.exe (amelyet az 1. lépésben töltött le). Ezt a zip-fájlt alkalmazáscsomagként fogja feltölteni a következő lépésben.
  4. Az Azure Portal használatával hozzon létre egy "MPIHelloWorld" nevű Batch-alkalmazást, és adja meg az előző lépésben létrehozott zip-fájlt az alkalmazáscsomag 1.0-s verziójaként. További információ: Alkalmazások feltöltése és kezelése.

Tipp.

A kiadási MPIHelloWorld.exe verzió létrehozása biztosítja, hogy ne kelljen további függőségeket (példáulmsvcp140d.dll) vcruntime140d.dllbelefoglalnia az alkalmazáscsomagba.

Futtatási

  1. Töltse le az azure-batch-samples .zip fájlt a GitHubról.

  2. Nyissa meg a MultiInstanceTasks megoldást a Visual Studio 2019-ben. A MultiInstanceTasks.sln megoldásfájl a következő helyen található:

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

  3. Adja meg a Batch- és Storage-fiók hitelesítő adatait a Microsoft.Azure.Batch.Samples.Common projektbenAccountSettings.settings.

  4. Hozza létre és futtassa a MultiInstanceTasks megoldást az MPI-mintaalkalmazás batch-készlet számítási csomópontokon való végrehajtásához.

  5. Nem kötelező: Az erőforrások törlése előtt az Azure Portal vagy a Batch Explorer használatával vizsgálja meg a mintakészletet, a feladatot és a feladatot ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask").

Tipp.

A Visual Studio Community ingyenesen letölthető, ha még nem rendelkezik Visual Studióval.

MultiInstanceTasks.exe A kimenet a következőhöz hasonló:

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

Következő lépések