MPI ライブラリを使用してタスク通信を構成する

このドキュメントでは、Message Passing Interface(MPI)ライブラリを使用して、異なる VM 間で相互に通信する密結合タスクで Batch ジョブを構成する方法について説明します。

バッチジョブの場合、結合によって相互依存タスクが記述されます。これは、ジョブの parallelism フィールドを使用して、(順次ではなく)並列に実行できるタスクの数を構成する方法に影響します。タスクは次のタイプの結合を使用して記述できます。

  • 疎結合タスク: 独立して実行できるタスク。
  • 密結合タスク: 実行するのに相互に依存するタスク。

必要に応じて、MPI ライブラリを使用するジョブを作成して、異なる VM インスタンス間で密結合タスクが相互に通信できるようにします。MPI の一般的なユースケースは、密結合なハイ パフォーマンス コンピューティング(HPC)ワークロードです。

始める前に

密結合タスクに対して MPI を使用するジョブを作成して実行する

このセクションでは、MPI を使用できるジョブの作成方法の例を示します。特に、サンプルジョブには 3 つの実行可能物があります。

  • 1 つ目の実行可能物は、同時マルチスレッディングを無効にし、Intel MPI をインストールして MPI 用のジョブを準備するスクリプトです。
  • 2 つ目の実行可能物は空のバリア実行可能物{ "barrier": {} } 形式)であり、これによって、先の実行可能物に続ける前に、すべてのタスクで MPI の設定を確実に完了できます。
  • 3 つ目の実行可能物(とあらゆる後続の実行可能物)は、ジョブのワークロードに対して使用できます。

gcloud CLI または Batch API を使用して、密結合タスクに対して MPI を使用するジョブを作成できます。

gcloud

gcloud CLI を使用して、密結合タスクに対して MPI を使用するスクリプト ジョブを作成するには、次のようにします。

  1. 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 に設定する必要があります。
  2. ジョブを作成するには、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 ライブラリのパフォーマンスを向上させることができます。

たとえば、MPI を使用し、1 つのタスクにタスクグループ内の 3 つのタスクのホスト名を出力させるインスタンス テンプレートからスクリプト ジョブを作成するには、次のようにします。

  1. 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"
        }
    }
    
  2. 次のコマンドを実行します。

    gcloud batch jobs submit example-template-job-uses-mpi \
      --location us-central1 \
      --config example-job-uses-mpi.json
    

API

Batch API を使用して MPI で密結合タスクのためにスクリプト ジョブを作成するには、jobs.create メソッドを使用して、permissiveSshrequireHostsFiletaskCounttaskCountPerNode フィールドを指定します。

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: プロジェクトのプロジェクト ID
  • LOCATION: ジョブのロケーション
  • 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 ライブラリのパフォーマンスを向上させることができます。

たとえば、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 です。

次のステップ