EHPC通过断点续算和自动伸缩在抢占式实例上实现低成本HPC计算

简介:

E-HPC 低成本计算方案

E-HPC作为阿里云上的云超算产品将HPCaaS公共云服务提供给客户,将公共云上资源弹性优势,高性能的优势,计算资源的多样性等优势提供给HPC用户,如果HPC用户追求极致性能的HPC集群,我们可以提供SCC,裸金属服务器,EGS异构计算资源。对于成本相对比较敏感的客户, E-HPC提供自动伸缩+抢占式实例+断点续算低成本计算方案,从而可以将云上普惠的高性能计算服务提供给绝大部分HPC用户:

  • 抢占式实例保证用户的计算资源可以控制在很低的成本之下,关于抢占式实例的详细介绍,参考抢占式实例
  • 自动伸缩可以帮助用户自动扩容,无需用户干预,用户只需要提交作业,设定抢占式实例的竞价策略, 关于E-HPC的自动伸缩,参考E-HPC自动伸缩
  • 断点续算可以保证作业被中断之后,有新的竞价实例扩容成功之后,作业可以继续运算,而不是重新开始运算。
    目前,在HPC领域,有很多研究关于MPI支持断点续算(checkpoint/restart)技术,MVAPICH2基于BLCR实现checkpoint/restart,并提供checkpoint文件管理;OpenMPI设计了模块化的checkpoint/restart机制,并有基于BLCR的实现。HPC有些领域的应用本身是支持断点续算的,例如LAMMPS, GROMACS,渲染应用里的V-Ray也是支持断点续算的。HPC常用的调度器集群也对断点续算有集成支持,Slurm与BLCR集成,也可以直接使用SCR等checkpoint系统对作业进行断点续算。LSF支持作业检查点和恢复执行。

具体案例

以下将以案例的形式介绍如何在E-HPC进行低成本计算:

  • LAMMPS在E-HPC上的计算
  • GROMACS GPU在E-HPC上的计算
  • 用户自己开发的MPI程序如何在E-HPC上低成本计算

创建E-HPC集群

通过E-HPC控制台 创建集群

  • 选择“竞价实例”,设定价格策略,系统自动出价或者设置最高价格
    image
  • 选择软件包,例如LAMMPS, GROMACS-GPU
    image
  • 集群创建成功之后,创建用户,用于提交作业
    image

案例一: LAMMPS

算例输入文件

本文以3d Lennard-Jones melt为例
修改算例输入文件如下, 设置每迭代100步生成一个checkpoint文件

# 3d Lennard-Jones melt

units           lj
atom_style      atomic

lattice         fcc 0.8442
region          box block 0 20 0 20 0 20
create_box      1 box
create_atoms    1 box
mass            1 1.0

velocity        all create 1.44 87287 loop geom

pair_style      lj/cut 2.5
pair_coeff      1 1 1.0 1.0 2.5

neighbor        0.3 bin
neigh_modify    delay 5 every 1

fix             1 all nve

dump 1 all xyz 100 /home/testuser1/sample.xyz
run             10000 every 100 "write_restart /home/testuser1/lennard.restart"
  • 准备从checkpoint续算的输入文件
# 3d Lennard-Jones melt

read_restart lennard.restart
run             10000 every 100 "write_restart /home/testuser1/lennard.restart"
  • 准备pbs的作业脚本 job.pbs, 根据是否存在checkpoint文件决定使用哪个输入文件
\#!/bin/sh
\#PBS -l ncpus=1
\#PBS -o lammps_pbs.log
\#PBS -j oe

export MODULEPATH=/opt/ehpcmodulefiles/
module load lammps-openmpi/31Mar17
module load openmpi/1.10.7

if [ ! -e "/home/testuser1/lennard.restart" ]; then
  echo "run at the beginning"
  mpirun lmp -in ./lj.in
else
  echo "run from the last checkpoint"
  mpirun lmp -in ./lj.restart.in
fi

