高性能集群系统使用简易记录

  集群系统通常使用SLURM作业调度脚本来提交、查看、修改作业。以下记录它的脚本与命令的编写与使用。

常用命令

  以下是各种常用命令:

squeue #查看当前执行中的任务情况
sinfo #查看所有分区的情况
sacct #查看24小时内的历史任务
scancel job 56200 #取消id为56200的任务
scontrol show node #显示所有节点信息
scontrol show node node5 #显示节点5的信息

大型作业

  对于大型作业,要把任务提交到服务器排队才能计算。所以要写任务脚本,提交任务的命令如下:

sbatch test.job

  脚本实例如下:

#!/bin/bash
#SBATCH --job-name=Helloworld     ##作业的名称
#SBATCH --ntasks=1                ##总进程数,就是同样的作业要一起跑几个,一般炼丹一个就行了
#SBATCH --nodes=1                 ##指定节点数量,一个进程只能分配给一个节点,不能分配给多节点多CPU运行
#SBATCH --ntasks-per-node=1       ##每个结点的进程数,一个进程那么每个结点进程数一定是1,不填也没事
#SBATCH --cpus-per-task=2         ##每个进程使用的CPU核心数,炼丹当然是越多越好,但是要的多分配的也慢
#SBATCH --partition=low           ##使用哪个分区,可以sinfo看看有哪些分区
##SBATCH --gres=gpu:1              ##指定GPU,不写就不分配
##SBATCH --nodelist=node56         ##使用指定的节点,自己指定的话通常优先度会高一些,缺点就是即使别的节点空闲了也不会分配给你。当然节点要在上面指定的分区内部才行
#SBATCH --output=test.out         ##标准输出的存放的文件,可以用%j表示任务ID
#SBATCH --error=test.err          ##错误提示的存放的文件
#SBATCH --qos=debug               ##服务质量,debug就是交互式模式,分配资源少些,但是优先度高,另外还有normal普通模式,资源多但优先度低

source /public/home/chenqz/.bashrc ##要用的软件的环境变量,直接把用户的.bashrc给source了就好了

python3 test.py       ##要执行的任务,看你终端所在的位置,如果已经在任务的文件夹中就不需要完整路径了,上面的123.out和.err也一样,都是输出到这一位置。

  如果作业提交了想更改作业属性,当作业还没开始时,可以这样修改:

scontrol update jobid=56407 cpus-per-task=8 gres=gpu:1

交互式计算

直接进入计算节点

  可以通过ssh从登陆节点访问计算节点(可能运维没有设置好,普通用户也能进。当然这样是不太好的,会影响别的用户作业)。首先要访问节点1,在节点1内才能访问其它计算节点:

ssh comput1 #进入节点1
ssh comput55 #进入节点1后,再进入其它节点,节点55

  计算节点后可以直接在命令行执行代码,从而在计算节点运行。但是通常计算节点都是有人占用的,所以以这种未申请的方式使用计算节点计算效率不高。

  但是,可以用sview看看有哪些空闲的节点,进去执行代码的话,速度就拉满了。为什么会空闲呢?我想可能因为有的人要申请很多资源,而集群只能一部分一部分分配,所以在他的资源完全准备好之前,这些空闲的节点我们就可以蹭蹭。然而,尽管一个节点CPU有28核,但没有GPU对于炼丹来说还是太慢了,而要用GPU资源还是得申请过才行。

  集群只使用28核CPU跑VAE,18秒一次迭代,已经把CPU占满了:

  Kaggle上GPU跑VAE,只要3秒一次迭代:

  看来CPU和GPU差的还是太多了。

申请资源后再进入

  申请资源后再以以上方式进入节点,就可以在比较好的资源下运行交互式代码。使用salloc命令,以下是实例:

salloc -J GoodJob -N 1 --cpus-per-task=8 -p low --qos=normal

  各种参数格式如下(和上面的任务提交脚本类似,就是少了#SBATCH):

-J <任务名>    #--job-name=<任务名> 的简写,下面一条-的都是简写,而且不用=
-N <节点数量>  #炼丹一般也就一个节点
--ntasks=<进程数>  #炼丹就不需要了定义了,默认一个进程就够了
--ntasks-per-node=<单节点进程数> #一个进程的话也不需要定义这个了
--cpus-per-task=<单进程CPU核心数>
--gres=gpu:<单节点 GPU 卡数>
-p <使用的分区>
--qos=<使用的 QoS>

  申请后的资源也是以作业的形式占用,可以squeue查看:

高性能集群系统使用简易记录_第1张图片

   看到申请的节点是58,然后进入这个节点,运行代码:

高性能集群系统使用简易记录_第2张图片

   可以再开一个shell看看跑代码时的CPU占用:

高性能集群系统使用简易记录_第3张图片

  占用率很高666.6%,而如果不申请的话,占用率不会超过10%。

你可能感兴趣的:(高性能集群系统使用简易记录)