Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Çok örnekli görevler, aynı anda birden çok işlem düğümünde bir 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 ele alınan çok örnekli görev kavramları diğer platformlar ve teknolojiler (örneğin Linux düğümlerinde Python ve Intel MPI) için geçerlidir.
Çoklu görev örneğine genel bakış
Batch'te her görev normalde tek bir hesaplama düğümünde yürütülür; bir işe birden çok görev gönderirsiniz, ve Batch servisi 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.
Bir işe çok örnekli ayarları olan bir görev gönderdiğinizde Batch, çok örnekli görevlere özgü birkaç adım gerçekleştirir:
- Batch hizmeti, çok örnekli ayarları temel alan bir birincil ve birkaç alt görev oluşturur. Toplam görev sayısı (birincil ve tüm alt görevler), çok örnekli ayarlarda belirttiğiniz örnek sayısıyla (işlem düğümleri ) eşleşir.
- Batch, işlem düğümlerinden birini ana düğüm olarak atar ve birincil görevi ana düğümde yürütülmesi için planlar. Çok örnekli göreve ayrılan işlem düğümlerinin geri kalanında, düğüm başına bir alt görev olacak şekilde alt görevlerin yürütülmesi için bir zamanlama yapar.
- Birincil ve tüm alt görevler, çok örnekli ayarlarda belirttiğiniz tüm ortak kaynak dosyalarını indirir.
- 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'leri) başlatmayı ve düğümlerin düğümler arası iletileri işlemeye hazır olduğunu doğrulamayı içerebilir.
- 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 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ıracağız.
Ç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ışı bırakildiği bir havuz gerektirir. Eşzamanlı görev yürütmeyi devre dışı bırakmak için CloudPool.TaskSlotsPerNode özelliğini 1 olarak ayarlayın.
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şimin devre dışı olduğu veya taskSlotsPerNode değerinin 1'den büyük olduğu bir havuzda çalıştırmaya çalışırsanız, görev asla zamanlanmaz ve süresiz olarak "etkin" durumda kalır.
InterComputeNodeCommunication etkinleştirilmiş havuzlar, düğüm sağlanmasının otomatik olarak iptal edilmesine 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 bir havuza katıldığında veya yeniden başlatıldığında yürütülen StartTask'ı kullanmak için iyi bir zamandır. Bu kod parçacığı, MS-MPI kurulum paketini kaynak dosyası olarak belirten bir StartTask oluşturur. Kaynak dosyası düğüme indirildikten sonra başlangıç görevinin komut satırı yürütülür. Bu durumda, komut satırı MS-MPI'nın 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();
Uzaktan doğrudan 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 uzaktan doğrudan bellek erişimi (RDMA) ağından yararlanabilir.
Azure'daki VirtualMachineConfiguration havuzları için sanal makineler boyutları veya CloudServicesConfiguration havuzları için Cloud Services boyutları arasında "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şturacak ve ardından 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. 0 kimliğine sahip 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 olur ve alt görevlerin kimlikleri 1 ile 9 arasında olur.
int numberOfNodes = 10;
myMultiInstanceTask.MultiInstanceSettings = new MultiInstanceSettings(numberOfNodes);
Ana düğüm
Çok örnekli bir görev gönderdiğinizde, Batch hizmeti hesaplama düğümlerinden birini "ana" düğüm olarak belirtir ve birincil görevin ana düğümde yürütülmesini 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'yi kullanan bir çözüm için bu koordinasyon komutu, düğümde SMPD hizmetini başlatır ve daha sonra sonlandırır.
cmd /c start cmd /c ""%MSMPI_BIN%\smpd.exe"" -d
Bu koordinasyon komutunda start kullanımına dikkat edin.
smpd.exe uygulaması, çalıştırıldıktan hemen sonra geri dönmediği için bu gereklidir. Start komutu kullanılmadan bu koordinasyon komutu döndürülmeyecek ve bu nedenle uygulama komutunun çalışması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, MPI özellikli uygulamanızı ile mpiexec.exeyürütmek için uygulama komutunu 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 değişkeni varsayılan olarak 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üttikleri 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_NODESAZ_BATCH_NODE_LISTAZ_BATCH_HOST_LISTAZ_BATCH_MASTER_NODEAZ_BATCH_TASK_SHARED_DIRAZ_BATCH_IS_CURRENT_NODE_MASTER
İçeriği ve görünürlüğü de dahil olmak üzere bunlar ve diğer Batch işlem düğümü ortam değişkenleri hakkında 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 yalnızca birincil görevin indirdiği çok örnekli görevin kendisi için belirtilen kaynak dosyaları.
Bir görevin çok örnekli ayarlarında bir veya daha fazla ortak kaynak dosyası belirtebilirsiniz. Bu ortak kaynak dosyaları, birincil görev ve tüm alt görevler tarafından Azure Depolama'dan her düğümün görev paylaşım 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 komutu paylaşabilirsiniz. Batch, dizini uzaktan erişim açısından "paylaşmaz", ancak daha önce ortam değişkenleriyle ilgili ipucunda belirtildiği gibi 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ı manuel olarak oluşturmayı denemeyin.
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 ve sıfır olmayan bir geri dönüş koduyla çıkılırsa, örneğin, çoklu örnek görev tamamen başarısız olur. Çok örnekli görev sonlandırılır ve yeniden deneme sınırına kadar tekrar denenir.
Ç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.
tr-TR: Çok örnekli bir görev için TaskConstraints, MaxTaskRetryCount, MaxWallClockTime ve RetentionTime özellikleri gibi, standart bir görev için olduğu gibi kabul edilir ve birincil ve tüm alt görevlere uygulanır. Ancak, çok örnekli görevi işe 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.
İşlem düğümünün son görev listesi, son görev çok örnekli bir görevin parçasıysa 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 almak 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örevin kök dizinini, havuz kimliğini, geçerli durumunu, çıkış kodunu ve daha fazlasını belirleyebilirsiniz. Bu bilgileri, alt görevin dosyalarını almak için PoolOperations.GetNodeFile yöntemiyle birlikte kullanabilirsiniz. Bu yöntemin birincil görev (Kimlik 0) için bilgi döndürmediğini unutmayın.
Not
Aksi belirtilmediği sürece, çok örnekli CloudTask üzerinde çalışan Batch .NET yöntemleri yalnızca birincil göreve uygulanır. Ö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
- MS-MPI SDK'sını ve Redist yükleyicilerini indirin ve yükleyin. Yüklemeden sonra MS-MPI ortam değişkenlerinin ayarlandığını doğrulayabilirsiniz.
- 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.
- (2. adımda oluşturduğunuz) ve
MPIHelloWorld.exe(1. adımda indirdiğiniz) içerenMSMpiSetup.exebir zip dosyası oluşturun. Bu zip dosyasını bir sonraki adımda uygulama paketi olarak karşıya yükleyeceksiniz. - Azure portalını kullanarak "MPIHelloWorld" adlı bir Batch uygulaması oluşturun ve önceki adımda oluşturduğunuz zip dosyasını uygulama paketinin "1.0" sürümü olarak belirtin. Daha fazla bilgi için Uygulamaları karşıya yükleme ve yönetme bölümüne bakın.
İpucu
Yayın sürümünü derlemek, uygulama paketinize herhangi bir ek bağımlılık (örneğin, MPIHelloWorld.exe veya msvcp140d.dll) eklemeniz gerekmemesini sağlar.
İcra
GitHub'dan azure-batch-samples .zip dosyasını indirin.
Visual Studio 2019'da MultiInstanceTasks çözümünü açın. Çözüm
MultiInstanceTasks.slndosyası şu konumda bulunur:azure-batch-samples\CSharp\ArticleProjects\MultiInstanceTasks\Microsoft.Azure.Batch.Samples.Common
AccountSettings.settingsBatch ve Depolama hesabı kimlik bilgilerinizi girin.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 .
İsteğe bağlı: Kaynakları silmeden önce örnek havuzu, işi ve görevi ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") incelemek için Azure portalını veya Batch Gezgini'ni kullanın.
İpucu
Visual Studio'nuz yoksa Visual Studio Community'i ücretsiz olarak indirebilirsiniz.
MultiInstanceTasks.exe çıktısı 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
- Azure Batch'te Linux için MPI desteği hakkında daha fazla bilgi edinin.
- Azure Batch MPI çözümlerinizde kullanmak üzere Linux işlem düğümleri havuzları oluşturmayı öğrenin.