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

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介:

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用户迁云成本上的顾虑。

目录
相关文章
|
1月前
|
弹性计算 人工智能
弹性加速计算实例
本文为您介绍EAIS实例的使用流程,帮助您快速掌握EAIS实例的使用逻辑并应用于自身业务场景。
40 7
|
1月前
|
存储 弹性计算 监控
【阿里云弹性计算】深入阿里云ECS配置选择:CPU、内存与存储的最优搭配策略
【5月更文挑战第20天】阿里云ECS提供多种实例类型满足不同需求,如通用型、计算型、内存型等。选择CPU时,通用应用可选1-2核,计算密集型应用推荐4核以上。内存选择要考虑应用类型,内存密集型至少4GB起。存储方面,系统盘和数据盘容量依据应用和数据量决定,高性能应用可选SSD或高效云盘。结合业务特点和预算制定配置方案,并通过监控应用性能适时调整,确保资源最优利用。示例代码展示了使用阿里云CLI创建ECS实例的过程。
100 5
|
1月前
|
弹性计算 API
弹性伸缩期望实例数
弹性伸缩期望实例数
41 18
|
1月前
|
运维 监控 Serverless
一键开启 GPU 闲置模式,基于函数计算低成本部署 Google Gemma 模型服务
本文介绍如何使用函数计算 GPU 实例闲置模式低成本、快速的部署 Google Gemma 模型服务。
164843 57
|
1月前
|
弹性计算
弹性伸缩使用场景
弹性伸缩使用场景
27 5
|
1月前
|
Cloud Native Serverless API
Serverless 成本再优化:Knative 支持抢占式实例
Knative 是一款云原生、跨平台的开源 Serverless 应用编排框架,而抢占式实例是公有云中性价比较高的资源。Knative 与抢占式实例的结合可以进一步降低用户资源使用成本。本文介绍如何在 Knative 中使用抢占式实例。
92740 3
|
1月前
|
机器学习/深度学习 人工智能 资源调度
GPU计算资源智能调度:过去、现在和未来
随着AI和大数据技术发展,GPU成为关键计算组件。文章探讨了GPU计算资源调度从静态到动态再到智能调度的演变,现以机器学习优化资源利用率。未来趋势包括自适应调度、跨平台、集群级调度和能源效率优化,旨在提升GPU性能,推动人工智能和大数据领域进步。
|
1月前
|
弹性计算 人工智能 调度
秒级弹性!探索弹性调度与虚拟节点如何迅速响应瞬时算力需求?
秒级弹性!探索弹性调度与虚拟节点如何迅速响应瞬时算力需求?
49380 1
|
1月前
|
编解码 监控 调度
GPU实例使用--vGPU资源利用率的提升、监控与告警的实现
随着AI计算及云游戏为代表的图形渲染业务的飞速发展,越来越多的企业和个人开始使用GPU实例。同时,由于GPU算力资源成本较高,对于负载相对较小的业务,客户会更倾向于选择使用1/2或者1/4甚至更小的vGPU实例来运行其业务,vGPU技术随之得以迅速发展。
|
10月前
|
弹性计算 人工智能 运维
基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源
在前一篇文章《基于ACK One注册集群实现IDC中K8s集群添加云上CPU/GPU节点》中,我们介绍了如何为IDC中K8s集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通过自动弹性伸缩,提高使用率,降低云上成本。这种直接添加节点的方式,适合需要自定义配置节点(runtime,kubelet,NVIDIA等),需要特定ECS实例规格等场景。同时,这种方式意味您需要自行

热门文章

最新文章