摘要:高性能计算(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如何应用在气象行业的更多相关文章

  1. 当创业遇上O2O,新一批死亡名单,看完震惊了!

    当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...

  2. 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)

      邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...

  3. 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)

        我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...

  4. 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)

    邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...

  5. 初识genymotion安装遇上的VirtualBox问题

    想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...

  6. LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)

    当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...

  7. LoadRunner - 当DiscuzNT遇上了Loadrunner(中) (转发)

    当DiscuzNT遇上了Loadrunner(中) 在上文中,介绍了如果录制脚本和设置脚本执行次数.如果经过调试脚本能够正常工作的话,就可以设置并发用户数并进行压力测试了. 首先我们通过脚本编辑界面上 ...

  8. 谁还没遇上过NoClassDefFoundError咋地——浅谈字节码生成与热部署

    谁还没遇上过NoClassDefFoundError咋地--浅谈字节码生成与热部署 前言 在Java程序员的世界里,NoClassDefFoundError是一类相当令人厌恶的错误,因为这类错误通常非 ...

  9. dynamic遇上ADO.NET

    传说中的dynamic dynamic是个不合群.不按规则办事的家伙,可以说是个异形,但更恐怖的是它又是无所不知的,任何事情都难不了它(咳咳,它似乎与Lambda表达式是死对头).这令人想起<死 ...

  10. 前端遇上Go: 静态资源增量更新的新实践

    前端遇上Go: 静态资源增量更新的新实践https://mp.weixin.qq.com/s/hCqQW1F8FngPPGZAisAWUg 前端遇上Go: 静态资源增量更新的新实践 原创: 洋河 美团 ...

随机推荐

  1. Jenkins相关概念

    1,Jenkins相关工具概念: 要熟练掌握Jenkins持续集成的配置.使用和管理,需要了解相关的概念.例如代码开发.编译.打包.构建等名称,常见的代码相关概念包括:JDK.JAVA.MAKE.AN ...

  2. 周藤 CSP-2023游记

    Day -inf~Day -2 基本上是考试状态,每天我都是自己取随机题目做,不过也保证了落实量 每场模拟赛发挥基本上是不是特别稳定,考得好的时候AK了,考不好的时候只有300分,反正同届差不多第一吧 ...

  3. TS实现汉诺塔算法,以及图灵完备讨论

    之前在网上看到徐大佬更新的一篇文章: 用 TypeScript 类型运算实现一个中国象棋程序 在线预览地址:https://tsplay.dev/Nd4n0N 把鼠标放在最后几行的走棋结果上,惊喜的一 ...

  4. Production Environment Difference Between Development, Stage, And Production

    There are three different environments that you'll probably deal with at some point. Each environmen ...

  5. 沫沫漫画网Js逆向分析爬取全站资源入库处理图片合并

    网站分析 打开目标网站:https://www.momomh.com/ 选择一部漫画作为分析对象:<渴望:爱火难耐> 进到漫画详情页这里,发现并没有需要逆向分析.直接可以获取漫画信息.随便 ...

  6. (Good topic)字符串的最大公因子 (3.21leetcode每日打卡)

      对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 s ...

  7. Codeforces Round #736 (Div. 2). D - Integers Have Friends

    原题:D - Integers Have Friends 题意: 给定一个数组,求一个最长子数组满足\(a_i \,\, mod \,\, m \,\, = \,\, a_{i + 1} \,\, m ...

  8. 【Spring Boot】【外包杯】学习day01 | 项目目录结构划分以及代码分层

    起因:扒了一个开源的项目,但是啃起来很硬,所以决定开始学习相关的知识. 我们之前的SSM项目,搭建过程较为繁琐: 1)配置 web.xml,加载 spring 和 spring mvc 2)配置数据库 ...

  9. Java 21 官方速览:全面拥抱虚拟线程

    前言 首先,感谢一下不少xdm私信关心我的身体状况,我也不是什么厉害的大佬,点开通知看到一堆私信还是蛮感动的. 近来有意大幅缩短了更新频率,增加了日常调养身体的时间,淋巴结确实变小了,睡眠也逐渐正常, ...

  10. 手把手教你搭建 Ceph+JuiceFS

    Ceph 提供了对象存储,可作为存储引擎在 JuiceFS 中使用.这一组合非常适合云计算.大数据分析和机器学习等数据密集型应用场景. 在日常部署中可直接通过 Ceph RADOS 配合 JuiceF ...