摘要:高性能計算(HPC)在各個領域都有廣泛的應用。本文通過典型的HPC應用WRF,介紹了HPC應用在Kubernetes+Volcano上運行方式。
Kubernetes已經成為雲原生應用編排、管理的事實標准,越來越多的應用選擇向K8S遷移。HPC作為傳統的分布式計算模式,在很多領域都有着廣泛的應用,很多用戶都希望能將HPC應用遷移到容器中運行,通過Kubernetes強大的功能來進行作業管理。Volcano作為CNCF首個面向批量計算的分布式調度系統,也支持MPI作業的調度,本文以傳統的HPC應用WRF為例,探討Volcano是如何支持HPC應用的。
HPC簡介
HPC是High Performance Computing(高性能計算)的縮寫。平時提到的HPC,一般指代高性能計算機群(HPCC),它將大量的計算機軟件/硬件整合起來,將大的計算作業分解成一個個小部分,通過並行計算的方式加以解決。HPC高性能計算在CAE仿真、動漫渲染、物理化學、石油勘探、生命科學、氣象環境等領域有廣泛的應用。
一般來說,高性能計算集群(HPCC)包含如下部分:
- PBS:Protable Batch System,資源管理器,負責管理集群中所有節點的資源。除了PBS意外,常用的資源管理系統還有Slurm,LSF等
- Maui:第三方任務調度器,支持資源預留,支持各種復雜的優先級策略,支持搶占機制等。資源管理器中內置了默認的任務調取器,但功能往往比較簡單
- OpenMPI:上層通信環境,兼顧通信庫,編譯,分布式啟動任務的功能
上述三部分中,PBS和Maui對於用戶來說是完全透明的,用戶只需要按照PBS提供的方式提交作業即可,不需要了解內部細節。而OpenMPI則需要用戶進行相關了解,來編寫能夠並行計算的應用。
下面以mpirun -np 4 ./mpi_hello_world為例介紹mpi作業是如何運行的:
- 調用openmpi或者其他mpi的庫來編寫源代碼,例子里就是輸出hello world字符串了
- 使用支持MPI的編譯器來編譯出可執行程序mpi_hello_world
- 將mpi_hello_world分發到各個節點,也可以通過共享文件系統來實現對mpi_hello_world的訪問
- 運行mpirun來並行執行mpi_hello_world
WRF簡介
WRF是Weather Research and Forecasting Model(天氣研究和預報模型)的簡稱,是一種比較常見的HPC應用。WRF是一種中尺度數值天氣預報系統,設計用於大氣研究和業務預報應用,可以根據實際的大氣條件或理想化的條件進行模擬。
由於WRF包含多個模塊,因此處理流程可能不盡相同,這里僅以WPS和WRF這兩個模塊為例介紹一下完整的WRF流程:
該處理流程包括4部分:
- 外部數據源
- 前處理系統(WPS)
- 核心模擬系統(WRF)
- 后處理系統
外部數據源
包含靜態地理數據,網絡數據等。靜態地理數據可以理解為某區域內的地理信息,例如山川,河流,湖泊,森林等等。網絡數據是某區域內的氣象環境數據,例如氣溫,風速風向,空氣濕度,降雨量等等。
前處理系統(WPS,WRF Pre-processing System)
前處理系統用於載入地理和氣象數據,對氣象數據進行插值,為WRF提供輸入數據。該部分包含3個程序:
- geogrid.exe:定義模型投影、區域范圍,嵌套關系,對地表參數進行插值,處理地形資料和網格數據
- ungrib.exe:從grib數據中提取所需要的氣象參數
- metgrid.exe:將氣象參數插值到模擬區域
經過這3個程序處理后,生成可以用來進行氣象模擬的數據。這3個處理程序目前不支持mpi並行運算。
核心模擬系統(WRF)
核心模擬系統對前處理系統生成的氣象信息進行模擬和預報,是WRF的核心模塊。該部分包含2個程序:
- real.exe:初始化實際氣象數據
- wrf.exe:模擬及預報結果
real.exe和wrf.exe可以通過mpi並行運算來提升計算速度,例如
上圖中wrfinput_d0X和wrfbdy_d0X為real.exe的運算結果,wrf.exe以該結果為輸入進行模擬演算,生成最終的氣象模擬結果wrfout_dxx_yyyy-mm-dd_hh:mm:ss,並由后處理系統進行驗證展示。
后處理系統
后處理系統用來驗證和顯示核心模擬系統的計算結果。主要由各種第三方圖像和驗證工具組成。下圖展示了Conus 2.5km算例中各個地區相對濕度的模擬預報結果:
Conus 2.5km是指美國本土氣象數據,分辨率為2.5km(將整個區域分成一個個2.5km*2.5km*2.5km的方格,每個方格中的氣象信息被認為是完全一致的)。
HPC on Volcano
上面介紹了一個HPCC包括資源管理器,調度器和mpi並行計算庫三部分,其中資源管理器由Kubernetes負責,調度器由Volcano負責。
在Kubernetes+Volcano環境中運行HPC應用,本質上就是在容器中運行HPC作業,示意圖如下:
將運行的容器分為Master容器和Worker容器兩種。Master容器負責啟動mpirun/mpiexec命令,Worker容器負責運行真正的計算作業。
因此Volcano為了支持MPI作業運行,添加了如下功能:
- Volcano job支持定義多個pod模板,能夠同時定義master pod和worker pod
- 支持 Gang scheduling,保證作業中所有的pod能夠同時啟動
- Master/Worker pod內部主機IP映射
- Master/Workerpod之間ssh免密登錄
- 作業生命周期管理
Volcano mpi作業配置mpi_sample.yaml:
apiVersion: batch.Volcano.sh/v1alpha1 kind: Job metadata: name: mpi-job labels: # 根據業務需要設置作業類型 "Volcano.sh/job-type": "MPI" spec: # 設置最小需要的服務 (小於總replicas數) # 這里等於mpimaster和mpiworker的總數 minAvailable: 3 # 指定調度器為Volcano schedulerName: Volcano plugins: # 提供 ssh 免密認證 ssh: [] # 提供運行作業所需要的網絡信息,hosts文件,headless service等 svc: [] # 如果有pod被 殺死,重啟整個作業 policies: - event: PodEvicted action: RestartJob tasks: - replicas: 1 name: mpimaster # 當 mpiexec 結束,認為整個mpi作業結束 policies: - event: TaskCompleted action: CompleteJob template: spec: # Volcano的信息會統一放到 /etc/Volcano 目錄下 containers: # master容器中 # 1. 啟動sshd服務 # 2. 通過/etc/Volcano/mpiworker.host獲取mpiworker容器列表 # 3. 運行mpirun/mpiexec - command: - /bin/sh - -c - | MPI_HOST=`cat /etc/Volcano/mpiworker.host | tr "\n" ","`; mkdir -p /var/run/sshd; /usr/sbin/sshd; mpiexec --allow-run-as-root --host ${MPI_HOST} -np 2 mpi_hello_world; image: Volcanosh/example-mpi:0.0.1 imagePullPolicy: IfNotPresent name: mpimaster ports: - containerPort: 22 name: mpijob-port workingDir: /home resources: requests: cpu: "100m" memory: "1024Mi" limits: cpu: "100m" memory: "1024Mi" restartPolicy: OnFailure imagePullSecrets: - name: default-secret - replicas: 2 name: mpiworker template: spec: containers: # worker容器中只需要啟動sshd服務 - command: - /bin/sh - -c - | mkdir -p /var/run/sshd; /usr/sbin/sshd -D; image: Volcanosh/example-mpi:0.0.1 imagePullPolicy: IfNotPresent name: mpiworker ports: - containerPort: 22 name: mpijob-port workingDir: /home resources: requests: cpu: "100m" memory: "2048Mi" limits: cpu: "100m" memory: "2048Mi" restartPolicy: OnFailure imagePullSecrets: - name: default-secret
提交mpi Volcano job:
作業執行完畢:
查看master pod的結果
通過上述執行結果可以看出,在作業執行結束后,Volcano只清理worker pod,保留master pod,這樣用戶kubectl命令獲取執行結果。
此外,由於網絡構建可能會出現延遲,在作業運行開始時,master pod會出現連接worker pod失敗的情況。對於這種情況,Volcano會自動重啟master pod,保證作業能夠正確運行。
通過以上示例我們可以看出,Volcano想要運行WRF作業的話,理論上需要將其中的mpi_hello_world替換為real.exe/wrf.exe,此外,用戶還需要進行如下准備:
- 自建docker images,包含完整的WRF運行環境
- 將計算所需要的數據(原生數據或者中間結果數據)掛載到相應的容器中
這樣就能在Kubernetes+Volcano上運行氣象模擬作業了。
總結
高性能計算(HPC)在各個領域都有廣泛的應用。本文通過典型的HPC應用WRF,介紹了HPC應用在Kubernetes+Volcano上運行方式。
華為雲社區作者|金喆