Batch でのマルチインスタンス タスクを使用した Message Passing Interface (MPI) アプリケーションの実行Use multi-instance tasks to run Message Passing Interface (MPI) applications in Batch

マルチインスタンス タスクでは、Azure Batch タスクを複数のコンピューティング ノードで同時に実行できます。Multi-instance tasks allow you to run an Azure Batch task on multiple compute nodes simultaneously. これらのタスクにより、Batch での Message Passing Interface (MPI) アプリケーションのようなハイ パフォーマンス コンピューティングのシナリオが可能になります。These tasks enable high performance computing scenarios like Message Passing Interface (MPI) applications in Batch. この記事では、Batch .NET ライブラリを使用してマルチインスタンス タスクを実行する方法について説明します。In this article, you learn how to execute multi-instance tasks using the Batch .NET library.

注意

この記事では、Batch .NET、MS-MPI、および Windows コンピューティング ノードの例をあげていますが、ここで説明するマルチインスタンス タスクは、他のプラットフォームとテクノロジ (たとえば Linux ノードの Python および Intel MP) にも適用できます。While the examples in this article focus on Batch .NET, MS-MPI, and Windows compute nodes, the multi-instance task concepts discussed here are applicable to other platforms and technologies (Python and Intel MPI on Linux nodes, for example).

マルチインスタンス タスクの概要Multi-instance task overview

Batch では、通常、各タスクは単一のコンピューティング ノードで実行されます。複数のタスクをジョブに送信すると、Batch サービスによってノードで実行する各タスクがスケジュールされます。In Batch, each task is normally executed on a single compute node--you submit multiple tasks to a job, and the Batch service schedules each task for execution on a node. ただし、代わりにタスクのマルチインスタンス設定を構成することで、Batch で 1 つのプライマリ タスクといくつかのサブタスクを作成し、それらを複数のノード上で実行することが可能になります。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.

マルチインスタンス タスクの概要Multi-instance task overview

マルチインスタンス設定が構成されているタスクをジョブに送信すると、Batch によってマルチインスタンス タスク固有の次の手順が実行されます。When you submit a task with multi-instance settings to a job, Batch performs several steps unique to multi-instance tasks:

  1. Batch サービスは、マルチインスタンス設定に基づき、1 つのプライマリ タスクといくつかのサブタスクを作成します。The Batch service creates one primary and several subtasks based on the multi-instance settings. タスクの合計数 (プライマリ タスクとすべてのサブタスクの合計) は、マルチインスタンス設定に指定したインスタンスの数 (コンピューティングノード) の数と一致します。The total number of tasks (primary plus all subtasks) matches the number of instances (compute nodes) you specify in the multi-instance settings.
  2. Batch は、いずれかのコンピューティング ノードをマスター ノードと指定し、マスター ノード上でプライマリ タスクを実行するようにスケジュールします。Batch designates one of the compute nodes as the master, and schedules the primary task to execute on the master. サブタスクは、マルチインスタンス タスクに割り当てられたコンピューティング ノードのマスター以外のノード上で、ノードごとに 1 つのサブタスクが実行されるようにスケジュールされます。It schedules the subtasks to execute on the remainder of the compute nodes allocated to the multi-instance task, one subtask per node.
  3. プライマリ タスクとすべてのサブタスクが、マルチインスタンス設定に指定された 共通リソース ファイルをダウンロードします。The primary and all subtasks download any common resource files you specify in the multi-instance settings.
  4. 共通リソース ファイルをダウンロードした後、マルチインスタンス設定に指定された調整コマンドが、プライマリ タスクとサブタスクで実行されます。After the common resource files have been downloaded, the primary and subtasks execute the coordination command you specify in the multi-instance settings. 調整コマンドは、通常は、タスクを実行できるようにノードを準備するために使用されます。The coordination command is typically used to prepare nodes for executing the task. バックグラウンド サービス (Microsoft MPIsmpd.exe など) の開始や、ノードがノード間メッセージを処理する準備ができていることの確認を行うコマンドを指定できます。This can include starting background services (such as Microsoft MPI's smpd.exe) and verifying that the nodes are ready to process inter-node messages.
  5. プライマリ タスクとすべてのサブタスクで調整コマンドが "正常に完了した後"、プライマリ タスクがマスター ノード上でアプリケーション コマンドを実行します。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. MS-MPI ベースのソリューションでは、このコマンド ラインで mpiexec.exe を使用して MPI 対応アプリケーションを実行します。In an MS-MPI-based solution, this is where you execute your MPI-enabled application using mpiexec.exe.

注意

"マルチインスタンス タスク" は機能的には異なりますが、StartTaskJobPreparationTask のような一意のタスクの種類ではありません。Though it is functionally distinct, the "multi-instance task" is not a unique task type like the StartTask or JobPreparationTask. マルチインスタンス タスクは、マルチインスタンス設定が構成されている標準の Batch タスク (Batch .NET の CloudTask) です。The multi-instance task is simply a standard Batch task (CloudTask in Batch .NET) whose multi-instance settings have been configured. この記事では、これを マルチインスタンス タスクと呼んでいます。In this article, we refer to this as the multi-instance task.

マルチインスタンス タスクの要件Requirements for multi-instance tasks

マルチインスタンス タスクには、ノード間通信が有効であり、同時実行タスクの実行が無効になっているプールが必要です。Multi-instance tasks require a pool with inter-node communication enabled, and with concurrent task execution disabled. 同時実行タスクの実行を無効にするには、CloudPool.MaxTasksPerComputeNode プロパティを 1 に設定します。To disable concurrent task execution, set the CloudPool.MaxTasksPerComputeNode property to 1.

注意

Batch は、ノード間通信が有効になっているプールのサイズを制限します。Batch limits the size of a pool that has inter-node communication enabled.

このコード スニペットでは、Batch .NET ライブラリを使用してマルチインスタンス タスクのプールを作成する方法を示します。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",
        cloudServiceConfiguration: new CloudServiceConfiguration(osFamily: "5"));

