轉角遇上Volcano,看HPC如何應用在氣象行業


摘要:高性能計算(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上運行方式。

華為雲社區作者|金喆

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM