Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Tugas multi-instance memungkinkan Anda menjalankan tugas Azure Batch pada beberapa node komputasi secara bersamaan. Tugas-tugas ini memungkinkan skenario komputasi kinerja tinggi seperti aplikasi Message Passing Interface (MPI) dalam Batch. Dalam artikel ini, Anda akan mempelajari cara menjalankan tugas multi-instans menggunakan pustaka Azure.Compute.Batch.
Note
Sementara contoh dalam artikel ini berfokus pada Azure. Compute.Batch, MS-MPI, dan Windows simpul komputasi, konsep tugas multi-instans yang dibahas di sini berlaku untuk platform dan teknologi lain (Python dan Intel MPI pada simpul Linux, misalnya).
Gambaran Tugas Multi-instance
Dalam Batch, setiap tugas biasanya dieksekusi pada satu node komputasi tunggal—Anda mengirimkan beberapa tugas ke satu pekerjaan, dan layanan Batch menjadwalkan setiap tugas untuk dieksekusi pada sebuah node. Namun, dengan mengonfigurasi pengaturan multi-instance suatu tugas, Anda memberi tahu Batch untuk membuat satu tugas utama dan beberapa subtugas yang kemudian dieksekusi pada beberapa simpul.
Ketika Anda mengirimkan sebuah tugas dengan pengaturan multi-instance ke sebuah pekerjaan, Batch melakukan beberapa langkah unik untuk tugas multi-instance.
- Layanan Batch membuat satu utama dan beberapa subtugas berdasarkan pengaturan multi-instance. Jumlah total tugas (utama ditambah semua sub-tugas) harus sesuai dengan jumlah instance (node komputasi) yang Anda tentukan dalam pengaturan multi-instance.
- Batch menunjuk salah satu simpul komputasi sebagai master, dan menjadwalkan tugas utama untuk dijalankan pada master. Ini menjadwalkan subtugas untuk dijalankan pada sisa simpul komputasi yang dialokasikan untuk tugas multi-instans, satu subtugas per simpul.
- Tugas utama dan seluruh sub-tugas mengunduh file sumber daya umum apa pun yang Anda tentukan dalam pengaturan multi-instansi.
- Setelah file sumber daya umum telah diunduh, tugas utama dan subtugas menjalankan perintah koordinasi yang Anda tentukan dalam pengaturan multi-instans. Perintah koordinasi biasanya digunakan untuk mempersiapkan node agar dapat menjalankan tugas. Ini dapat melibatkan memulai layanan latar belakang (seperti Microsoft MPI
smpd.exe) dan memverifikasi bahwa node siap untuk memproses pesan antar node. - Tugas utama menjalankan perintah aplikasi pada simpul master setelah perintah koordinasi berhasil diselesaikan oleh primer dan semua subtugas. Perintah aplikasi adalah baris perintah dari tugas multi-instans itu sendiri, dan hanya dijalankan oleh tugas utama. Dalam solusi berbasis MS-MPI, di sinilah Anda menjalankan aplikasi berkemampuan MPI menggunakan
mpiexec.exe.
Note
Meskipun berbeda secara fungsional, "tugas multi-instans" bukan jenis tugas unik seperti BatchStartTask atau BatchJobPreparationTask. Tugas multi-instans hanyalah tugas Batch standar (BatchTask di Azure. Compute.Batch) yang pengaturan multi-instansnya telah dikonfigurasi. Dalam artikel ini, kami menyebutnya sebagai tugas multi-instance.
Persyaratan untuk tugas multi-instance
Tugas multiinstans memerlukan pool yang komunikasi antarsimpul diaktifkan serta eksekusi tugas secara bersamaan dinonaktifkan. Untuk menonaktifkan eksekusi tugas bersamaan, atur properti BatchAccountPoolData.TaskSlotsPerNode ke 1.
Note
Batch membatasi ukuran kumpulan yang telah mengaktifkan komunikasi antar-node.
Cuplikan kode ini menunjukkan cara membuat pool untuk tugas multiinstans menggunakan pustaka Azure.ResourceManager.Batch.
ArmClient armClient = new ArmClient(new DefaultAzureCredential());
ResourceIdentifier batchAccountResourceId =
BatchAccountResource.CreateResourceIdentifier("subscriptionId", "resourceGroupName", "accountName");
BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountResourceId);
BatchAccountPoolCollection poolCollection = batchAccount.GetBatchAccountPools();
BatchAccountPoolData poolData = new BatchAccountPoolData()
{
VmSize = "standard_d1_v2",
DeploymentConfiguration = new BatchDeploymentConfiguration()
{
VmConfiguration = new BatchVmConfiguration(
imageReference: new BatchImageReference()
{
Publisher = "MicrosoftWindowsServer",
Offer = "WindowsServer",
Sku = "2019-datacenter-core",
Version = "latest"
},
nodeAgentSkuId: "batch.node.windows amd64")
},
ScaleSettings = new BatchAccountPoolScaleSettings()
{
FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 3 }
},
// Multi-instance tasks require inter-node communication, and those nodes
// must run only one task at a time.
InterNodeCommunication = InterNodeCommunicationState.Enabled,
TaskSlotsPerNode = 1
};
Note
Jika Anda mencoba menjalankan tugas multi-instansi dalam kumpulan dengan komunikasi internode dinonaktifkan, atau dengan nilai taskSlotsPerNode yang lebih besar dari 1, tugas tersebut tidak pernah dijadwalkan—tetap berada dalam status "aktif" tanpa batas waktu.
Pool dengan InterComputeNodeCommunication yang diaktifkan tidak akan mengizinkan deprovisi node secara otomatis.
Menggunakan StartTask untuk menginstal MPI
Untuk menjalankan aplikasi MPI dengan tugas multi-instans, Anda harus terlebih dahulu menginstal implementasi MPI (MS-MPI atau Intel MPI, misalnya) pada simpul komputasi di kumpulan. Ini adalah waktu yang tepat untuk menggunakan BatchAccountPoolStartTask, yang dijalankan setiap kali simpul bergabung dengan kumpulan, atau dimulai ulang. Cuplikan kode ini menambahkan tugas awal ke definisi kumpulan yang menentukan paket penyiapan MS-MPI sebagai file sumber daya. Baris perintah tugas awal dijalankan setelah file sumber daya diunduh ke node. Dalam kasus ini, baris perintah melakukan pemasangan MS-MPI secara otomatis tanpa pengawasan.
// Add a start task to the pool which we use for installing MS-MPI on
// the nodes as they join the pool (or when they are restarted).
poolData.StartTask = new BatchAccountPoolStartTask()
{
CommandLine = "cmd /c MSMpiSetup.exe -unattend -force",
UserIdentity = new BatchUserIdentity()
{
AutoUser = new BatchAutoUserSpecification() { ElevationLevel = BatchUserAccountElevationLevel.Admin }
},
WaitForSuccess = true,
};
poolData.StartTask.ResourceFiles.Add(new BatchResourceFile()
{
HttpUri = new Uri("https://mystorageaccount.blob.core.windows.net/mycontainer/MSMpiSetup.exe"),
FilePath = "MSMpiSetup.exe"
});
// Create the fully configured pool.
ArmOperation<BatchAccountPoolResource> pool = await poolCollection.CreateOrUpdateAsync(
WaitUntil.Completed, "MultiInstanceSamplePool", poolData);
Akses memori langsung jarak jauh (RDMA)
Saat Anda memilih ukuran berkemampuan RDMA seperti A9 untuk simpul komputasi di kumpulan Batch Anda, aplikasi MPI Anda dapat memanfaatkan jaringan akses memori langsung jarak jauh (RDMA) berkinerja tinggi dan latensi rendah Azure.
Cari ukuran yang ditandai sebagai "mendukung RDMA" dalam Ukuran untuk komputer virtual di Azure (untuk kumpulan VirtualMachineConfiguration) atau Ukuran untuk Cloud Services (untuk kumpulan CloudServicesConfiguration).
Note
Untuk memanfaatkan RDMA pada simpul komputasi Linux, Anda harus menggunakan Intel MPI pada simpul.
Buat tugas multi-instans dengan Azure. Compute.Batch
Sekarang setelah kita membahas persyaratan pool dan instalasi paket MPI, mari kita buat tugas multi-instance. Dalam cuplikan ini, kami membuat BatchTaskCreateOptions standar, lalu mengonfigurasi properti MultiInstanceSettings-nya . Seperti disebutkan sebelumnya, tugas multi-instans bukan jenis tugas yang berbeda, tetapi tugas Batch standar yang dikonfigurasi dengan pengaturan multi-instans.
// 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.
BatchTaskCreateOptions myMultiInstanceTask = new BatchTaskCreateOptions(
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.
MultiInstanceSettings = new MultiInstanceSettings(
@"cmd /c start cmd /c ""%MSMPI_BIN%\smpd.exe"" -d")
{
NumberOfInstances = numberOfNodes
}
};
myMultiInstanceTask.MultiInstanceSettings.CommonResourceFiles.Add(new ResourceFile()
{
HttpUri = new Uri("https://mystorageaccount.blob.core.windows.net/mycontainer/MyMPIApplication.exe"),
FilePath = "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.CreateTaskAsync("mybatchjob", myMultiInstanceTask);
Tugas utama dan subtugas
Saat Anda membuat pengaturan multi-instans untuk tugas, Anda menentukan jumlah simpul komputasi yang akan menjalankan tugas. Saat Anda menyerahkan tugas ke sebuah job, layanan Batch membuat satu tugas utama dan subtugas dalam jumlah yang cukup sehingga totalnya sesuai dengan jumlah simpul yang Anda tentukan.
Tugas-tugas ini diberikan ID bilangan bulat dalam rentang dari 0 hingga numberOfInstances - 1. Tugas dengan ID 0 adalah tugas utama, dan semua ID lainnya adalah sub-tugas. Misalnya, jika Anda membuat pengaturan multi-instance berikut untuk sebuah tugas, tugas utama akan memiliki ID 0, dan sub-tugas akan memiliki ID 1 hingga 9.
int numberOfNodes = 10;
myMultiInstanceTask.MultiInstanceSettings = new MultiInstanceSettings("coord-cmd")
{
NumberOfInstances = numberOfNodes
};
Simpul utama
Ketika Anda mengajukan tugas multi-instance, layanan Batch menetapkan salah satu node komputasi sebagai node "master", dan menjadwalkan tugas utama untuk dieksekusi pada node master. Subtugas dijadwalkan untuk dieksekusi pada sisa node yang dialokasikan untuk tugas multi-instance.
Perintah Koordinasi
Perintah koordinasi dijalankan oleh tugas utama dan subtugas.
Pemanggilan perintah koordinasi ini bersifat memblokir—Batch tidak akan mengeksekusi perintah aplikasi sampai perintah koordinasi berhasil kembali untuk semua sub-tugas. Perintah koordinasi oleh karena itu harus memulai layanan latar belakang yang diperlukan, memverifikasi bahwa layanan tersebut siap digunakan, dan kemudian keluar. Sebagai contoh, perintah koordinasi ini untuk solusi yang menggunakan MS-MPI versi 7 memulai layanan SMPD pada node, kemudian keluar.
cmd /c start cmd /c ""%MSMPI_BIN%\smpd.exe"" -d
Perhatikan penggunaan start dalam perintah koordinasi ini. Ini diperlukan karena aplikasi smpd.exe tidak segera kembali setelah eksekusi. Tanpa penggunaan perintah start, perintah koordinasi ini tidak akan kembali dan dengan demikian akan menghalangi perintah aplikasi untuk berjalan.
Perintah aplikasi
Setelah tugas utama dan semua sub-tugas selesai melaksanakan perintah koordinasi, baris perintah untuk tugas multi-instance dilaksanakan oleh tugas utama saja. Kami menyebut ini sebagai perintah aplikasi untuk membedakannya dari perintah koordinasi.
Untuk aplikasi MS-MPI, gunakan perintah aplikasi untuk mengeksekusi aplikasi Anda yang mendukung MPI dengan mpiexec.exe. Misalnya, berikut adalah perintah aplikasi untuk solusi menggunakan MS-MPI versi 7:
cmd /c ""%MSMPI_BIN%\mpiexec.exe"" -c 1 -wdir %AZ_BATCH_TASK_SHARED_DIR% MyMPIApplication.exe
Note
Karena MS-MPI mpiexec.exe menggunakan variabel CCP_NODES secara default (lihat Variabel Lingkungan), baris perintah aplikasi contoh di atas tidak menyertakannya.
Variabel lingkungan
Batch membuat beberapa environment variables yang spesifik untuk tugas multi-instance pada node komputasi yang dialokasikan untuk satu tugas multi-instance. Garis perintah koordinasi dan aplikasi Anda dapat merujuk pada variabel lingkungan ini, begitu juga dengan skrip dan program yang mereka jalankan.
Variabel lingkungan berikut dibuat oleh layanan Batch untuk digunakan oleh tugas multi-instance:
CCP_NODESAZ_BATCH_NODE_LISTAZ_BATCH_HOST_LISTAZ_BATCH_MASTER_NODEAZ_BATCH_TASK_SHARED_DIRAZ_BATCH_IS_CURRENT_NODE_MASTER
Untuk detail lengkap mengenai variabel lingkungan node komputasi Batch ini dan yang lainnya, termasuk isi dan visibilitasnya, lihat Variabel lingkungan node komputasi.
Tip
Contoh kode Batch Linux MPI mencakup contoh bagaimana beberapa variabel lingkungan ini dapat digunakan.
File sumber daya
Ada dua kumpulan file sumber daya yang perlu diperhatikan untuk tugas multi-instans: file sumber daya umum yang diunduh oleh semua tugas (baik tugas utama maupun subtugas), dan file sumber daya yang ditentukan untuk tugas multi-instans itu sendiri, yang hanya diunduh oleh tugas utama.
Anda dapat menentukan satu atau lebih file sumber daya umum dalam pengaturan multi-instance untuk suatu tugas. File sumber umum ini diunduh dari Azure Storage ke dalam direktori bersama tugas di setiap node oleh tugas utama dan semua subtask. Anda dapat mengakses direktori tugas yang dibagikan dari aplikasi dan baris perintah koordinasi dengan menggunakan variabel lingkungan AZ_BATCH_TASK_SHARED_DIR. Jalur akses AZ_BATCH_TASK_SHARED_DIR identik pada setiap simpul yang dialokasikan ke tugas multi-instans, sehingga Anda dapat menggunakan satu perintah koordinasi yang sama antara instans utama dan semua subtugasnya. Batch tidak "membagikan" direktori dalam arti akses jarak jauh, tetapi Anda dapat menggunakannya sebagai titik pemasangan atau berbagi seperti yang disebutkan sebelumnya dalam tip tentang variabel lingkungan.
File sumber daya yang Anda tentukan untuk tugas multi-instans itu sendiri diunduh ke direktori kerja tugas, AZ_BATCH_TASK_WORKING_DIR, secara default. Seperti disebutkan, berbeda dengan berkas sumber umum, hanya tugas utama yang mengunduh berkas sumber yang ditentukan untuk tugas multi-instan itu sendiri.
Penting
Selalu gunakan variabel lingkungan AZ_BATCH_TASK_SHARED_DIR dan AZ_BATCH_TASK_WORKING_DIR untuk merujuk ke direktori ini dalam baris perintah Anda. Jangan mencoba untuk membangun jalur secara manual.
Masa pakai tugas
Masa hidup dari tugas utama mengendalikan masa hidup dari seluruh tugas multi-instance. Ketika yang utama keluar, semua sub-tugas dihentikan. Kode keluaran dari yang utama adalah kode keluaran dari tugas, dan oleh karena itu digunakan untuk menentukan keberhasilan atau kegagalan tugas untuk keperluan mencoba kembali.
Jika salah satu subtugas gagal, yang menyebabkan proses keluar dengan kode pengembalian non-nol, misalnya, seluruh tugas multi-instans akan gagal. Tugas multi-instance kemudian dihentikan dan dicoba ulang, sampai batas ulangnya tercapai.
Ketika Anda menghapus tugas multi-instance, tugas utama dan semua sub-tugas juga akan dihapus oleh layanan Batch. Semua direktori sub-tugas dan file-file di dalamnya dihapus dari node komputasi, sama seperti pada tugas standar.
BatchTaskConstraints untuk tugas multiinstans, seperti properti MaxTaskRetryCount, MaxWallClockTime, dan RetentionTime, diberlakukan sebagaimana pada tugas standar, dan berlaku untuk tugas utama serta semua subtugas. Namun, jika Anda mengubah properti RetentionTime setelah menambahkan tugas multi-instance ke dalam pekerjaan, perubahan ini hanya diterapkan pada tugas utama, dan semua sub-tugas akan terus menggunakan RetentionTime asli.
Daftar tugas terbaru dari node komputasi mencerminkan ID dari subtugas jika tugas terbaru tersebut merupakan bagian dari tugas multi-instance.
Dapatkan informasi tentang subtugas
Untuk memperoleh informasi mengenai subtugas menggunakan pustaka Azure.Compute.Batch, panggil metode BatchClient.GetTaskSubTasks. Metode ini mengembalikan informasi tentang semua subtugas, dan informasi tentang node komputasi yang menjalankan tugas tersebut. Dari informasi ini, Anda dapat menentukan direktori root setiap subtask, ID pool, status saat ini, kode keluar, dan lainnya. Anda dapat menggunakan informasi ini dalam kombinasi dengan metode BatchClient.GetNodeFile untuk mendapatkan file subtugas. Perhatikan bahwa metode ini tidak mengembalikan informasi untuk tugas utama (ID 0).
Note
Kecuali dinyatakan lain, metode Azure.Compute.Batch yang beroperasi pada BatchTask multi-instans itu sendiri hanya berlaku untuk tugas utama. Misalnya, saat Anda memanggil GetTaskFiles metode pada tugas multi-instans, hanya file tugas utama yang dikembalikan.
Cuplikan kode berikut menunjukkan cara mendapatkan informasi sub-tugas, serta meminta isi file dari node tempat mereka dijalankan.
// Obtain the multi-instance task from the Batch service
BatchTask myMultiInstanceTask = await batchClient.GetTaskAsync("mybatchjob", "mymultiinstancetask");
_ = myMultiInstanceTask;
// Now iterate over the subtasks for the task and print their stdout and stderr
// output if the subtask has completed
await foreach (BatchSubtask subtask in batchClient.GetSubTasksAsync("mybatchjob", "mymultiinstancetask"))
{
Console.WriteLine("subtask: {0}", subtask.Id);
Console.WriteLine("exit code: {0}", subtask.ExitCode);
if (subtask.State == BatchSubtaskState.Completed)
{
BatchNode node = await batchClient.GetNodeAsync(
subtask.NodeInfo.PoolId,
subtask.NodeInfo.NodeId);
BinaryData stdOut = await batchClient.GetNodeFileAsync(
subtask.NodeInfo.PoolId, node.Id, $"{subtask.NodeInfo.TaskRootDirectory}/stdout.txt");
BinaryData stdErr = await batchClient.GetNodeFileAsync(
subtask.NodeInfo.PoolId, node.Id, $"{subtask.NodeInfo.TaskRootDirectory}/stderr.txt");
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);
}
}
Contoh kode
Contoh kode MultiInstanceTasks di GitHub menunjukkan cara menggunakan tugas multi-instance untuk menjalankan aplikasi MS-MPI pada node komputasi Batch. Ikuti langkah-langkah di bawah ini untuk menjalankan contoh.
Persiapan
- Unduh penginstal MS-MPI SDK dan Redist dan pasanglah. Setelah instalasi, Anda dapat memverifikasi bahwa variabel lingkungan MS-MPI telah diatur.
- Buat versi Release dari contoh program MPI bernama MPIHelloWorld. Ini adalah program yang akan dijalankan pada node komputasi oleh tugas multi-instance.
- Buat file zip yang berisi
MPIHelloWorld.exe(yang Anda buat di langkah 2) danMSMpiSetup.exe(yang Anda unduh di langkah 1). Anda akan mengunggah file zip ini sebagai paket aplikasi di langkah berikutnya. - Gunakan Azure portal untuk membuat Batch aplikasi yang dinamakan "MPIHelloWorld", dan tentukan berkas zip yang Anda buat pada langkah sebelumnya sebagai versi "1.0" dari paket aplikasi tersebut. Lihat Unggah dan kelola aplikasi untuk informasi lebih lanjut.
Tip
Membangun versi Release dari MPIHelloWorld.exe memastikan bahwa Anda tidak perlu menyertakan dependensi tambahan apa pun (misalnya, msvcp140d.dll atau vcruntime140d.dll) dalam paket aplikasi Anda.
Execution
Unduh file .zip azure-batch-samples dari GitHub.
Buka solusi MultiInstanceTasks di Visual Studio 2019. File
MultiInstanceTasks.slnsolusi terletak di:azure-batch-samples\CSharp\ArticleProjects\MultiInstanceTasks\Masukkan kredensial akun Batch dan Storage Anda ke dalam
AccountSettings.settingspada proyek Microsoft.Azure.Batch.Samples.Common.Membangun dan menjalankan solusi MultiInstanceTasks untuk melaksanakan aplikasi contoh MPI pada node komputasi dalam satu pool Batch.
Opsional: Gunakan portal Azure atau Batch Explorer untuk memeriksa kumpulan contoh, pekerjaan, dan tugas ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") sebelum Anda menghapus sumber daya tersebut.
Tip
Anda dapat mengunduh Visual Studio Community secara gratis jika Anda belum memiliki Visual Studio.
Output dari MultiInstanceTasks.exe mirip dengan yang berikut ini:
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...
Langkah berikutnya
- Baca selengkapnya tentang dukungan MPI untuk Linux di Azure Batch.
- Pelajari cara buat kumpulan simpul komputasi Linux untuk digunakan dalam solusi MPI Azure Batch Anda.