提交作业,运行期间无中断

qsub job.pbs
作业运行结束,查看作业信息, 可以看到作业一共运行了5分28秒
image

提交作业,使用自动伸缩+竞价实例+断点续算模式

  • 在E-HPC控制台设置集群自动伸缩策略,选择扩容竞价实例,竞价策略会系统自动出价

image

  • 待所有计算节点释放之后,提交作业 (先删除前一个作业的续算文件lennard.restart)
  1. job.pbs
  • 两分钟左右可以看到自动扩容竞价实例

image

  • 作业运行1分钟左右,在ECS控制台释放计算节点对应的竞价实例,模拟竞价实例被释放 (实际当中,竞价实例会保证至少可用1个小时),查看作业运行信息,看到作业已经运行1分47秒

image

  • 随后作业会回到queued状态,等待可用计算资源
  • 自动伸缩服务会尝试继续扩容竞价实例直到扩容成功,然后作业会继续执行
  • 作业执行成功,查看作业信息,作业执行了3分56秒,可以看出是从断点的地方续算的

image

由于迭代次数比较少,结果可视化如下
image.png

主要是以用例的方式介绍了如何在E-HPC上低成本的计算LAMMPS算例,最后我们比较一下成本,本用例用的最小ECS实例规格ecs.n1.tiny, 抢占式实例最低价格为按量的1折(不同规格折扣会不同,也随时间实时变化)

计算时间增加百分比 计算成本降低百分比
LAMMPS作业 4.57%↑ 88.30%↓

可以看出在运算总时间增加不大的前提下,计算成本大大降低,当然在作业提交到最终运行结束的总时长会比使用按量实例计算要长,所以很适合从时间上来说并不紧迫的作业。

案例二:GROMACS GPU

GROMACS(全称:英语:GROningen MAchine,全称格罗宁根华讯模拟体系)是一套分子动力学模拟程序包,主要用来模拟研究蛋白质、脂质、核酸等生物分子的性质。
创建E-HPC集群的时候,硬件配置阶段计算节点实例配置选择ecs.gn5-c4g1.xlarge (4核,30GB,1块P100);软件配置阶段选中GROMACS-GPU软件包

算例: 水分子运动

本算例为模拟大量水分子在给定空间、温度内的运动过程

  • 下载water 算例
    可以从GROMACS ftp直接下载解压
wget http://ftp.gromacs.org/pub/benchmarks/water_GMX50_bare.tar.gz
tar xzvf water_GMX50_bare.tar.gz
  • 在算例输入文件里设置迭代次数
vi water-cut1.0_GMX50_bare/1536/pme.mdp
设置nsteps=80000
  • 算例的PBS作业脚本
#!/bin/sh
#PBS -l ncpus=4,mem=24gb
#PBS -j oe

export MODULEPATH=/opt/ehpcmodulefiles/
module load cuda-toolkit/9.0
module load gromacs-gpu/2018.1
module load openmpi/3.0.0

cd /home/testuser1/test/water-cut1.0_GMX50_bare/1536
gmx_mpi grompp -f pme.mdp -c conf.gro -p topol.top -o topol_pme.tpr
mpirun -np 1 gmx_mpi mdrun -ntomp 4 -noconfout -v -pin on -nb gpu -s topol_pme.tpr -cpi state.cpt -cpt 2 -append

参数说明

-cpi 选项用于指定checkpoint文件名,默认文件名是state.cpt
-cpt 选项指定checkpoint文件生成和更新间隔时间,用于下一次续算,单位是分钟
-append 选项指定续算产生的结果会继续写入先前的输出文件

注意:在输入文件里面指定迭代次数,表示当前作业总的迭代次数
不要在命令行执行迭代次数, 例如
mpirun -np 1 gmx_mpi mdrun -ntomp 4 -noconfout  -nsteps=80000 -v -pin on -nb gpu -s topol_pme.tpr -cpi state.cpt -cpt 2 -append
如果在命令行指定nsteps,表示的是一次执行过程中的总迭代次数。
会导致每次续算的时候都会继续执行总的迭代次数,而不是多次续算一共执行的迭代次数。

