Slurm超算集群跑代码教程
SLURM(Simple Linux Utility for Resource Management)是一种可扩展的工作负载管理器,已被全世界的国家级超级计算机中心广泛采用。 在算力中心GPU计算集群上,用户的所有计算任务和程序需要编写 SLURM 脚本,并在登 陆节点提交 SLURM 脚本。SLURM 脚本包含三个部分:
(1)预定义的任务资 源需求;
(2)预定义的环境设定或变量;
(3)命令行形式的可执行程序或脚本。
登陆集群
首先用easyconnect登陆集群专属vpn,例如(此处需要vpn的用户和密码)
登陆完vpn之后,才有权限使用ssh远程连接集群
使用远程ssh登陆集群,
此处需要服务器的用户名和密码
登陆完后,连接的是mgmt01节点,例如
配置anaconda以及python虚拟环境
和正常我们配置服务器环境的方法一样
anaconda可以放在home盘,环境都放home盘,代码数据要放在自己的data盘
配置环境可以参考我的科研第一步
配置完环境之后,运行代码的时候,不能直接使用python指令,而是需要在激活虚拟环境的前提下,编写slurm脚本来提交运算任务
Slurm脚本编写规范
CPU任务:
--nodes=1
,表明使用一个运算节点(节点等于机器数)
--tasks=1
,表明使用一个计算任务
--cpu-per-task=1
,表明每个每个任务使用的cpu核数
--mem-per-cpu=4G
,表明使用的每个cpu核的内存是4G
因此申请资源的部分就是前面这些带着#SBATCH的行,如果需要多线程任务,或者多核任务的话,可以更改cpu-per-task和mem-per-cpu,但是注意每个节点有cpu核数量上限。如果使用多任务的话,需要更改ntasks
GPU任务
单机n卡样例(已经足够用,最多单机8卡,A100 8卡已经很猛了)
#!/bin/bash
#SBATCH --job-name=Fans # create a short name for your job
#SBATCH --nodes=1 # node count
#SBATCH --ntasks=4 # total number of tasks across all nodes
#SBATCH --cpus-per-task=4 # cpu-cores per task (>1 if multi-threaded tasks)
#SBATCH --mem-per-cpu=4G
#SBATCH --gres=gpu:4 # number of GPUs per node
#SBATCH --mail-type=ALL
#SBATCH --mail-user=shuaifan@stu.xmu.edu.cn
python -m torch.distributed.launch --nproc_per_node=4 --master_port=8880 Electra_Pretrain.py
这里的配置就可以解读为,
使用单机(一个nodes),
4个task(因为在4个GPU上面运行程序),
每个任务使用4个cpu核,
每个cpu是4G
gpu要申请4个
下面的python运行代码,是因为要使用DDP所以需要加
–master_port使用nccl的时候一定要加,因为我们如果需要提交多个运算任务的话,这个port要设成不一样,不然只有一个运算任务被执行
同理多机n卡
只需要更改node数目和task数目以及gpu数目
但是在自己的代码中要写成多机多卡版本(涉及到多机之间的通讯)即rank和local_rank
提交运算任务
编写完slurm脚本之后,保存成job_name.slurm
然后使用
sbatch job_name.slurm
提交到队列中
可以使用squeue -u user_name来查询自己的运算任务的运行情况,user_name是你的用户名
例如提交之后查询,会有下面的队列
jobid
表示你的运算任务id,如果这个任务死机(存在,比如迟迟不运行(out文件一直都是0byte)),可以使用scancel jobid
杀掉这个运算任务
ST表示state,PD表示等待
若ST=PD且ndelist(reason)=QOSGrpGRES
,那么说明超出了资源配额,建议将申请的资源减少(最多8卡,16卡基本没戏)
然后运行的时候会在当前目录输出一个.out文件,方便你查看运行情况,例如:
会默认以jobid命名,比较方便找
特别注意
- 在运行python代码中,不允许使用python代码下载模型以及数据
因此在调用别人的开源模型和数据集的时候,提前下好,然后上传到集群中,才可以 - 因为提交集群比较繁琐,因此推荐在自己本地debug,并且确认多卡能跑通之后,再用这个服务器,不然会因为程序问题一直占用gpu资源
- gpu资源涉及到抢占,因此尽量将代码运行的结果输出到txt文件中方便查看运行到哪一步被抢掉了