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

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

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

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

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

始める前に

  1. Batch を以前に使用したことがない場合は、Batch を使ってみるを確認し、プロジェクトとユーザーの前提条件を完了して Batch を有効にします。
  2. ジョブの作成に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

    ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

  3. このジョブのネットワークを指定する場合は、ネットワークにジョブの VM 間の接続を許可するファイアウォール ルールがあることを確認してください。一般的なユースケースに対応した VPC ファイアウォール ルールを構成する方法をご覧ください。

密結合タスクに対して 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 インスタンス間でパスワードなしの通信を許可するように、Batch は 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 です。

次のステップ