运行作业

  • 首先完整执行一次该算例的作业(不发生断点再续算的情况) qsub job.pbs

image

GROMACS 断点续算

下面模拟在运算过程中节点会被释放导致断点续算的情形,

  • 首先提交作业 qsub job.pbs
  • 自动伸缩服务会自动扩容一个ecs.gn5-c4g1.xlarge节点,观察作业使用的CPU时间 qstat -f 大概使用1个小时左右CPU时间的时候,登录ECS控制台,把计算节点对应的EGS实例强行释放,观察一下当前作业的信息

image

  • 由于没有可用计算资源,作业会进入queued状态,自动伸缩服务继续尝试扩容抢占式实例
  • 实例扩容成功,作业继续执行,直到运算完毕

image

比较作业计算时间和计算成本

下表列出了断点续算 (使用抢占式实例)和非断点续算(使用按量实例)同样的GROMACS案例的计算时长和计算成本比较

计算时间增加百分比 计算成本降低百分比
GROMACS作业 13.28%↑ 87.17%↓

可以看出断点续算总的作业时长是会增加的,主要原因是

  • 作业运行过程中是每隔一段时间执行一次checkpoint, 在此次测试里面,是每隔2分钟执行一次checkpoint,所以在抢占式实例被释放的时候,可能会最大损失2分钟的计算
  • 执行checkpoint,存储作业信息到文件本身也要消耗CPU核时的
    计算成本降低了87%,如果用户的作业并不紧急,并且对计算成本相当敏感,可以选择这种计算方案

案例三:用户自定义MPI程序

前面介绍了如何利用应用本身的续算功能在E-HPC上进行断点续算,对于用户自己开发的应用程序如何做到断点续算呢?尤其是用户自己的MPI跨节点运行程序如何做到断点续算呢?

开源的Checkpoint/Restart 框架

目前,有很多开源的library提供Checkpoint/Restart功能,并且常用的HPC集群调度器也支持与他们集成:

  1. Berkeley Lab Checkpoint/Restart (BLCR)

    • 支持linux下的程序打断点以及之后从断点处续算
    • 可以针对整个批处理作业定时打断点
    • 如果节点异常,可以自动requeue和restart作业
    • Slurm, LSF, SGE等调度器类型都支持BLCR
      BLCR也有很多限制,对支持的linux distro有限制,并且已经很多年没有继续维护了,最新版本是2003年的,更详细信息参见 BLCR Frequently Asked Questions.
  2. SCR: Scalable Checkpoint/Restart for MPI
    SCR是LLNL(Lawrence Livermore National Laboratory )开发的一套针对MPI程序的Checkpoint/Restart的库,提供一套完整的API供用户程序调用,用户自己决定何时何地触发checkpoint,适合用户自己开发的MPI程序使用

image
Checkpoint/Restart框架一般都会面临一个问题,对正在执行的进程定时checkpoint的时候,对性能(CPU cost, disk/bandwidth cost)是有一定影响的,为了降低打checkpoint对性能的影响,SCR提供了多级checkpoint机制:高频的checkpoint文件存储在节点本地磁盘,并在节点间做备份冗余,低频的checkpoint文件存储在共享文件系统中。
SCR主要提供了以下API:

  • SCR_Init

    初始化SCR library,在MPI_Init之后立即调用
  • SCR_Finalize

    关闭SCR library, 在MPI_Finalize之前调用
  • SCR_Route_file

    获取要写入或者读取的checkpoint文件全路径, 每个MPI进程的checkpoint文件名可以设置和当前进程的rank相关
  • SCR_Start_checkpoint

    通知SCR新的checkpoint开始
  • SCR_Complete_checkpoint

    通知SCR checkpoint文件已经写入完毕
  • SCR_Have_restart

    查询当前进程是否有可用的checkpoint
  • SCR_Start_restart:

    进程从指定的检查点开始启动
  • SCR_Complete_restart

    通知SCR进程已经成功读取checkpoint文件,要保证所有的MPI进程都调用SCR_Complete_restart之后才能进行后续的运算

