このドキュメントでは、Message Passing Interface(MPI)ライブラリを使用して、異なる VM 間で相互に通信する密結合タスクでバッチジョブを構成する方法について説明します。
バッチジョブの場合、結合によって相互依存タスクが記述されます。これは、ジョブの parallelism
フィールドを使用して、(順次ではなく)並列に実行できるタスクの数を構成する方法に影響します。タスクは、次のタイプの結合を使用して記述できます。
- 疎結合タスク: 独立して実行できるタスク。
- 密結合タスク: 実行するのに相互に依存するタスク。
必要に応じて、MPI ライブラリを使用するジョブを作成して、異なる VM インスタンス間で密結合タスクが相互に通信できるようにします。MPI の一般的なユースケースは、密結合のハイ パフォーマンス コンピューティング(HPC)ワークロードです。
始める前に
- Batch を以前に使用したことがない場合は、Batch を使ってみるを確認し、プロジェクトとユーザーの前提条件を完了して Batch を有効にします。
-
ジョブの作成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
-
プロジェクトのバッチジョブ編集者(
roles/batch.jobsEditor
) -
ジョブのサービス アカウントのサービス アカウント ユーザー(
roles/iam.serviceAccountUser
)。これは、デフォルトでは Compute Engine のデフォルトのサービス アカウントです。
ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
-
プロジェクトのバッチジョブ編集者(
- このジョブのネットワークを指定する場合は、ネットワークにジョブの VM 間の接続を許可するファイアウォール ルールがあることを確認してください。一般的なユースケースに対応した VPC ファイアウォール ルールを構成する方法をご覧ください。
密結合タスクに対して MPI を使用するジョブを作成して実行する
このセクションでは、MPI を使用できるジョブを作成する方法の例を示します。特に、サンプルジョブには 3 つの実行可能物があります。
- 1 つ目の実行可能物は、同時マルチスレッディングを無効にし、Intel MPI をインストールして MPI 用のジョブを準備するスクリプトです。
- 2 つ目の実行可能物は空のバリア実行可能物(
{ "barrier": {} }
形式)であり、これによって、先の実行可能物に続ける前に、すべてのタスクで MPI の設定を確実に完了できます。 - 3 つ目の実行可能物(とあらゆる後続の実行可能物)は、ジョブのワークロードに対して使用できます。
gcloud CLI または Batch API を使用して、密結合タスクに対して MPI を使用するジョブを作成できます。
gcloud
gcloud CLI を使用して、密結合タスクに対して MPI を使用するスクリプト ジョブを作成するには、次のようにします。
JSON 構成ファイルを作成し、次の内容を追加します。
{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;" } }, { "barrier": {} }, { "script": { SCRIPT } } ] }, "taskCount": TASK_COUNT, "taskCountPerNode": TASK_COUNT_PER_NODE, "requireHostsFile": REQUIRE_HOSTS_FILE, "permissiveSsh": PERMISSIVE_SSH } ] }
以下を置き換えます。
SCRIPT
: MPI を使用するワークロードに対して実行可能なスクリプト。TASK_COUNT
: ジョブのタスクの数。値は1
とタスクグループあたりのタスク数の上限の間の整数である必要があります。Batch が提供する MPI ライブラリを使用するには、このフィールドは必須であり、2
以上に設定する必要があります。TASK_COUNT_PER_NODE
: ジョブが VM インスタンスで同時に実行できるタスクの数。Batch が提供する MPI ライブラリを使用するには、このフィールドは必須であり、1
に設定する必要があります。これは、タスクごとに 1 つの VM インスタンスを実行する場合と同じです。REQUIRE_HOSTS_FILE
:true
に設定すると、ジョブはタスクグループで実行中の VM インスタンスをリストしたファイルを作成します。ファイルパスはBATCH_HOSTS_FILE
環境変数に格納されます。Batch が提供する MPI ライブラリを使用するには、このフィールドを true に設定する必要があります。PERMISSIVE_SSH
:true
に設定すると、タスクグループで実行されている VM インスタンス間でパスワードなしの通信を許可するように、Batch は SSH を構成します。Batch が提供する MPI ライブラリを使用するには、このフィールドを true に設定する必要があります。
ジョブを作成するには、
gcloud batch jobs submit
コマンドを使用します。gcloud batch jobs submit JOB_NAME \ --location LOCATION \ --config JSON_CONFIGURATION_FILE
以下を置き換えます。
JOB_NAME
: ジョブの名前。LOCATION
: ジョブのロケーション。JSON_CONFIGURATION_FILE
: ジョブの構成の詳細を含む JSON ファイルへのパス。
必要に応じて、以下を行うことにより、Batch によって提供される MPI ライブラリのパフォーマンスを向上させることができます。
- VM インスタンス テンプレートを使用してジョブを作成、実行し、ジョブのリソースに HPC 対応 VM インスタンス テンプレートを指定します。
- ジョブのリソースで、ジョブのログ情報の宛先として Cloud Logging を指定します。
たとえば、MPI を使用し、1 つのタスクにタスクグループ内の 3 つのタスクのホスト名を出力させるインスタンス テンプレートからスクリプト ジョブを作成するには、次のようにします。
example-job-uses-mpi.json
という名前の現在のディレクトリに、次の内容の JSON ファイルを作成します。{ "taskGroups": [ { "taskSpec": { "runnables": [ { "script": { "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;" } }, { "barrier": {} }, { "script": { "text": "if [ $BATCH_TASK_INDEX = 0 ]; then mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname; fi" } }, { "barrier": {} } ] }, "taskCount": 3, "taskCountPerNode": 1, "requireHostsFile": true, "permissiveSsh": true } ], "allocationPolicy": { "instances": [ { "instanceTemplate": "example-template-job-uses-mpi" } ] }, "logsPolicy": { "destination": "CLOUD_LOGGING" } }
次のコマンドを実行します。
gcloud batch jobs submit example-template-job-uses-mpi \ --location us-central1 \ --config example-job-uses-mpi.json
API
Batch API を使用して MPI で密結合タスクのためにスクリプト ジョブを作成するには、jobs.create
メソッドを使用して、permissiveSsh
、requireHostsFile
、taskCount
、taskCountPerNode
フィールドを指定します。
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_ID
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
}
},
{ "barrier": {} },
{
"script": {
SCRIPT
}
}
]
},
"taskCount": TASK_COUNT,
"taskCountPerNode": TASK_COUNT_PER_NODE,
"requireHostsFile": REQUIRE_HOSTS_FILE,
"permissiveSsh": PERMISSIVE_SSH
}
]
}
以下を置き換えます。
PROJECT_ID
: プロジェクトのプロジェクト IDLOCATION
: ジョブのロケーション。JOB_NAME
: ジョブの名前。SCRIPT
: MPI を使用するワークロードに対して実行可能なスクリプト。TASK_COUNT
: ジョブのタスクの数。値は、1
とタスク グループあたりのタスク数の上限の間の整数にする必要があります。Batch が提供する MPI ライブラリを使用するには、このフィールドは必須であり、2
以上に設定する必要があります。TASK_COUNT_PER_NODE
: ジョブが VM インスタンスで同時に実行できるタスクの数。Batch が提供する MPI ライブラリを使用するには、このフィールドは必須であり、1
に設定する必要があります。これは、タスクごとに 1 つの VM インスタンスを実行する場合と同じです。REQUIRE_HOSTS_FILE
:true
に設定すると、ジョブはタスクグループで実行中の VM インスタンスをリストしたファイルを作成します。ファイルパスはBATCH_HOSTS_FILE
環境変数に格納されます。Batch が提供する MPI ライブラリを使用するには、このフィールドを true に設定する必要があります。PERMISSIVE_SSH
:true
に設定すると、タスクグループで実行されている VM インスタンス間でパスワードなしの通信を許可するように、Batch は SSH を構成します。Batch が提供する MPI ライブラリを使用するには、このフィールドを true に設定する必要があります。
必要に応じて、以下を行うことにより、Batch によって提供される MPI ライブラリのパフォーマンスを向上させることができます。
- VM インスタンス テンプレートを使用してジョブを作成、実行し、ジョブのリソースに HPC 対応 VM インスタンス テンプレートを指定します。
- ジョブのリソースで、ジョブのログ情報の宛先として Cloud Logging を指定します。
たとえば、MPI を使用し、1 つのタスクにタスクグループ内の 3 つのタスクのホスト名を出力させるインスタンス テンプレートからスクリプト ジョブを作成するには、次のリクエストを使用します。
POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs?job_id=example-template-job-uses-mpi
{
"taskGroups": [
{
"taskSpec": {
"runnables": [
{
"script": {
"text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
}
},
{ "barrier": {} },
{
"script": {
"text":
"if [ $BATCH_TASK_INDEX = 0 ]; then
mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
fi"
}
},
{ "barrier": {} }
]
},
"taskCount": 3,
"taskCountPerNode": 1,
"requireHostsFile": true,
"permissiveSsh": true
}
],
"allocationPolicy": {
"instances": [
{
"instanceTemplate": "example-template-job-uses-mpi"
}
]
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
PROJECT_ID
はプロジェクトのプロジェクト ID です。
次のステップ
- 密結合タスクに MPI を使用するジョブのより詳細な例については、Batch での気象調査と予測モデルの実行をご覧ください。
- タスクの密結合でジョブのレイテンシを削減する方法を学習する。
- ジョブの作成または実行に問題がある場合は、トラブルシューティングをご覧ください。
- ジョブとタスクを表示する。
- 別のジョブ作成オプションを学習する。