Batch'te İleti Geçirme Arabirimi (MPI) uygulamalarını çalıştırmak için çok örnekli görevleri kullanma

Çok örnekli görevler, aynı anda birden çok işlem düğümünde Azure Batch görevi çalıştırmanıza olanak tanır. Bu görevler Batch'te İleti Geçirme Arabirimi (MPI) uygulamaları gibi yüksek performanslı bilgi işlem senaryolarına olanak tanır. Bu makalede, Batch .NET kitaplığını kullanarak çok örnekli görevleri yürütmeyi öğreneceksiniz.

Not

Bu makaledeki örnekler Batch .NET, MS-MPI ve Windows işlem düğümlerine odaklansa da, burada açıklanan çok örnekli görev kavramları diğer platformlar ve teknolojiler (örneğin Linux düğümlerinde Python ve Intel MPI) için geçerlidir.

Çok örnekli göreve genel bakış

Batch'te her görev normalde tek bir işlem düğümünde yürütülür; bir işe birden çok görev gönderirsiniz ve Batch hizmeti her görevi bir düğümde yürütülmek üzere zamanlar. Ancak, bir görevin çok örnekli ayarlarını yapılandırarak Batch'e bunun yerine birden çok düğümde yürütülen bir birincil görev ve birkaç alt görev oluşturmasını söylersiniz.

Çok örnekli ayarlara genel bir bakış gösteren diyagram.