还有一些其他的Checkpoint/Restart开发库,
例如:
DMTCP: Distributed MultiThreaded CheckPointing
CRIU
这里就不展开了

E-HPC + SCR 断点续算MPI程序

本文主要介绍如何在E-HPC上利用SCR对用户的MPI程序进行断点续算。

  1. 首先通过E-HPC控制台,创建SLURM集群 (4 compute nodes), 安装软件mpich 3.2
  2. 源代码编译安装SCR
    以下操作都要ssh到登录节点上执行,
  • 从github上clone代码
git clone https://github.com/LLNL/scr.git
  • 安装依赖软件
yum install cmake
yum install -y zlib-devel
yum install -y pdsh
  • 编译安装
export MODULEPATH=/opt/ehpcmodulefiles/
module load mpich/3.2

mkdir build
mkdir /opt/scr
cd build
cmake -DCMAKE_INSTALL_PREFIX=/opt/install ../scr
make
make install
make test // 部分testcase会fail,可以忽略
  • 运行测试程序
    作业脚本如下,
#!/bin/bash

export MODULEPATH=/opt/ehpcmodulefiles/
module load mpich/3.2

LD_LIBRARY_PATH=/opt/scr/lib
SCR_FLUSH=0

mpirun ./test_api

执行以下命令提交作业

sbatch -N 4 -n 4 ./job.sh

作业输出内容如下

Init: Min 0.062187 s    Max 0.062343 s  Avg 0.062253 s
No checkpoint to restart from
At least one rank (perhaps all) did not find its checkpoint
Completed checkpoint 1.
Completed checkpoint 2.
Completed checkpoint 3.
Completed checkpoint 4.
Completed checkpoint 5.
Completed checkpoint 6.
FileIO: Min    4.05 MB/s        Max    4.05 MB/s        Avg    4.05 MB/s        Agg   16.21 MB/s

可以看到第一次运行,没有checkpoint文件,从头开始运行,中间阶段会产生6次checkpoint文件,
当前目录下最后保留第6次checkpoint文件, 每个MPI进程一个checkpoint文件
image

继续提交相同的作业执行一次,

sbatch -N 4 -n 4 ./job.sh

作业输出内容如下,

Init: Min 0.244968 s    Max 0.245073 s  Avg 0.245038 s
Restarting from checkpoint named ckpt.6
Completed checkpoint 7.
Completed checkpoint 8.
Completed checkpoint 9.
Completed checkpoint 10.
Completed checkpoint 11.
Completed checkpoint 12.
FileIO: Min    3.17 MB/s        Max    3.17 MB/s        Avg    3.17 MB/s        Agg   12.69 MB/s

由于有checkpoint文件存在,所以从checkpoint ‘ckpt.6’开始续算的。
这个示例主要是演示如何在E-HPC上断点续算用户自己写的MPI作业,SCR提供checkpoint/restart框架,提供完整的API用于触发checkpoint或者restart, 当然真正写到checkpoint文件里的内容是由用户自己在程序中决定的,这个是和应用程序本身的逻辑相关的。

总结

通过利用E-HPC自动伸缩服务,阿里云上的抢占式实例,应用本身支持的断点续算能力或者针对MPI程序的Checkpoint/Restart框架,可以做到在阿里云E-HPC平台上进行HPC低成本的计算模型,将云上普惠的高性能计算服务提供给绝大部分HPC用户,减少传统HPC用户迁云成本上的顾虑。

目录
相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
32714 80
如何保证分布式文件系统的数据一致性
|
前端开发 容器
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局(上)
HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第8章FlexBox布局
17766 21
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36697 21
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24772 14
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36678 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29850 52

热门文章

最新文章

下一篇
开通oss服务