// Multi-instance tasks require inter-node communication, and those nodes
// must run only one task at a time.
myCloudPool.InterComputeNodeCommunicationEnabled = true;
myCloudPool.MaxTasksPerComputeNode = 1;

注意

ノード間通信が無効になっている ( maxTasksPerNode 値が 1 より大きい) プールでマルチインスタンス タスクを実行しようとしても、タスクはスケジュールされず、いつまでも "アクティブ" 状態のままになります。If you try to run a multi-instance task in a pool with internode communication disabled, or with a maxTasksPerNode value greater than 1, the task is never scheduled--it remains indefinitely in the "active" state.

StartTask を使用した MPI のインストールUse a StartTask to install MPI

MPI アプリケーションをマルチインスタンス タスクで実行するには、まず、プール内のコンピューティング ノードに MPI 実装 (例: MS-MPI または Intel 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. StartTask を使用するのに適した機会です。StartTask は、ノードがプールに参加するたびに実行され、ノードの再起動時にも実行されます。This is a good time to use a StartTask, which executes whenever a node joins a pool, or is restarted. 次のコード スニペットでは、リソース ファイルとして MS-MPI セットアップ パッケージを指定する StartTask を作成しています。This code snippet creates a StartTask that specifies the MS-MPI setup package as a resource file. このスタート タスクのコマンド ラインは、リソース ファイルがノードにダウンロードされた後で実行されます。The start task's command line is executed after the resource file is downloaded to the node. この場合、コマンド ラインにより MS-MPI の無人インストールが実行されます。In this case, the command line performs an unattended install of MS-MPI.

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

リモート ダイレクト メモリ アクセス (RDMA)Remote direct memory access (RDMA)

Batch プールのコンピューティング ノードのサイズとして RDMA 対応サイズ (A9 など) を選択した場合、MPI アプリケーションは Azure の高パフォーマンスで待機時間の短いリモート ダイレクト メモリ アクセス (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.

次の記事で、"RDMA 対応" として指定されたサイズを確認してください。Look for the sizes specified as "RDMA capable" in the following articles:

注意

Linux のコンピューティング ノードで RDMA を利用するには、ノード上で Intel MPI を使用する必要があります。To take advantage of RDMA on Linux compute nodes, you must use Intel MPI on the nodes.

Batch .NET を使用したマルチインスタンス タスクの作成Create a multi-instance task with Batch .NET

プールの要件と MPI パッケージのインストールについて説明しました。次に、マルチインスタンス タスクを作成します。Now that we've covered the pool requirements and MPI package installation, let's create the multi-instance task. 次のスニペットでは、標準の CloudTask を作成し、MultiInstanceSettings プロパティを構成しています。In this snippet, we create a standard CloudTask, then configure its MultiInstanceSettings property. 前述のように、マルチインスタンス タスクはタスクの種類ではなく、マルチインスタンス設定で構成された標準の Batch タスクです。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. タスクをジョブに送信すると、Batch サービスによって、1 つのプライマリ タスクと、指定したノードの数に対応する十分な数のサブタスクが作成されます。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.

これらのタスクには、0 ~ numberOfInstances - 1の範囲の整数 ID が割り当てられます。These tasks are assigned an integer id in the range of 0 to numberOfInstances - 1. ID が 0 のタスクがプライマリ タスクで、他のすべての ID がサブタスクです。The task with id 0 is the primary task, and all other ids are subtasks. たとえば、タスクに対して次のマルチインスタンス設定を作成した場合、プライマリ タスクには ID として 0 が割り当てられ、サブタスクには 1 ~ 9 が割り当てられます。For example, if you create the following multi-instance settings for a task, the primary task would have an id of 0, and the subtasks would have ids 1 through 9.

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

マスター ノードMaster node

マルチインスタンス タスクを送信すると、Batch サービスによって、いずれかのコンピューティング ノードがマスター ノードと指定され、マスター ノード上でプライマリ タスクを実行するようにスケジュールされます。When you submit a multi-instance task, the Batch service designates one of the compute nodes as the "master" node, and schedules the primary task to execute on the master node. サブタスクは、マルチインスタンス タスクに割り当てられたマスター以外のノード上で実行されるようにスケジュールされます。The subtasks are scheduled to execute on the remainder of the nodes allocated to the multi-instance task.

調整コマンドCoordination command

調整コマンド は、プライマリ タスクとサブタスクの両方で実行されます。The coordination command is executed by both the primary and subtasks.

調整コマンドの呼び出しはブロックされています。すべてのサブタスクで調整コマンドから正常に制御が返されるまで、アプリケーション コマンドは実行されません。The invocation of the coordination command is blocking--Batch does not execute the application command until the coordination command has returned successfully for all subtasks. そのため、調整コマンドは必要なバックグラウンド サービスを開始し、それらのサービスの使用準備ができていることを確認してから終了する必要があります。The coordination command should therefore start any required background services, verify that they are ready for use, and then exit. たとえば、MS-MPI バージョン 7 を使用するソリューションの次の調整コマンドは、ノードで SMPD サービスを開始してから終了します。For example, this coordination command for a solution using MS-MPI version 7 starts the SMPD service on the node, then exits:

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

この調整コマンドでは、 start を使用していることに注意してください。Note the use of start in this coordination command. smpd.exe アプリケーションは実行後すぐに制御を返さないため、これが必須となります。This is required because the smpd.exe application does not return immediately after execution. start コマンドを使用していない場合、この調整コマンドは制御を返さないため、アプリケーション コマンドを実行できません。Without the use of the start command, this coordination command would not return, and would therefore block the application command from running.

アプリケーション コマンドApplication command

プライマリ タスクとすべてのサブタスクで調整コマンドの実行が完了すると、マルチインスタンス タスクのコマンド ラインがプライマリ タスクで " のみ" 実行されます。Once the primary task and all subtasks have finished executing the coordination command, the multi-instance task's command line is executed by the primary task only. 調整コマンドと区別するために、これを アプリケーション コマンド と呼びます。We call this the application command to distinguish it from the coordination command.

MS-MPI アプリケーションでは、アプリケーション コマンドを使用して、 mpiexec.exeで MPI 対応のアプリケーションを実行します。For MS-MPI applications, use the application command to execute your MPI-enabled application with mpiexec.exe. たとえば、MS-MPI バージョン 7 を使用するソリューションのアプリケーション コマンドは、次のようになります。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

注意

MS-MPI の mpiexec.exe は既定で CCP_NODES 変数を使用するため (「環境変数」を参照)、上記のアプリケーション コマンド ラインの例では、この変数が除外されています。Because MS-MPI's mpiexec.exe uses the CCP_NODES variable by default (see Environment variables) the example application command line above excludes it.

環境変数Environment variables

Batch は、マルチインスタンス タスク固有の複数の環境変数 を、マルチインスタンス タスクに割り当てられたコンピューティング ノード上に作成します。Batch creates several environment variables specific to multi-instance tasks on the compute nodes allocated to a multi-instance task. 調整コマンド ラインとアプリケーション コマンド ラインは、これらの環境変数、スクリプト、および実行するプログラムを参照できます。Your coordination and application command lines can reference these environment variables, as can the scripts and programs they execute.

Batch サービスによって、マルチインスタンス タスクで使用される次の環境変数が作成されます。The following environment variables are created by the Batch service for use by multi-instance tasks:

  • 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

これらの変数とその他の Batch コンピューティング ノードの環境変数のコンテンツと可視性を含む詳細については、コンピューティング ノードの環境変数に関する記事をご覧ください。For full details on these and the other Batch compute node environment variables, including their contents and visibility, see Compute node environment variables.

ヒント

Batch Linux MPI コード サンプルには、さまざまな環境変数をどのように使用できるかの例が含まれています。The Batch Linux MPI code sample contains an example of how several of these environment variables can be used. coordination-cmd Bash スクリプトは、共通アプリケーションと入力ファイルを Azure Storage からダウンロードし、Network File System (NFS) 共有をマスター ノード上で有効にし、マルチインスタンス タスクに割り当てられているその他のノードを NFS クライアントとして構成します。The coordination-cmd Bash script downloads common application and input files from Azure Storage, enables a Network File System (NFS) share on the master node, and configures the other nodes allocated to the multi-instance task as NFS clients.

リソース ファイルResource files

マルチインスタンス タスクには、考慮すべきリソース ファイルのセットが 2 つあります。"すべてのタスク" (プライマリ タスクとサブタスクの両方) でダウンロードされる共通リソース ファイルと、マルチインスタンス タスク自体に指定され、"プライマリ タスクでのみ" ダウンロードされるリソース ファイルです。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.

タスクのマルチインスタンス設定で 1 つ以上の 共通リソース ファイル を指定できます。You can specify one or more common resource files in the multi-instance settings for a task. これらの共通リソース ファイルは、プライマリ タスクとすべてのサブタスクで、Azure Storage から各ノードのタスク共有ディレクトリにダウンロードされます。These common resource files are downloaded from Azure Storage into each node's task shared directory by the primary and all subtasks. タスク共有ディレクトリには、 AZ_BATCH_TASK_SHARED_DIR 環境変数を使用して、アプリケーション コマンド ラインと調整コマンド ラインからアクセスできます。You can access the task shared directory from application and coordination command lines by using the AZ_BATCH_TASK_SHARED_DIR environment variable. AZ_BATCH_TASK_SHARED_DIR パスは、マルチインスタンス タスクに割り当てられたすべてのノードで同じであり、そのため、プライマリ タスクとすべてのサブタスクで 1 つの調整コマンドを共有できます。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 は、リモート アクセスという意味ではディレクトリを "共有" しませんが、環境変数に関するヒントとして示したように、マウントまたは共有ポイントとして使用できます。Batch does not "share" the directory in a remote access sense, but you can use it as a mount or share point as mentioned earlier in the tip on environment variables.

マルチインスタンス タスク自体に指定したリソース ファイルは、既定では、タスクの作業ディレクトリである AZ_BATCH_TASK_WORKING_DIR にダウンロードされます。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. 既に説明したように、共通リソース ファイルとは異なり、マルチインスタンス タスク自体に指定したリソース ファイルは、プライマリ タスクのみがダウンロードします。As mentioned, in contrast to common resource files, only the primary task downloads resource files specified for the multi-instance task itself.

重要

コマンド ラインでこれらのディレクトリを参照するときは、環境変数 AZ_BATCH_TASK_SHARED_DIRAZ_BATCH_TASK_WORKING_DIR を常に使用します。Always use the environment variables AZ_BATCH_TASK_SHARED_DIR and AZ_BATCH_TASK_WORKING_DIR to refer to these directories in your command lines. パスを手動で作成しないでください。Do not attempt to construct the paths manually.

タスクの有効期間Task lifetime

プライマリ タスクの有効期間によって、マルチインスタンス タスク全体の有効期間が制御されます。The lifetime of the primary task controls the lifetime of the entire multi-instance task. プライマリ タスクが終了すると、すべてのサブタスクが終了します。When the primary exits, all of the subtasks are terminated. プライマリ タスクの終了コードがタスクの終了コードになるため、再試行のためにタスクが成功したかどうかを判断する際に使用されます。The exit code of the primary is the exit code of the task, and is therefore used to determine the success or failure of the task for retry purposes.

サブタスクのいずれかが失敗した場合 (ゼロ以外のリターン コードでの終了など)、マルチインスタンス タスク全体が失敗します。If any of the subtasks fail, exiting with a non-zero return code, for example, the entire multi-instance task fails. この場合、マルチインスタンス タスクが終了し、再試行制限回数に達するまで再試行されます。The multi-instance task is then terminated and retried, up to its retry limit.

マルチインスタンス タスクを削除すると、Batch サービスによってプライマリ タスクとすべてのサブタスクも削除されます。When you delete a multi-instance task, the primary and all subtasks are also deleted by the Batch service. 標準タスクの場合と同様に、サブタスクのすべてのディレクトリとファイルがコンピューティング ノードから削除されます。All subtask directories and their files are deleted from the compute nodes, just as for a standard task.

マルチインスタンス タスクの TaskConstraints (MaxTaskRetryCountMaxWallClockTimeRetentionTime の各プロパティなど) は、標準タスクの場合と同様に優先され、プライマリ タスクとすべてのサブタスクに適用されます。TaskConstraints for a multi-instance task, such as the MaxTaskRetryCount, MaxWallClockTime, and RetentionTime properties, are honored as they are for a standard task, and apply to the primary and all subtasks. ただし、マルチインスタンス タスクをジョブに追加した後に RetentionTime プロパティを変更した場合、この変更はプライマリ タスクにのみ適用されます。However, if you change the RetentionTime property after adding the multi-instance task to the job, this change is applied only to the primary task. すべてのサブタスクで引き続き元の RetentionTime が使用されます。All of the subtasks continue to use the original RetentionTime.

最近のタスクがマルチインスタンス タスクの一部である場合、コンピューティング ノードの最近のタスク リストにそのサブタスクの ID が示されます。A compute node's recent task list reflects the id of a subtask if the recent task was part of a multi-instance task.

サブタスクに関する情報の取得Obtain information about subtasks

Batch .NET ライブラリを使用してサブタスクの情報を取得するには、CloudTask.ListSubtasks メソッドを呼び出します。To obtain information on subtasks by using the Batch .NET library, call the CloudTask.ListSubtasks method. このメソッドは、すべてのサブタスクの情報と、それらのタスクが実行されたコンピューティング ノードの情報を返します。This method returns information on all subtasks, and information about the compute node that executed the tasks. この情報から、各サブタスクのルート ディレクトリ、プール ID、現在の状態、終了コードなどを確認できます。From this information, you can determine each subtask's root directory, the pool id, its current state, exit code, and more. この情報を PoolOperations.GetNodeFile メソッドと共に使用して、サブタスクのファイルを取得できます。You can use this information in combination with the PoolOperations.GetNodeFile method to obtain the subtask's files. このメソッドは、プライマリ タスク (ID 0) の情報を返さないことに注意してください。Note that this method does not return information for the primary task (id 0).

注意

特に記載のない限り、CloudTask マルチインスタンス自体に影響する Batch .NET のメソッドは、プライマリ タスクに "のみ" 適用されます。Unless otherwise stated, Batch .NET methods that operate on the multi-instance CloudTask itself apply only to the primary task. たとえば、マルチインスタンス タスクで CloudTask.ListNodeFiles メソッドを呼び出すと、プライマリ タスクのファイルだけが返されます。For example, when you call the CloudTask.ListNodeFiles method on a multi-instance task, only the primary task's files are returned.

次のコード スニペットは、サブタスクの情報と、サブタスクが実行されたノードの要求ファイルの内容を取得する方法を示しています。The following code snippet shows how to obtain subtask information, as well as request file contents from the nodes on which they executed.

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

サンプル コードCode sample

GitHub の MultiInstanceTasks コード サンプルでは、マルチインスタンス タスクを使用して Batch 計算ノード上で MS-MPI アプリケーションを実行する方法を紹介しています。The MultiInstanceTasks code sample on GitHub demonstrates how to use a multi-instance task to run an MS-MPI application on Batch compute nodes. 準備」セクションと「実行」セクションの手順に従い、サンプルを実行してください。Follow the steps in Preparation and Execution to run the sample.

準備Preparation

  1. 単純な MS-MPI プログラムのコンパイルと実行の方法」の最初の 2 つの手順に従います。Follow the first two steps in How to compile and run a simple MS-MPI program. これで、次の手順の前提条件が満たされます。This satisfies the prerequisites for the following step.
  2. MPIHelloWorld サンプル MPI プログラムの "リリース" バージョンをビルドします。Build a Release version of the MPIHelloWorld sample MPI program. このプログラムは、マルチインスタンス タスクによりコンピューティング ノードで実行されます。This is the program that will be run on compute nodes by the multi-instance task.
  3. MPIHelloWorld.exe (手順 2. でビルドしたもの) と MSMpiSetup.exe (手順 1. でダウンロードしたもの) を含む zip ファイルを作成します。Create a zip file containing MPIHelloWorld.exe (which you built step 2) and MSMpiSetup.exe (which you downloaded step 1). この zip ファイルは、次の手順でアプリケーション パッケージとしてアップロードします。You'll upload this zip file as an application package in the next step.
  4. Azure Portal を使用して "MPIHelloWorld" という名前の Batch アプリケーションを作成し、前の手順で作成した zip ファイルをアプリケーション パッケージのバージョン "1.0" として指定します。Use the Azure portal to create a Batch application called "MPIHelloWorld", and specify the zip file you created in the previous step as version "1.0" of the application package. 詳細については、「アプリケーションのアップロードと管理」を参照してください。See Upload and manage applications for more information.

ヒント

アプリケーション パッケージに追加の依存関係 (たとえば msvcp140d.dll または vcruntime140d.dll) を含める必要がないように、MPIHelloWorld.exe の "リリース" バージョンをビルドします。Build a Release version of MPIHelloWorld.exe so that you don't have to include any additional dependencies (for example, msvcp140d.dll or vcruntime140d.dll) in your application package.

ExecutionExecution

  1. GitHub から azure-batch-samples をダウンロードします。Download the azure-batch-samples from GitHub.

  2. Visual Studio 2019 で MultiInstanceTasks ソリューションを開きます。Open the MultiInstanceTasks solution in Visual Studio 2019. MultiInstanceTasks.sln ソリューション ファイルの保存先は次のとおりです。The MultiInstanceTasks.sln solution file is located in:

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

  3. Microsoft.Azure.Batch.Samples.Common プロジェクトの AccountSettings.settings に、Batch と Storage のアカウント資格情報を入力します。Enter your Batch and Storage account credentials in AccountSettings.settings in the Microsoft.Azure.Batch.Samples.Common project.

  4. MultiInstanceTasks ソリューションをビルドおよび実行して、Batch プール内のコンピューティング ノード上で MPI サンプル アプリケーションを実行します。Build and run the MultiInstanceTasks solution to execute the MPI sample application on compute nodes in a Batch pool.

  5. 省略可能: Azure portal または Batch Explorer を使用して、リソースを削除する前に、サンプル プール、ジョブ、タスク ("MultiInstanceSamplePool"、"MultiInstanceSampleJob"、"MultiInstanceSampleTask") を確認します。Optional: Use the Azure portal or Batch Explorer to examine the sample pool, job, and task ("MultiInstanceSamplePool", "MultiInstanceSampleJob", "MultiInstanceSampleTask") before you delete the resources.

ヒント

Visual Studio をお持ちでない場合は、Visual Studio Community を無料でダウンロードできます。You can download Visual Studio Community for free if you do not have Visual Studio.

MultiInstanceTasks.exe からの出力は、次の例のようになります。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