1. 總覽
歡迎來到 Google 程式碼研究室,瞭解如何在 Google Cloud Platform 上執行 Slurm 叢集!完成本程式碼研究室後,您應充分瞭解如何輕鬆佈建及操作自動調整資源配置 Slurm 叢集。
Google Cloud 與 SchedMD 攜手合作,推出一組工具,讓您更輕鬆在 Compute Engine 中啟動 Slurm 工作負載管理工具,並在需要額外資源時,以動態方式擴充現有叢集。這項整合是由 SchedMD 專家根據 Slurm 最佳做法打造而成。
如果您計劃使用 Slurm on Google Cloud Platform 整合服務,或有任何問題,歡迎加入我們的 Google CloudSlurm 社群討論群組!
關於 Slurm
Google Cloud Platform 中獨立 Slurm 叢集的基本架構圖。
Slurm 是全球 HPC 叢集的主要工作負載管理工具之一。Slurm 專為小型和大型 Linux 叢集提供開放原始碼、具備容錯能力、擴充性高的工作負載管理與工作排程系統。Slurm 不需對核心進行修改,且相對獨立。Slurm 做為叢集工作負載管理工具,有三個主要功能:
- 分配資源 (運算節點) 的專屬或非專屬存取權給使用者一段時間,以便他們執行工作。
- 它提供在一組分配的節點上啟動、執行及監控工作 (通常是平行工作) 的架構。
- 並藉由管理待處理工作佇列來仲裁資源爭用情形。
課程內容
- 如何使用 Terraform 設定 Slurm 叢集
- 如何使用 SLURM 執行工作
- 如何在 SLURM 中查詢叢集資訊及監控執行中的工作
- 如何依據特定工作參數和需求自動調度節點資源
- 哪裡可以找到 Slurm 的說明
必要條件
- Google Cloud Platform 帳戶與帳單專案
- 基本 Linux 體驗
2. 設定
自修環境設定
建立專案
如果您還沒有 Google 帳戶 (Gmail 或 G Suite),請先建立帳戶。登入 Google Cloud Platform 控制台 ( console.cloud.google.com),然後開啟「管理資源」頁面:
按一下「建立專案」。
輸入專案名稱。記住專案 ID (在上方螢幕截圖中以紅色醒目顯示)。所有 Google Cloud 專案中的專案 ID 名稱均不得重複。如果您的專案名稱重複,Google Cloud 會根據專案名稱產生隨機專案 ID。
接下來,您需要在 Developers Console 中啟用計費功能,才能使用 Google Cloud 資源。
執行這個程式碼研究室所需的成本不應超過數美元,但如果您決定使用更多資源,或讓這些資源繼續運作 (請參閱本文件結尾的「結論」一節),就能提高作業效率。您可以前往這裡使用 Google Cloud Platform Pricing Calculator。
新使用者符合 $300 美元免費試用資格的 Google Cloud Platform。
Google Cloud Shell
雖然 Google Cloud 可以從筆電遠端操作,但在本程式碼研究室中,我們會使用 Google Cloud Shell,這是在 Cloud 中執行的指令列環境。
啟動 Google Cloud Shell
在 GCP 控制台的右上方,按一下「Cloud Shell」圖示:
接著點選「Start Cloud Shell」:
佈建並連線至環境的作業只需幾分鐘的時間:
這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,可大幅提升網路效能並簡化驗證作業。在絕大多數的情況下,只要透過網路瀏覽器或 Google Chromebook 就能完成這個研究室中的作業。
連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為 PROJECT_ID:
$ gcloud auth list
指令輸出:
Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
$ gcloud config list project
指令輸出:
[core]
project = <PROJECT_ID>
如果專案 ID 設定有誤,您可以使用下列指令進行設定:
$ gcloud config set project <PROJECT_ID>
指令輸出:
Updated property [core/project].
3. 準備及檢查 Slurm Terraform 設定
下載 Slurm Terraform 設定
在 Cloud Shell 工作階段執行下列指令,複製 (下載) 含有 Google Cloud Platform Terraform 檔案 Slurm 的 Git 存放區:
git clone https://github.com/SchedMD/slurm-gcp.git
執行下列指令,切換至 Slurm 部署設定目錄:
cd slurm-gcp
設定 Slurm Terraform tfvars
Basic.tfvars.example 檔案會詳細說明部署作業的設定,包括要部署的網路、執行個體和儲存空間。請將檔案複製到新的檔案 (我們會呼叫「tfvars 檔案」),然後視需要編輯。
cd tf/example/basic cp basic.tfvars.example basic.tfvars
在 Cloud Shell 工作階段中,開啟 tfvars 檔案 basic.tfvars
。您可以使用偏好的指令列編輯器 (vi、nano、emacs 等),或使用 Cloud 控制台程式碼編輯器查看檔案內容:
查看 tfvars 檔案的內容。
cluster_name = "g1"
project = "<project>"
zone = "us-west1-b"
# network_name = "<existing network name>"
# subnetwork_name = "<existing subnetwork name>"
# shared_vpc_host_project = "<vpc host project>"
# disable_controller_public_ips = true
# disable_login_public_ips = true
# disable_compute_public_ips = true
# suspend_time = 300
controller_machine_type = "n1-standard-2"
controller_image = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
controller_disk_type = "pd-standard"
controller_disk_size_gb = 50
# controller_labels = {
# key1 = "val1"
# key2 = "val2"
# }
# controller_service_account = "default"
# controller_scopes = ["https://www.googleapis.com/auth/cloud-platform"]
# cloudsql = {
# server_ip = "<cloudsql ip>"
# user = "slurm"
# password = "verysecure"
# db_name = "slurm_accounting"
# }
# controller_secondary_disk = false
# controller_secondary_disk_size = 100
# controller_secondary_disk_type = "pd-ssd"
#
# When specifying an instance template, specified controller fields will
# override the template properites.
# controller_instance_template = null
login_machine_type = "n1-standard-2"
login_image = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
login_disk_type = "pd-standard"
login_disk_size_gb = 20
# login_labels = {
# key1 = "val1"
# key2 = "val2"
# }
# login_node_count = 1
# login_node_service_account = "default"
# login_node_scopes = [
# "https://www.googleapis.com/auth/monitoring.write",
# "https://www.googleapis.com/auth/logging.write"
# ]
#
# When specifying an instance template, specified login fields will
# override the template properties.
# login_instance_template = null
# Optional network storage fields
# network_storage is mounted on all instances
# login_network_storage is mounted on controller and login instances
# network_storage = [{
# server_ip = "<storage host>"
# remote_mount = "/home"
# local_mount = "/home"
# fs_type = "nfs"
# mount_options = null
# }]
#
# login_network_storage = [{
# server_ip = "<storage host>"
# remote_mount = "/net_storage"
# local_mount = "/shared"
# fs_type = "nfs"
# mount_options = null
# }]
# compute_node_service_account = "default"
# compute_node_scopes = [
# "https://www.googleapis.com/auth/monitoring.write",
# "https://www.googleapis.com/auth/logging.write"
# ]
partitions = [
{ name = "debug"
machine_type = "n1-standard-2"
static_node_count = 0
max_node_count = 10
zone = "us-west1-b"
image ="projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
image_hyperthreads = false
compute_disk_type = "pd-standard"
compute_disk_size_gb = 20
compute_labels = {}
cpu_platform = null
gpu_count = 0
gpu_type = null
network_storage = []
preemptible_bursting = false
vpc_subnet = null
exclusive = false
enable_placement = false
regional_capacity = false
regional_policy = {}
instance_template = null
},
# { name = "partition2"
# machine_type = "n1-standard-16"
# static_node_count = 0
# max_node_count = 20
# zone = "us-west1-b"
# image = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
# image_hyperthreads = false
#
# compute_disk_type = "pd-ssd"
# compute_disk_size_gb = 20
# compute_labels = {
# key1 = "val1"
# key2 = "val2"
# }
# cpu_platform = "Intel Skylake"
# gpu_count = 8
# gpu_type = "nvidia-tesla-v100"
# network_storage = [{
# server_ip = "none"
# remote_mount = "<gcs bucket name>"
# local_mount = "/data"
# fs_type = "gcsfuse"
# mount_options = "file_mode=664,dir_mode=775,allow_other"
# }]
# preemptible_bursting = true
# vpc_subnet = null
# exclusive = false
# enable_placement = false
#
# ### NOTE ####
# # regional_capacity is under development. You may see slowness in
# # deleting lots of instances.
# #
# # With regional_capacity : True, the region can be specified in the zone.
# # Otherwise the region will be inferred from the zone.
# zone = "us-west1"
# regional_capacity = True
# # Optional
# regional_policy = {
# locations = {
# "zones/us-west1-a" = {
# preference = "DENY"
# }
# }
# }
#
# When specifying an instance template, specified compute fields will
# override the template properties.
# instance_template = "my-template"
]
在這個 tfvars 檔案中,有數個欄位需要設定。唯一需要設定的欄位是 project。您可以原封不動使用範例中的所有其他設定,但必須根據您的情況進行修改。如需設定選項的詳細說明,請參閱這裡。
- cluster_name:Slurm 叢集的名稱
- project:要部署資源的 Google Cloud 專案 ID
- 可用區:Google Cloud 可用區,當中包含這個叢集的控制器和登入執行個體 - 瞭解詳情
- network_name: 可用來將 Slurm 叢集部署至虛擬私有雲網路
- subnetwork_name: :虛擬私有雲子網路,用於將 Slurm 叢集部署至
- shared_vpc_host_project: 共用虛擬私有雲網路,以便將 Slurm 叢集部署至
- disable_controller_public_ips:要將外部 IP 指派給 Slurm 控制器嗎?
- disable_login_public_ips:要將外部 IP 指派給 Slurm 登入節點嗎?
- disable_compute_login_ips::要將外部 IP 指派給 Slurm 登入節點嗎?
- suspend_time:節點進入閒置狀態後,請等待多久再暫停節點
- controller_machine_type:控制器節點執行個體類型
- controller_image:用來建立 Slurm 控制器執行個體的 GCP 映像檔
- controller_disk_type:控制器執行個體開機磁碟類型
- controller_disk_size_gb:控制器執行個體開機磁碟的大小
- controller_labels:要附加至控制器執行個體的標籤
- controller_service_account: 要在控制器執行個體中使用的服務帳戶
- controller_scopes: 控制器執行個體的存取權範圍
- cloudsql: Google CloudSQL 伺服器,用來做為 Slurm 資料庫,而非在控制器執行個體中託管資料庫
- server_ip::CloudSQL 伺服器 IP
- user:Cloud SQL 使用者名稱
- password:CloudSQL 密碼
- db_name:CloudSQL 資料庫名稱
- controller_secondary_disk:為 NFS 伺服器儲存空間新增次要磁碟嗎?
- controller_secondary_disk_type:控制器次要磁碟類型
- controller_secondary_disk_size_gb:控制器次要磁碟的大小
- controller_instance_template:用於控制器執行個體的 GCP 執行個體範本。指定的運算欄位會覆寫範本屬性。例如:如果已指定 Controller_image,該映像檔就會覆寫執行個體範本中的映像檔。
- login_machine_type:登入 (SSH-access) 節點執行個體類型
- login_image:用來建立 Slurm 登入執行個體的 GCP 映像檔
- login_disk_type:登入執行個體開機磁碟的類型
- login_disk_size_gb:登入執行個體開機磁碟的大小
- login_labels:要附加至登入執行個體的標籤
- login_node_count:要建立的登入節點數量
- login_node_service_account: 登入執行個體所用的服務帳戶
- login_node_scopes: :登入執行個體的存取權範圍
- login_instance_template:用於登入執行個體的 GCP 執行個體範本。指定的運算欄位會覆寫範本屬性。例如:如果有指定 login_image,該映像檔會覆寫執行個體範本中的圖片。
- network_storage:要掛接在所有節點上的網路儲存空間。這些欄位會直接新增至 fstab。您可以重複用於其他掛接項目。
- server_ip::儲存空間伺服器 IP
- remote_mount:儲存空間掛接名稱 (檔案系統名稱)
- local_mount:本機掛接目錄
- fs_type:檔案系統類型 (自動安裝 NFS、CIFS、Lustre、GCSFuse)
- mount_options:掛接選項 (例如 default,_netdev)
- login_network_storage:要在登入和控制器節點上掛接的網路儲存空間。系統會自動安裝 NFS、CIFS、Lustre 和 GCSFuse。您可以重複用於其他掛接項目。
- server_ip::儲存空間伺服器 IP
- remote_mount:儲存空間掛接名稱 (檔案系統名稱)
- local_mount:本機掛接目錄
- fs_type:檔案系統類型 (自動安裝 NFS、CIFS、Lustre、GCSFuse)
- mount_options:掛接選項 (例如 default,_netdev)
- compute_node_service_account: 要在運算執行個體中使用的服務帳戶
- compute_node_scopes: :運算執行個體的存取權範圍
- partitions:Slurm 分區設定。您可以重複用於其他分區。
- name:分區名稱
- machine_type:運算節點執行個體類型
- static_node_count:一律啟用的運算節點數量
- max_node_count::允許的運算節點總數上限 - 最多 64,000 個
- 可用區:含有這個分區資源的 Google Cloud 可用區,瞭解詳情
- image:運算映像檔節點機器類型
- image_hyperthreads:開啟或關閉執行個體的超執行緒功能
- compute_disk_type:運算執行個體開機磁碟類型 (pd-standard、pd-ssd)
- compute_disk_size_gb:運算執行個體開機磁碟的大小
- compute_labels:要附加至運算執行個體的標籤
- cpu_platform:所有運算節點所需的最低 CPU 平台
- gpu_count:要附加至分區中每個執行個體的 GPU 數量
- gpu_type: 要附加至分區執行個體的 GPU 類型
- network_storage:要在分區中所有運算節點上掛接的網路儲存空間。這些欄位會直接新增至 fstab。您可以重複用於其他掛接項目。
- server_ip::儲存空間伺服器 IP
- remote_mount:儲存空間掛接名稱 (檔案系統名稱)
- local_mount:本機掛接目錄
- fs_type:檔案系統類型 (自動安裝 NFS、CIFS、Lustre、GCSFuse)
- mount_options:掛接選項
- preemptible_bursting:執行個體是先佔執行個體嗎?
- vpc_subnet: :虛擬私有雲子網路,用於將 Slurm 分區部署至
- 專屬:啟用 Slurm 將整個節點分配到工作
- enable_placement:啟用配置政策,因為這類政策可讓執行個體彼此靠近,藉此縮短網路延遲時間。
- regional_capacity:允許根據可用性,將執行個體放置在區域中任何可用區
- regional_policy:如果 region_capacity 是「true」,這項政策就會是決定要使用的區域,以及該區域中哪些可用區不應使用
- Instance_template:用於運算執行個體的 GCP 執行個體範本。指定的運算欄位會覆寫範本屬性。例如:如果有指定映像檔,這個映像檔會覆寫執行個體範本中的映像檔。
進階設定
如有需要,您可以選擇在叢集部署程序中安裝其他套件和軟體。您可以透過「在 Compute Engine 於 Slurm 叢集中安裝應用程式」所述的多種方式,在 Slurm 叢集中安裝軟體,也可以自訂 Slurm 部署的映像檔。目前 Slurm 部署了以 Google Cloud HPC VM 映像檔為基礎的 SchedMD 提供的 VM 映像檔,並且在上面安裝 Slurm。
如要使用自己的映像檔,請依據 tfvars 檔案中列出的公開 SchedMD VM 映像檔,使用自己的設定建構映像檔。接著,將 tfvars 檔案中指定的映像檔 URI 替換成您自己的映像檔,然後測試變更。
疑難排解
在本程式碼研究室中,請參閱 Slurm-GCP 存放區 ReadMe 的「疑難排解」一節。
最常見的問題是設定 tfvars 檔案和配額限制時出錯。本程式碼研究室的用意是在新使用者的標準配額配額內運作,而新使用者可獲得 $300 美元的免費抵免額。如果嘗試建立 VM 失敗,請檢查控制器節點上的 /var/log/slurm/resume.log 檔案是否有 API 錯誤。
4. 部署及驗證設定
部署設定
在 Cloud Shell 工作階段中,從 slurm-gcp/tf/example
資料夾執行下列指令:
terraform init terraform apply -var-file=basic.tfvars
系統會根據所設的設定,提示您接受上述動作。輸入「yes」即可開始部署您也可以執行「terraform plan」來檢視要部署的設定。
Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes
這項作業可能需要幾分鐘才能完成,因此請耐心等候。
部署作業完成之後,您會看到類似如下的輸出內容:
Apply complete! Resources: 8 added, 0 changed, 0 destroyed. Outputs: controller_network_ips = [ [ "10.0.0.2", ], ] login_network_ips = [ [ "10.0.0.3", ], ]
驗證 VM 執行個體建立作業
開啟「導覽選單」,然後選取「Compute Engine」>VM 執行個體。
畫面中應會顯示控制器和登入 VM 執行個體:
在「VM 執行個體」下方,查看 Terraform 建立的兩個虛擬機器執行個體。
如果您修改了 cluster_name 欄位,名稱將會不同。
- g1 控制器
- g1-login0
5. 登入 Slurm 叢集
存取 Slurm 叢集
返回「程式碼編輯器/Cloud Shell」分頁。執行下列指令登入執行個體,將 <ZONE>
替換為 g1-login0 節點的可用區 (應為 us-central1-b
):
gcloud compute ssh g1-login0 --zone=<ZONE>
這個指令會讓您登入 g1-login0
虛擬機器。
另一個輕鬆存取登入節點的方法,是點選「SSH」按鈕,即可開啟含有 SSH 連線的新分頁。
如果這是您第一次使用 Cloud Shell,系統可能會顯示如下訊息,要求您建立安全殼層金鑰:
WARNING: The public SSH key file for gcloud does not exist. WARNING: The private SSH key file for gcloud does not exist. WARNING: You do not have an SSH key for gcloud. WARNING: SSH keygen will be executed to generate a key. This tool needs to create the directory [/home/user/.ssh] before being able to generate SSH keys. Do you want to continue (Y/n)?
輸入 Y。如果系統要求選取通關密語,請按下「Enter 兩次」,將通關密語留空。
登入時出現以下訊息:
*** Slurm is currently being configured in the background. *** A terminal broadcast will announce when installation and configuration is complete.
等待系統顯示這則訊息後,再繼續研究室操作 (約 5 分鐘):
*** Slurm login setup complete ***
看到以上訊息後,您必須登出並重新登入 g1-login0
,才能繼續使用研究室。如要這麼做,請按下 Ctrl + C 鍵結束工作。
接著執行下列指令,登出執行個體:
exit
現在請重新連線至登入 VM。執行下列指令登入執行個體,將 <ZONE>
替換為 g1-login0 節點的可用區:
gcloud compute ssh g1-login0 --zone=<ZONE>
和上述情況一樣,您可能需要等待一兩分鐘才能連線,並完成所有設定。
Slurm CLI 工具導覽
您現在已登入叢集的 Slurm 登入節點。這個節點專門用於使用者/管理員互動、安排 Slurm 工作,以及管理活動。
讓我們執行幾個指令,向您介紹 Slurm 指令列。
執行 sinfo 指令,查看叢集資源的狀態:
sinfo
下方顯示資訊的輸出內容範例。sinfo 會報告叢集內可用的節點、這些節點的狀態,以及這些節點設下的分區、可用性和任何時間限制等其他資訊。
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 10 idle~ g1-compute-0-[0-9]
您會看到 10 個節點,這取決於偵錯分區的「max_node_count」都會標示為「idle~」(節點處於閒置狀態且未分配的模式,可隨時啟用)。
接著,執行 squeue 指令,查看叢集佇列的狀態:
squeue
佇列的預期輸出內容如下所示。佇列會回報叢集的佇列狀態。包括叢集內排定各項工作的工作 ID、工作獲派的分區、工作名稱、啟動工作的使用者、工作狀態、執行工作的實際時鐘時間,以及分配給該工作的節點。沒有任何執行中的工作,因此這個指令的內容是空的。
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
Slurm 指令會「srun」和「sbatch」可用來執行排入佇列的工作。「srun」平行工作,且可做為 mpirun 的包裝函式使用。「sbatch」用於提交批次工作以進行 slurm,並在不同設定中呼叫一次或多次執行。「sbatch」可以使用批次指令碼,也可以與 –wrap 選項搭配使用,從指令列執行完整工作。
我們開始執行工作,看看 Slurm 的實際運作情形,並在佇列中取得工作!
6. 執行 Slurm 工作並調度叢集資源
執行 Slurm 工作並調度叢集資源
建立 Slurm 叢集後,接著就來執行工作並向上擴充叢集。
「sbatch」指令可用來執行 Slurm 批次指令和指令碼。讓我們執行一個執行「主機名稱」的簡單批次指令碼自動調整資源配置的 VM 執行個體
登入 g1-login0 時,執行下列指令:
sbatch -N2 --wrap="srun hostname"
這個指令會執行 Slurm 批次指令。指定 sbatch 會使用「-N」執行 2 個節點如果有需要 SQL 指令的分析工作負載 則 BigQuery 可能是最佳選擇同時指定每個節點會執行「縮減主機名稱」指令如果有需要 SQL 指令的分析工作負載 則 BigQuery 可能是最佳選擇
根據預設,sbatch 會將輸出內容寫入「slurm-%j.out」在執行指令的工作目錄中,根據 Slurm 檔案名稱模式,將 %j 替換成工作 ID。範例中的 sbatch 是從使用者的 /home 資料夾執行,後者是控制器上預設代管的 NFS 式共用檔案系統。如此一來,運算節點就能視需要共用輸入和輸出資料。在實際工作環境中,工作儲存空間應與 /home 儲存空間分開,以免叢集作業的效能受到影響。您可以在「network_storage」的 tfvars 檔案中,指定獨立的儲存空間掛接只要設定成「自動重新啟動」 和「在主機維護期間」選項即可
使用 sbatch 指令列執行 sbatch 指令碼後,系統就會傳回排定工作的「工作 ID」,例如:
Submitted batch job 2
我們可以使用 sbatch 指令傳回的工作 ID,追蹤及管理工作執行和資源。執行下列指令,藉此查看 Slurm 工作佇列:
squeue
您執行的工作可能會如下所示:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 2 debug g1-compute-0-[0-1] username R 0:10 2 g1-compute-0-[0-1]
由於沒有任何佈建的運算節點,Slurm 會按照工作需求自動建立運算執行個體。這項程序的自動性質有兩項優點。首先,它可免除手動佈建節點、設定軟體、將節點整合至叢集,以及部署工作的 HPC 叢集中通常需要的工作。其次,由於閒置的節點會遭到縮減,直到達到最低數量的節點數量,系統都會讓使用者節省費用。
您可以執行 sinfo 指令來查看正在啟動的 Slurm 叢集:
sinfo
這會顯示「alloc#」佇列中所列的節點狀態,意味著系統將分配節點:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 8 idle~ g1-compute-0-[2-9] debug* up infinite 2 alloc# g1-compute-0-[0-1]
您也可以前往 Google Cloud 控制台的「VM 執行個體」專區,查看新佈建的節點。系統需要幾分鐘的時間來啟動節點和執行 Slurm,之後才會將工作分配給新分配的節點。您的 VM 執行個體清單很快就會如下所示:
節點開始執行工作後,執行個體會移至「alloc」這代表工作會分配給工作:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 8 idle~ g1-compute-0-[2-9] debug* up infinite 2 alloc g1-compute-0-[0-1]
工作完成後,工作就不會再列入佇列,而「alloc」sinfo 中的節點將會返回「閒置」時間。執行「sQueue」直到工作完成為止,一到兩分鐘完成
輸出檔案 slurm-%j.out 已寫入您的 NFS-shared /home 資料夾,其中包含主機名稱。開啟或配置輸出檔案 (通常為 slurm-2.out) 後,輸出檔案的內容會包含以下內容:
g1-compute-0-0 g1-compute-0-1
做得好,您執行工作並向上擴充 Slurm 叢集了!
7. 執行 MPI 工作
現在,我們在節點中執行 MPI 工作。登入 g1-login0 時,使用 wget 下載以 C 程式設計語言編寫的 MPI 程式:
wget https://raw.githubusercontent.com/mpitutorial/mpitutorial/gh-pages/tutorials/mpi-hello-world/code/mpi_hello_world.c
如要使用 OpenMPI 工具,請執行下列指令,載入 OpenMPI 模組:
module load openmpi
使用「mpicc」來編譯 MPI C 程式碼。執行下列指令:
mpicc mpi_hello_world.c -o mpi_hello_world
這項作業會將 C 程式碼編譯為機器碼,以便我們透過 Slurm 在整個叢集中執行程式碼。
接著,使用您偏好的文字編輯器建立 sbatch 指令碼「helloworld_batch」:
vi helloworld_batch
輸入 i 即可進入離線插入模式。
將下列文字複製並貼上到檔案中,建立簡單的 sbatch 指令碼:
#!/bin/bash # #SBATCH --job-name=hello_world #SBATCH --output=hello_world-%j.out # #SBATCH --nodes=2 srun mpi_hello_world
按下 Esc 鍵,然後輸入「:wq」,儲存並離開程式碼編輯器引號。
這個指令碼會定義 Slurm 批次執行環境和工作。首先,執行環境的定義為 bash。接著,指令碼會以 "#SBATCH" 開頭定義 Slurm 選項即可工作名稱的定義為「hello_world」。
輸出檔案會設為「hello_world_%j.out」其中 %j 會根據「Slurm 檔案名稱模式」替換成工作 ID。這個輸出檔案會寫入 sbatch 指令碼執行的來源目錄。在本範例中,使用者的 /home 資料夾是以 NFS 為基礎的共用檔案系統。如此一來,運算節點就能視需要共用輸入和輸出資料。在實際工作環境中,工作儲存空間應與 /home 儲存空間分開,以免叢集作業的效能受到影響。
最後,執行這個指令碼的節點數量定義為 2。
定義選項之後,系統會提供可執行指令。這個指令碼將使用 srun 指令取代 mpirun 指令,以平行方式執行 mpi_hello_world 程式碼。
接著使用 sbatch 指令列執行 sbatch 指令碼:
sbatch helloworld_batch
執行 sbatch 會傳回已排定工作的「工作 ID」,例如:
Submitted batch job 3
這會在 2 個節點中執行 hostname 指令 (每個節點都有一項工作),並將輸出內容輸出至 hello_world-3.out 檔案。
我們已在 2 個節點佈建了這項工作,之後會快速執行這項工作。
監控佇列,直到工作完成並停止列出為止:
squeue
完成開啟或串連 hello_world-3.out 檔案後,請確認該檔案是在 g1-compute-0-[0-1] 上執行:
Hello world from processor g1-compute-0-0, rank 0 out of 2 processors Hello world from processor g1-compute-0-1, rank 1 out of 2 processors
閒置 5 分鐘後 (可透過 YAML 的 suspend_time 欄位或 slurm.conf 的「SuspendTime」欄位設定),動態佈建的運算節點會重新分配至釋出資源。您可以定期執行資訊資訊,然後觀察叢集大小會回復至 0,藉此驗證這一點:
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 10 idle~ g1-compute-0-[0-9]
請嘗試啟動更多執行個體,直到部署叢集的區域允許的配額上限,並執行不同的 MPI 應用程式。
8. 結語
恭喜!您已在 Google Cloud Platform 上建立 Slurm 叢集,並使用其最新功能來自動調整叢集資源配置,藉此滿足工作負載需求!您可以使用這個模型執行各種工作,只要在 Slurm 中要求節點,就能在幾分鐘內擴充為數百個執行個體。
如要繼續在 GCP 上使用 Slurm,請務必繼續閱讀「使用 Slurm 建立聯合 HPC 叢集程式碼研究室。本程式碼研究室將引導您在雲端中設定兩個 Slurm 聯合叢集,並指出您在地端部署或雲端中達成多叢集聯盟的方式。
您是否要使用 Slurm 新推出的 GCP 原生功能建構酷炫的應用程式?有任何問題嗎?有任何功能建議嗎?歡迎立即透過 Google Cloud 高效能運算解決方案網站與 Google Cloud 團隊聯絡,或是洽詢 Google Cloud透過 Slurm 討論群組!
清除 Terraform 部署作業
登出 slurm 節點:
exit
先讓所有自動調度資源的節點縮減資源,再刪除部署作業。您也可以執行「gcloud compute instances delete <Instance Name>」來手動刪除這些節點或是使用主控台 GUI 選取多個節點,然後按一下「刪除」。
登出 g1-login0 後,透過 Google Cloud Shell 執行下列指令,即可輕鬆清除 Terraform 部署作業:
cd ~/slurm-gcp/tf/examples/basic terraform destroy -var-file=basic.tfvars
系統提示時,輸入 yes 繼續操作。這項作業可能需要幾分鐘才能完成,請耐心等候。
刪除專案
如要清除所用資源,只需刪除專案即可。
- 在導覽選單中,選取「IAM &」(身分與存取權管理與)管理員
- 接著點選子選單中的「設定」
- 按一下顯示文字「Delete Project」的垃圾桶圖示
- 按照提示操作
涵蓋內容
- 瞭解如何使用 Terraform 在 GCP 中部署 Slurm。
- 瞭解如何在 GCP 上使用 Slurm 執行工作。
- 如何在 Slurm 中查詢叢集資訊及監控執行中的工作。
- 如何在 GCP 上使用 Slurm 自動調度節點資源,以滿足特定工作參數和需求。
- 如何在 GCP 上在 Slurm 上編譯及執行 MPI 應用程式。
尋求 Slurm 支援
如要在測試或正式環境中使用這些整合功能,請前往 SchedMD 的聯絡頁面直接聯絡:https://www.schedmd.com/contact.php
您也可以使用我們提供的疑難排解指南:
- GCP 疑難排解指南中的 Slurm:https://github.com/SchedMD/slurm-gcp#troubleshooting
- SchedMD 的疑難排解指南:https://slurm.schedmd.com/troubleshoot.html
最後,您也可以將問題張貼至 Google CloudSlurm 討論群組位於以下網址:https://groups.google.com/g/google-cloud-slurm-discuss
瞭解詳情
意見回饋
如果您對本程式碼研究室有任何意見,請使用這個連結提交。5 分鐘內即可完成意見回饋。感謝您!