Bir işe çok örnekli ayarlara sahip bir görev gönderdiğinizde Batch, çok örnekli görevler için benzersiz birkaç adım gerçekleştirir:

  1. Batch hizmeti, çok örnekli ayarları temel alan bir birincil ve birkaç alt görev oluşturur. Toplam görev sayısı (birincil artı tüm alt görevler), çok örnekli ayarlarda belirttiğiniz örnek sayısıyla (işlem düğümleri ) eşleşir.
  2. Batch, işlem düğümlerinden birini ana düğüm olarak gösterir ve birincil görevi ana düğümde yürütülecek şekilde zamanlar. Alt görevleri, düğüm başına bir alt görev olmak üzere çok örnekli göreve ayrılan işlem düğümlerinin geri kalanında yürütülecek şekilde zamanlar.
  3. Birincil ve tüm alt görevler, çok örnekli ayarlarda belirttiğiniz tüm ortak kaynak dosyalarını indirir.
  4. Ortak kaynak dosyaları indirildikten sonra birincil ve alt görevler, çok örnekli ayarlarda belirttiğiniz koordinasyon komutunu yürütür. Koordinasyon komutu genellikle görevi yürütmek üzere düğümleri hazırlamak için kullanılır. Bu, arka plan hizmetlerini ( Microsoft MPI'lerismpd.exe gibi) başlatmayı ve düğümlerin düğümler arası iletileri işlemeye hazır olduğunu doğrulamayı içerebilir.
  5. Birincil görev, birincil ve tüm alt görevler tarafından koordinasyon komutu başarıyla tamamlandıktan sonra ana düğümde uygulama komutunu yürütür. Uygulama komutu, çok örnekli görevin kendisinin komut satırıdır ve yalnızca birincil görev tarafından yürütülür. MS-MPI tabanlı bir çözümde, MPI özellikli uygulamanızı kullanarak mpiexec.exeburada yürütebilirsiniz.

Not

İşlevsel olarak farklı olsa da, "çok örnekli görev" StartTask veya JobPreparationTask gibi benzersiz bir görev türü değildir. Çok örnekli görev, çok örnekli ayarları yapılandırılmış standart bir Batch görevidir (Batch .NET'te CloudTask ). Bu makalede, bunu çok örnekli görev olarak adlandırıyoruz.

Çok örnekli görevler için gereksinimler

Çok örnekli görevler , düğümler arası iletişimin etkinleştirildiği ve eşzamanlı görev yürütmenin devre dışı olduğu bir havuz gerektirir. Eşzamanlı görev yürütmeyi devre dışı bırakmak için CloudPool.TaskSlotsPerNode özelliğini 1 olarak ayarlayın.

Not

Batch, düğümler arası iletişimin etkinleştirildiği bir havuzun boyutunu sınırlar .

Bu kod parçacığı, Batch .NET kitaplığını kullanarak çok örnekli görevler için havuz oluşturmayı gösterir.

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;

Not

Çok örnekli bir görevi düğümler arası iletişim devre dışı bırakılmış veya taskSlotsPerNode değeri 1'den büyük olan bir havuzda çalıştırmaya çalışırsanız, görev hiçbir zaman zamanlanmamıştır; süresiz olarak "etkin" durumda kalır.

InterComputeNodeCommunication'ın etkinleştirildiği havuzlar düğümün sağlamasını otomatik olarak kaldırmaya izin vermez.

MPI'yi yüklemek için StartTask kullanma

MPI uygulamalarını çok örnekli bir görevle çalıştırmak için önce havuzdaki işlem düğümlerine bir MPI uygulaması (ÖRNEĞIN MS-MPI veya Intel MPI) yüklemeniz gerekir. Bir düğüm havuza her katıldığında veya yeniden başlatıldığında yürütülen StartTask'ı kullanmak için uygun bir zamandır. Bu kod parçacığı, MS-MPI kurulum paketini kaynak dosyası olarak belirten bir StartTask oluşturur. Başlangıç görevinin komut satırı, kaynak dosyası düğüme indirildikten sonra yürütülür. Bu durumda, komut satırı MS-MPI'nin katılımsız yüklemesini gerçekleştirir.

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

Doğrudan uzak bellek erişimi (RDMA)

Batch havuzunuzdaki işlem düğümleri için A9 gibi RDMA özellikli bir boyut seçtiğinizde, MPI uygulamanız Azure'ın yüksek performanslı, düşük gecikme süreli uzak doğrudan bellek erişimi (RDMA) ağından yararlanabilir.

Azure'daki sanal makineler için boyutlar (VirtualMachineConfiguration havuzları için) veya Cloud Services boyutları (CloudServicesConfiguration havuzları için) için "RDMA özellikli" olarak belirtilen boyutları arayın.

Not

Linux işlem düğümlerinde RDMA'nın avantajlarından yararlanmak için düğümlerde Intel MPI kullanmanız gerekir.

Batch .NET ile çok örnekli görev oluşturma

Havuz gereksinimlerini ve MPI paketi yüklemesini ele aldığımıza göre şimdi çok örnekli görevi oluşturalım. Bu kod parçacığında standart bir CloudTask oluşturup MultiInstanceSettings özelliğini yapılandıracağız. Daha önce belirtildiği gibi, çok örnekli görev ayrı bir görev türü değil, çok örnekli ayarlarla yapılandırılmış standart bir Batch görevidir.

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

Birincil görev ve alt görevler

Bir görev için çok örnekli ayarları oluşturduğunuzda, görevi yürütecek işlem düğümlerinin sayısını belirtirsiniz. Görevi bir işe gönderdiğinizde, Batch hizmeti bir birincil görev ve belirttiğiniz düğüm sayısıyla eşleşen yeterli alt görev oluşturur.

Bu görevlere 0 ile numberOfInstances - 1 aralığında bir tamsayı kimliği atanır. Kimliği 0 olan görev birincil görevdir ve diğer tüm kimlikler alt görevlerdir. Örneğin, bir görev için aşağıdaki çok örnekli ayarları oluşturursanız, birincil görevin kimliği 0, alt görevlerin kimlikleri 1 ile 9 arasında olabilir.

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

Ana düğüm

Çok örnekli bir görev gönderdiğinizde, Batch hizmeti işlem düğümlerinden birini "ana" düğüm olarak tanımlar ve birincil görevi ana düğümde yürütülecek şekilde zamanlar. Alt görevler, çok örnekli göreve ayrılan düğümlerin geri kalanında yürütülecek şekilde zamanlanır.

Koordinasyon komutu

Koordinasyon komutu hem birincil hem de alt görevler tarafından yürütülür.

Koordinasyon komutunun çağrılması engelleniyor--Batch, tüm alt görevler için koordinasyon komutu başarıyla döndürülene kadar uygulama komutunu yürütmez. Bu nedenle koordinasyon komutu gerekli arka plan hizmetlerini başlatmalı, kullanıma hazır olduklarını doğrulamalı ve sonra çıkmalıdır. Örneğin, MS-MPI sürüm 7 kullanan bir çözüm için bu koordinasyon komutu düğümde SMPD hizmetini başlatır ve ardından şu çıkışları alır:

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

Bu koordinasyon komutunda kullanımına start dikkat edin. Uygulama yürütmeden smpd.exe hemen sonra dönmediğinden bu gereklidir. Start komutu kullanılmadan bu koordinasyon komutu döndürülmeyecek ve bu nedenle uygulama komutunun çalıştırılmasını engelleyeceksiniz.

Uygulama komutu

Birincil görev ve tüm alt görevler koordinasyon komutunu yürütmeyi bitirdikten sonra, çok örnekli görevin komut satırı yalnızca birincil görev tarafından yürütülür. Bunu koordinasyon komutundan ayırmak için uygulama komutu olarak adlandırıyoruz.

MS-MPI uygulamalarında, ile MPI özellikli uygulamanızı yürütmek için uygulama mpiexec.exekomutunu kullanın. Örneğin, MS-MPI sürüm 7'yi kullanan bir çözüm için uygulama komutu aşağıda verilmiştir:

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

Not

MS-MPI'lar mpiexec.exe varsayılan olarak değişkenini kullandığından CCP_NODES (bkz . Ortam değişkenleri), yukarıdaki örnek uygulama komut satırı bunu dışlar.

Ortam değişkenleri

Batch, çok örnekli bir göreve ayrılan işlem düğümlerinde çok örnekli görevlere özgü birkaç ortam değişkeni oluşturur. Koordinasyon ve uygulama komut satırlarınız, yürütürken kullandıkları betikler ve programlar gibi bu ortam değişkenlerine de başvurabilir.

Aşağıdaki ortam değişkenleri Batch hizmeti tarafından çok örnekli görevler tarafından kullanılmak üzere oluşturulur:

  • 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

Bunlar ve bunların içeriği ve görünürlüğü de dahil olmak üzere diğer Batch işlem düğümü ortam değişkenleriyle ilgili tüm ayrıntılar için bkz . İşlem düğümü ortam değişkenleri.

İpucu

Batch Linux MPI kod örneği, bu ortam değişkenlerinden birkaçının nasıl kullanılabileceğini gösteren bir örnek içerir.

Kaynak dosyalar

Çok örnekli görevler için dikkate alınması gereken iki kaynak dosyası kümesi vardır: tüm görevlerin indirdiği ortak kaynak dosyaları (hem birincil hem de alt görevler) ve çok örnekli görevin kendisi için belirtilen ve yalnızca birincil görevin indirdiği kaynak dosyaları.

Bir görevin çok örnekli ayarlarında bir veya daha fazla ortak kaynak dosyası belirtebilirsiniz. Bu yaygın kaynak dosyaları Azure Depolama'dan birincil ve tüm alt görevler tarafından her düğümün görev paylaşılan dizinine indirilir. Ortam değişkenini kullanarak uygulama ve koordinasyon komut satırlarından görev paylaşılan dizinine AZ_BATCH_TASK_SHARED_DIR erişebilirsiniz. Yol AZ_BATCH_TASK_SHARED_DIR , çok örnekli göreve ayrılan her düğümde aynıdır, böylece birincil ve tüm alt görevler arasında tek bir koordinasyon komutunu paylaşabilirsiniz. Batch, uzaktan erişim açısından dizini "paylaşmaz", ancak daha önce ortam değişkenleriyle ilgili ipucunda belirtildiği gibi bir bağlama veya paylaşım noktası olarak kullanabilirsiniz.

Çok örnekli görev için belirttiğiniz kaynak dosyaları varsayılan olarak görevin çalışma dizinine AZ_BATCH_TASK_WORKING_DIRindirilir. Belirtildiği gibi, yaygın kaynak dosyalarının aksine, yalnızca birincil görev çok örnekli görevin kendisi için belirtilen kaynak dosyalarını indirir.

Önemli

Her zaman ortam değişkenlerini AZ_BATCH_TASK_SHARED_DIR kullanın ve AZ_BATCH_TASK_WORKING_DIR komut satırlarınızda bu dizinlere başvurun. Yolları el ile oluşturma girişiminde kullanmayın.

Görev ömrü

Birincil görevin ömrü, çok örnekli görevin tamamının ömrünü denetler. Birincil görevden çıkıldığında, tüm alt görevler sonlandırılır. Birincil çıkış kodu görevin çıkış kodudur ve bu nedenle yeniden deneme amacıyla görevin başarısını veya başarısızlığını belirlemek için kullanılır.

Alt görevlerden herhangi biri başarısız olursa, sıfır olmayan bir dönüş koduyla çıkılırsa, örneğin, çok örnekli görevin tamamı başarısız olur. Çok örnekli görev daha sonra sonlandırılır ve yeniden denenerek yeniden deneme sınırına kadar devam eder.

Çok örnekli bir görevi sildiğinizde, birincil ve tüm alt görevler de Batch hizmeti tarafından silinir. Tüm alt görev dizinleri ve dosyaları, aynı standart bir görevde olduğu gibi işlem düğümlerinden silinir.

MaxTaskRetryCount, MaxWallClockTime ve RetentionTime özellikleri gibi çok örnekli bir görev için TaskConstraints, standart bir görev için olduğu gibi kabul edilir ve birincil ve tüm alt görevlere uygulanır. Ancak, işe çok örnekli görevi ekledikten sonraRetentionTime özelliğini değiştirirseniz, bu değişiklik yalnızca birincil göreve uygulanır ve tüm alt görevler özgün RetentionTime'ı kullanmaya devam eder.

Son görev çok örnekli bir görevin parçasıysa, işlem düğümünün son görev listesi bir alt görevin kimliğini yansıtır.

Alt görevler hakkında bilgi edinme

Batch .NET kitaplığını kullanarak alt görevler hakkında bilgi edinmek için CloudTask.ListSubtasks yöntemini çağırın. Bu yöntem tüm alt görevlerle ilgili bilgileri ve görevleri yürüten işlem düğümü hakkındaki bilgileri döndürür. Bu bilgilerden her alt görevi kök dizinini, havuz kimliğini, geçerli durumunu, çıkış kodunu ve daha fazlasını belirleyebilirsiniz. Bu bilgileri PoolOperations.GetNodeFile yöntemiyle birlikte kullanarak alt görevlerin dosyalarını alabilirsiniz. Bu yöntemin birincil görev (Kimlik 0) için bilgi döndürmediğini unutmayın.

Not

Aksi belirtilmedikçe, çok örnekli CloudTask üzerinde çalışan Batch .NET yöntemleri yalnızca birincil görev için geçerlidir. Örneğin, çok örnekli bir görevde CloudTask.ListNodeFiles yöntemini çağırdığınızda, yalnızca birincil görevin dosyaları döndürülür.

Aşağıdaki kod parçacığında alt görev bilgilerinin nasıl alındığı ve yürütüldükleri düğümlerden istek dosyası içeriğinin nasıl alındığı gösterilmektedir.

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

Kod örneği

GitHub'da MultiInstanceTasks kod örneği, Batch işlem düğümlerinde MS-MPI uygulaması çalıştırmak için çok örnekli bir görevin nasıl kullanılacağını gösterir. Örneği çalıştırmak için aşağıdaki adımları izleyin.

Hazırlık

  1. MS-MPI SDK ve Redist yükleyicilerini indirin ve yükleyin. Yüklemeden sonra MS-MPI ortam değişkenlerinin ayarlandığını doğrulayabilirsiniz.
  2. MPIHelloWorld örnek MPI programının Yayın sürümünü oluşturun. Bu, çok örnekli görev tarafından işlem düğümlerinde çalıştırılacak programdır.
  3. (2. adımda oluşturduğunuz) ve MSMpiSetup.exe (1. adımda indirdiğiniz) içeren MPIHelloWorld.exe bir zip dosyası oluşturun. Bu zip dosyasını bir sonraki adımda uygulama paketi olarak karşıya yükleyeceksiniz.
  4. "MPIHelloWorld" adlı bir Batch uygulaması oluşturmak için Azure portal kullanın ve önceki adımda oluşturduğunuz zip dosyasını uygulama paketinin "1.0" sürümü olarak belirtin. Daha fazla bilgi için bkz . Uygulamaları karşıya yükleme ve yönetme .

İpucu

Sürümü derlemekMPIHelloWorld.exe, uygulama paketinize herhangi bir ek bağımlılık (örneğin, msvcp140d.dll veya vcruntime140d.dll) eklemek zorunda olmadığınızı güvence altına alır.

Yürütme

  1. GitHub'dan azure-batch-samples .zip dosyasını indirin.

  2. Visual Studio 2019'da MultiInstanceTasks çözümünü açın. Çözüm MultiInstanceTasks.sln dosyası şu konumda bulunur:

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

  3. Batch ve Depolama hesabı kimlik bilgilerinizi AccountSettings.settingsMicrosoft.Azure.Batch.Samples.Common projesine girin.

  4. Bir Batch havuzundaki işlem düğümlerinde MPI örnek uygulamasını yürütmek için MultiInstanceTasks çözümünü derleyin ve çalıştırın.

  5. İsteğe bağlı: Kaynakları silmeden önce örnek havuzu, işi ve görevi ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") incelemek için Azure portal veya Batch Gezgini'ni kullanın.

İpucu

Visual Studio'nuz yoksa Visual Studio Community ücretsiz olarak indirebilirsiniz.

çıktısı MultiInstanceTasks.exe aşağıdakine benzer:

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

Sonraki adımlar