本文說明如何使用訊息傳遞介面 (MPI) 程式庫,設定 Batch 工作,讓緊密耦合的工作在不同 VM 之間相互通訊。
對於批次工作,耦合說明工作間的相互依賴關係;這會影響您如何使用工作的 parallelism
欄位,設定可平行 (而非依序) 執行的工作數量。您可以使用下列耦合類型描述工作:
- 鬆耦合工作:可獨立執行的工作。
- 緊密耦合的工作:必須相互依賴才能執行的工作。
您也可以選擇建立使用 MPI 程式庫的工作,讓緊密耦合的工作在不同 VM 執行個體之間相互通訊。MPI 的常見用途是緊耦合的高效能運算 (HPC) 工作負載。
事前準備
- 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
-
如要取得建立作業所需的權限,請要求管理員授予下列 IAM 角色:
-
批次工作編輯者 (
roles/batch.jobsEditor
) 專案 -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) 在作業的服務帳戶上,預設為預設 Compute Engine 服務帳戶
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
批次工作編輯者 (
- 如果您為這項工作指定網路,請確保該網路的防火牆規則允許工作 VM 之間的連線。瞭解如何設定虛擬私有雲防火牆規則,以因應常見用途。
建立及執行使用 MPI 的工作,處理緊密耦合的工作
本節提供範例,說明如何建立可使用 MPI 的工作。值得注意的是,範例工作有 3 個可執行檔:
- 第一個可執行的項目是指令碼,可停用同步多執行緒並安裝 Intel MPI,為 MPI 準備工作。
- 第二個可執行的項目是空的障礙可執行項目 (格式為
{ "barrier": {} }
),可確保所有工作完成設定 MPI,再繼續執行後續可執行的項目。 - 第三個可執行的項目 (和後續任何可執行的項目) 可供工作負載使用。
您可以使用 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
,這等同於每個工作執行一個 VM 執行個體。REQUIRE_HOSTS_FILE
:設為true
時,這項工作會建立檔案,列出在工作群組中執行的 VM 執行個體。檔案路徑會儲存在BATCH_HOSTS_FILE
環境變數中。如要使用 Batch 提供的 MPI 程式庫,這個欄位必須設為 true。PERMISSIVE_SSH
:設為true
時,Batch 會設定 SSH,允許在工作群組中執行的 VM 執行個體之間進行無密碼通訊。如要使用 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
:專案的專案 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 程式庫效能:
- 使用 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 執行天氣研究和預報模型」。
- 瞭解如何減少緊耦合工作延遲。
- 如果無法建立或執行工作,請參閱「疑難排解」。
- 查看工作和工作。
- 進一步瞭解工作建立選項。