このドキュメントでは、Message Passing Interface(MPI)ライブラリを使用して、異なる VM 間で相互に通信する密結合タスクで Batch ジョブを構成する方法について説明します。
バッチジョブの場合、結合によって相互依存タスクが記述されます。これは、ジョブの 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 インスタンス間のパスワードなしの通信を許可するように 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 での気象調査と予測モデルの実行をご覧ください。
- タスクの密結合でジョブのレイテンシを削減する方法を学習する。
- ジョブの作成または実行に問題がある場合は、トラブルシューティングをご覧ください。
- ジョブとタスクを表示する。
- 別のジョブ作成オプションを学習する。