hpc tutorial
注册
https://nic.csu.edu.cn/info/1146/1789.htm
登录
在终端中输入ssh -p port username@host
简化登录流程
在~/.ssh
目录下新建config
文件,示例:
1 2 3 4
| Host 规则名称 HostName 网址 User 用户名 Port 端口号
|
保存后即可用ssh 规则名称
登录
配置无密码登录
以linux系统为例
- 在客户端生成密钥,在终端中输入
ssh-keygen -t rsa
,然后一路回车
- 将
~/.ssh
文件夹下的id_rsa.pub
中的内容复制到服务器的~/.ssh/authorized_keys
中
slurm简介
slurm是集群使用的作业调度系统,申请节点计算资源(cpu与gpu资源)并运行自己的程序需要编写shell脚本实现,即*.sh
文件
重要的目录
- Softwares:/public/software; # anaconda3等软件在这个目录下.
- Job templates: /public/job_templates; # 样例脚本, 参考信网中心提供的指南来使用样例脚本
常用命令
查看集群所有节点的状态
sinfo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| PARTITION AVAIL TIMELIMIT NODES STATE NODELIST cpuQ* up infinite 3 down* node[0167,0445,0549] cpuQ* up infinite 2 drain node[0364,0391] cpuQ* up infinite 6 mix node[0069,0395,0625,0743,0874-0875] cpuQ* up infinite 989 alloc node[0001-0068,0070-0166,0168-0363,0365-0390,0392-0394,0396-0444,0446-0548,0550-0624,0626-0742,0744-0873,0876-1000] ResQ up infinite 1 drain node1009 ResQ up infinite 1 mix node1008 ResQ up infinite 13 alloc node[1002,1004-1007,1011-1012,1017-1022] ResQ up infinite 7 idle node[1001,1003,1010,1013-1016] gpu2Q up infinite 5 mix gpu[201,205-208] gpu2Q up infinite 5 alloc gpu[202-204,209-210] gpu4Q up infinite 1 down* gpu407 gpu4Q up infinite 3 mix gpu[402,409-410] gpu4Q up infinite 8 alloc gpu[401,403-406,408,411-412] gpu8Q up infinite 4 mix gpu[801-804] fatQ up infinite 1 mix fat09 fatQ up infinite 9 alloc fat[01-08,10]
|
cpuQ,ResQ,fatQ都为cpu分区,gpu2Q~gpu8Q为gpu分区. 如果想使用gpu,必须将作业提交到gpu分区
STATE
- [ ] down: 节点故障不可用
- [ ] drain: 正在运行的作业不受影响,但不接受新作业
- [x] mix: 节点cpu资源部分已分配,剩下的cpu为idle
- [ ] alloc: 节点所有资源都被占用,新提交的作业将排队
- [x] idle: 当前节点空闲
- [ ] unk: 节点刚刚启动,状态未知
查看自己提交的任务
使用squeue
查看JOBID
使用scontrol show job JOBID
追踪任务
取消任务
scancel JOBID
更新任务
scontrol update jobid=JOBID …
由于可修改的属性非常多,我们可以借助 SLURM 自动补全功能来查看可修改的内容。 这只需要我们在输入完 JOBID 后空一格并敲两下< TAB >键。
1 2 3 4 5 6 7 8 9 10 11 12 13
| account=<account> mintmpdisknode=<megabytes> reqnodelist=<nodes> conn-type=<type> name> reqsockets=<count> contiguous=<yes|no> name=<name> reqthreads=<count> dependency=<dependency_list> nice[=delta] requeue=<0|1> eligibletime=yyyy-mm-dd nodelist=<nodes> reservationname=<name> excnodelist=<nodes> numcpus=<min_count[-max_count] rotate=<yes|no> features=<features> numnodes=<min_count[-max_count]> shared=<yes|no> geometry=<geo> numtasks=<count> starttime=yyyy-mm-dd gres=<list> or switches=<count>[@<max-time-to-wait>] licenses=<name> partition=<name> timelimit=[d-]h:m:s mincpusnode=<count> priority=<number> userid=<UID minmemorycpu=<megabytes> qos=<name> wckey=<key> minmemorynode=<megabytes> reqcores=<count>
|
查看历史任务
sacct
安装python环境
- 推荐在当前用户文件夹下创建一个目录并将环境安装到该目录下 command: mkdir ~/envs
- 使用conda创建一个新的虚拟环境 command: /public/software/anaconda3/bin/conda create —prefix /path/to/your/dir (e.g., ~/envs/)
- 先用
/public/software/anaconda3/bin/conda init
命令来初始化一下bash
- 使用
source activate /path/to/your/env
来激活环境
编写一个测试脚本
- 创建py文件
vim ~/hello.py
1 2 3
| import torch print("cuda",torch.cuda.is_available()) print("Hello world!")
|
注意: 此时在本地运行hello.py, torch.cuda.is_available()
的结果为False, 因为登录节点是没有gpu的, 需要通过slurm脚本申请gpu并在计算节点上运行hello.py, 返回值才能为True.
- 创建slurm脚本文件
vim ~/hello.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #!/bin/bash
eval "$(/public/software/anaconda3/bin/conda shell.bash hook)" conda activate /path/to/your/env
python ~/hello.py
|
通知邮件内容
1 2
| Subject: Slurm Job_id=33653 Name=prototype Ended, Run time 00:22:18, COMPLETED, ExitCode 0 From: SLURM workload manager <slurm@mu01.localdomain>
|
- 提交任务
sbatch ~/hello.sh
- 查看任务状态
squeue
1 2
| JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 33458 cpuQ prototyp hpc19471 PD 0:00 1 (None)
|
scontrol show job 33458
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| JobId=33452 JobName=prototype UserId=hpc194711074(1293) GroupId=hpc(500) MCS_label=N/A Priority=666 Nice=0 Account=hpc194711074 QOS=normal JobState=PENDING Reason=None Dependency=(null) Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0 RunTime=00:00:00 TimeLimit=00:01:00 TimeMin=N/A SubmitTime=2020-11-13T20:16:58 EligibleTime=2020-11-13T20:16:58 AccrueTime=2020-11-13T20:16:58 StartTime=Unknown EndTime=Unknown Deadline=N/A SuspendTime=None SecsPreSuspend=0 LastSchedEval=2020-11-13T20:16:58 Partition=cpuQ AllocNode:Sid=ln01:86688 ReqNodeList=(null) ExcNodeList=(null) NodeList=(null) NumNodes=1-1 NumCPUs=4 NumTasks=1 CPUs/Task=4 ReqB:S:C:T=0:0:*:* TRES=cpu=4,node=1,billing=4 Socks/Node=* NtasksPerN:B:S:C=1:0:*:* CoreSpec=* MinCPUsNode=4 MinMemoryNode=0 MinTmpDiskNode=0 Features=(null) DelayBoot=00:00:00 OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null) Command=/public/home/hpc194711074/my_slurm.sh WorkDir=/public/home/hpc194711074/prototype StdErr=/public/home/hpc194711074/prototype/slurm.out StdIn=/dev/null StdOut=/public/home/hpc194711074/prototype/slurm.out Power= MailUser=(null) MailType=NONE
|
- 查看保存的屏幕输出
cat ~/hello.out
注意事项
- 如果python代码中有中文,需要在py文件的第一行加上以下三行代码中的任一行,作用是声明文件的编码格式
- 安装pytorch时,cuda版本需要低于10.2,否则可能报以下错误:
The NVIDIA driver on your system is too old (found version 10010).
- [x] pytorch 1.7.0 + cuda 10.1 测试通过
- [ ] pytorch 1.7.0 + cuda 10.2 测试不通过
- bash脚本的单行注释为#,sbatch参数也以#开头,注释sbatch参数的方法如下
##SBATCH --job-name=xxx
参考资料
[1] 北大工作站使用指南
[2] Slurm官方文档
[3] 中科大slurm使用指南.pdf