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. In this article, you learn how to execute multi-instance tasks using the Batch .NET library.
Note
Meskipun contoh dalam artikel ini berfokus pada Batch .NET, MS-MPI, dan node komputasi Windows, konsep tugas multi-instance yang dibahas di sini juga berlaku untuk platform dan teknologi lainnya (seperti Python dan Intel MPI pada node 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. However, by configuring a task's multi-instance settings, you tell Batch to instead create one primary task and several subtasks that are then executed on multiple nodes.
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 designates one of the compute nodes as the master, and schedules the primary task to execute on the master. It schedules the subtasks to execute on the remainder of the compute nodes allocated to the multi-instance task, one subtask per node.
- Tugas utama dan seluruh sub-tugas mengunduh file sumber daya umum apa pun yang Anda tentukan dalam pengaturan multi-instansi.
- After the common resource files have been downloaded, the primary and subtasks execute the coordination command you specify in the multi-instance settings. 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. - 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. In an MS-MPI -based solution, this is where you execute your MPI-enabled application using
mpiexec.exe.
Catatan
Though it is functionally distinct, the "multi-instance task" is not a unique task type like the StartTask or JobPreparationTask. Tugas multi-instance adalah tugas Batch standar (CloudTask dalam Batch .NET) yang pengaturan multi-instance-nya telah dikonfigurasi. Dalam artikel ini, kami menyebutnya sebagai tugas multi-instance.
Persyaratan untuk tugas multi-instance
Multi-instance tasks require a pool with inter-node communication enabled, and with concurrent task execution disabled. Untuk menonaktifkan eksekusi tugas bersamaan, atur properti CloudPool.TaskSlotsPerNode ke 1.
Note
Batch membatasi ukuran kumpulan yang telah mengaktifkan komunikasi antar-node.
This code snippet shows how to create a pool for multi-instance tasks using the Batch .NET library.
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;
Note
If you try to run a multi-instance task in a pool with internode communication disabled, or with a taskSlotsPerNode value greater than 1, the task is never scheduled--it remains indefinitely in the "active" state.
Pools with InterComputeNodeCommunication enabled will not allow automatically the deprovision of the node.
Use a StartTask to install MPI
To run MPI applications with a multi-instance task, you first need to install an MPI implementation (MS-MPI or Intel MPI, for example) on the compute nodes in the pool. Ini adalah waktu yang baik untuk menggunakan StartTask, yang dieksekusi setiap kali sebuah node bergabung dengan pool, atau ketika di-restart. Cuplikan kode ini membuat StartTask yang menentukan paket pengaturan MS-MPI sebagai berkas 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.
// 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();
Remote direct memory access (RDMA)
When you choose an RDMA-capable size such as A9 for the compute nodes in your Batch pool, your MPI application can take advantage of Azure's high-performance, low-latency remote direct memory access (RDMA) network.
Look for the sizes specified as "RDMA capable" in Sizes for virtual machines in Azure (for VirtualMachineConfiguration pools) or Sizes for Cloud Services (for CloudServicesConfiguration pools).
Catatan
To take advantage of RDMA on Linux compute nodes, you must use Intel MPI on the nodes.
Buat tugas multi-instance dengan Batch .NET
Sekarang setelah kita membahas persyaratan pool dan instalasi paket MPI, mari kita buat tugas multi-instance. In this snippet, we create a standard CloudTask, then configure its MultiInstanceSettings property. As mentioned earlier, the multi-instance task is not a distinct task type, but a standard Batch task configured with multi-instance settings.
// 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);
Primary task and subtasks
When you create the multi-instance settings for a task, you specify the number of compute nodes that are to execute the task. When you submit the task to a job, the Batch service creates one primary task and enough subtasks that together match the number of nodes you specified.
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(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
The coordination command is executed by both the primary and subtasks.
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. For example, here is an application command for a solution using MS-MPI version 7:
cmd /c ""%MSMPI_BIN%\mpiexec.exe"" -c 1 -wdir %AZ_BATCH_TASK_SHARED_DIR% MyMPIApplication.exe
Catatan
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
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.
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. The AZ_BATCH_TASK_SHARED_DIR path is identical on every node allocated to the multi-instance task, thus you can share a single coordination command between the primary and all subtasks. 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.
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. 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.
If any of the subtasks fail, exiting with a non-zero return code, for example, the entire multi-instance task fails. 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.
TaskConstraints untuk tugas multi-instance, seperti properti MaxTaskRetryCount, MaxWallClockTime, dan RetentionTime, dihormati seperti halnya untuk tugas standar, dan berlaku untuk tugas utama dan semua sub-tugas. 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 mendapatkan informasi tentang subtask dengan menggunakan pustaka Batch .NET, panggil metode CloudTask.ListSubtasks. 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 bersama dengan metode PoolOperations.GetNodeFile untuk mendapatkan file dari subtask. Perhatikan bahwa metode ini tidak mengembalikan informasi untuk tugas utama (ID 0).
Catatan
Kecuali dinyatakan lain, metode Batch .NET yang beroperasi pada CloudTask multi-instance itu sendiri hanya berlaku untuk tugas utama. Misalnya, ketika Anda memanggil metode CloudTask.ListNodeFiles pada tugas multi-instance, hanya file dari tugas utama yang dikembalikan.
Cuplikan kode berikut menunjukkan cara mendapatkan informasi sub-tugas, serta meminta isi file dari node tempat mereka dijalankan.
// 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);
}
});
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.
- Create a zip file containing
MPIHelloWorld.exe(which you built in step 2) andMSMpiSetup.exe(which you downloaded in step 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
Download the azure-batch-samples .zip file from GitHub.
Buka solusi MultiInstanceTasks di Visual Studio 2019. The
MultiInstanceTasks.slnsolution file is located in:azure-batch-samples\CSharp\ArticleProjects\MultiInstanceTasks\Enter your Batch and Storage account credentials in
AccountSettings.settingsin the Microsoft.Azure.Batch.Samples.Common project.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
You can download Visual Studio Community for free if you don't already have Visual Studio.
Output from MultiInstanceTasks.exe is similar to the following:
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...
Next steps
- Read more about MPI support for Linux on Azure Batch.
- Learn how to create pools of Linux compute nodes for use in your Azure Batch MPI solutions.