转角遇上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上运行方式。
华为云社区作者|金喆
转角遇上Volcano,看HPC如何应用在气象行业的更多相关文章
- 当创业遇上O2O,新一批死亡名单,看完震惊了!
当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...
- 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)
邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...
- 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)
我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...
- 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)
邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...
- 初识genymotion安装遇上的VirtualBox问题
想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...
- LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)
当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...
- LoadRunner - 当DiscuzNT遇上了Loadrunner(中) (转发)
当DiscuzNT遇上了Loadrunner(中) 在上文中,介绍了如果录制脚本和设置脚本执行次数.如果经过调试脚本能够正常工作的话,就可以设置并发用户数并进行压力测试了. 首先我们通过脚本编辑界面上 ...
- 谁还没遇上过NoClassDefFoundError咋地——浅谈字节码生成与热部署
谁还没遇上过NoClassDefFoundError咋地--浅谈字节码生成与热部署 前言 在Java程序员的世界里,NoClassDefFoundError是一类相当令人厌恶的错误,因为这类错误通常非 ...
- dynamic遇上ADO.NET
传说中的dynamic dynamic是个不合群.不按规则办事的家伙,可以说是个异形,但更恐怖的是它又是无所不知的,任何事情都难不了它(咳咳,它似乎与Lambda表达式是死对头).这令人想起<死 ...
- 前端遇上Go: 静态资源增量更新的新实践
前端遇上Go: 静态资源增量更新的新实践https://mp.weixin.qq.com/s/hCqQW1F8FngPPGZAisAWUg 前端遇上Go: 静态资源增量更新的新实践 原创: 洋河 美团 ...
随机推荐
- .NET高性能开发-位图索引(一)
首先来假设这样一个业务场景,大家对于飞机票应该不陌生,大家在购买机票时,首先是选择您期望的起抵城市和时间,然后选择舱等(公务舱.经济舱),点击查询以后就会出现航班列表,随意的点击一个航班,可以发现有非 ...
- js闭包使用之处
1.循环绑定 No Use: var lists = document.getElementsByTagName('li'); for(var i=0;i<lists.length;i& ...
- 关于虚拟机的IP地址经常改变问题的解法
主要解法就是配置静态IP地址 首先了解一下IP和子网掩码,网关的含义:IP 是标识计算机特定地址的二进制数,子网掩码用于和IP组合划分子网;网关是将信息传送到网关进行收发 开始配置:首先打开Linux ...
- [C++]线段树 区间修改 区间查询
线段树 区间修改 区间查询 请先阅读上一篇Bolg 算法思想 这次要引入一个核心变量: lazy 懒标记 为了达到区间修改的目的 又为了减少运算量 所以就需要引入懒标记这个变量 用来满足 即用即推 没 ...
- Spring 缓存注解这样用,太香了!
作者最近在开发公司项目时使用到 Redis 缓存,并在翻看前人代码时,看到了一种关于 @Cacheable 注解的自定义缓存有效期的解决方案,感觉比较实用,因此作者自己拓展完善了一番后分享给各位. S ...
- easyupload
打开界面就是一个文件上传 的界面 然后在bp试了很多种方法都没有成功,还是看了wp 这里需要利用到.use.ini那为什么不用.heaccess?好像这种方法被过滤了,当时我用的时候没有成功 这里的话 ...
- AtCoder Beginner Contest 237 G - Range Sort Query
原题链接 G - Range Sort Query 思路: \(x\)是固定的,所以考虑将排序维护成0 1串,为\(p_i < x\)为\(0\),那么\(p_i \geq x\)为\(1\), ...
- iOS程序入口结构
盛年不重来,一日难再晨.及时宜自勉,岁月不待人. 1. 程序入口 在我们开始开发app的时候,第一步往往是通过设置AppDelegate.m的代理方法开始写一些启动的东西,然后再通过控制器View ...
- UIPath初识和安装
即使没有人为你鼓掌,也要优雅的谢幕,感谢自己的认真付出. 一. UiPath组成 学习UiPath,我们一定先要了解Studio,Robot和Orchestrator这3个重要组成部分. UiPa ...
- .NET微信网页开发相关文章教程
前言 今天我们主要总结一下.NET微信网页开发的相关文章教程. 微信网页开发详细文档可以看微信官方文档:https://developers.weixin.qq.com/doc/offiaccount ...