使用 MPI 程式庫設定工作通訊

本文說明如何使用訊息傳遞介面 (MPI) 程式庫,設定 Batch 工作,讓緊密耦合的工作在不同 VM 之間相互通訊。

對於批次工作,耦合說明工作間的相互依賴關係;這會影響您如何使用工作的 parallelism 欄位,設定可平行 (而非依序) 執行的工作數量。您可以使用下列耦合類型描述工作:

  • 鬆耦合工作:可獨立執行的工作。
  • 緊密耦合的工作:必須相互依賴才能執行的工作。

您也可以選擇建立使用 MPI 程式庫的工作,讓緊密耦合的工作在不同 VM 執行個體之間相互通訊。MPI 的常見用途是緊耦合的高效能運算 (HPC) 工作負載。

事前準備

  1. 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
  2. 如要取得建立作業所需的權限,請要求管理員授予下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

    您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

  3. 如果您為這項工作指定網路,請確保該網路的防火牆規則允許工作 VM 之間的連線。瞭解如何設定虛擬私有雲防火牆規則,以因應常見用途

建立及執行使用 MPI 的工作,處理緊密耦合的工作

本節提供範例,說明如何建立可使用 MPI 的工作。值得注意的是,範例工作有 3 個可執行檔:

  • 第一個可執行的項目是指令碼,可停用同步多執行緒安裝 Intel MPI,為 MPI 準備工作。
  • 第二個可執行的項目是空的障礙可執行項目 (格式為 { "barrier": {} }),可確保所有工作完成設定 MPI,再繼續執行後續可執行的項目。
  • 第三個可執行的項目 (和後續任何可執行的項目) 可供工作負載使用。

您可以使用 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,這等同於每個工作執行一個 VM 執行個體。
    • REQUIRE_HOSTS_FILE:設為 true 時,這項工作會建立檔案,列出在工作群組中執行的 VM 執行個體。檔案路徑會儲存在 BATCH_HOSTS_FILE 環境變數中。如要使用 Batch 提供的 MPI 程式庫,這個欄位必須設為 true。
    • PERMISSIVE_SSH:設為 true 時,Batch 會設定 SSH,允許在工作群組中執行的 VM 執行個體之間進行無密碼通訊。如要使用 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,這等同於每個工作執行一個 VM 執行個體。
  • REQUIRE_HOSTS_FILE:設為 true 時,這項工作會建立檔案,列出在工作群組中執行的 VM 執行個體。檔案路徑會儲存在 BATCH_HOSTS_FILE 環境變數中。如要使用 Batch 提供的 MPI 程式庫,這個欄位必須設為 true。
  • PERMISSIVE_SSH:設為 true 時,Batch 會設定 SSH,允許在工作群組中執行的 VM 執行個體之間進行無密碼通訊。如要使用 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

後續步驟