0%

hpc tutorial

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系统为例

  1. 在客户端生成密钥,在终端中输入ssh-keygen -t rsa,然后一路回车
  2. ~/.ssh文件夹下的id_rsa.pub中的内容复制到服务器的~/.ssh/authorized_keys

slurm简介

slurm是集群使用的作业调度系统,申请节点计算资源(cpu与gpu资源)并运行自己的程序需要编写shell脚本实现,即*.sh文件

重要的目录

  1. Softwares:/public/software; # anaconda3等软件在这个目录下.
  2. 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环境

  1. 推荐在当前用户文件夹下创建一个目录并将环境安装到该目录下 command: mkdir ~/envs
  2. 使用conda创建一个新的虚拟环境 command: /public/software/anaconda3/bin/conda create —prefix /path/to/your/dir (e.g., ~/envs/)
  3. 先用/public/software/anaconda3/bin/conda init命令来初始化一下bash
  4. 使用source activate /path/to/your/env来激活环境

编写一个测试脚本

  1. 创建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.

  1. 创建slurm脚本文件

vim ~/hello.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#SBATCH -J hello #任务名字
#SBATCH -o hello_%j.out #保存屏幕输出到这个文件
#SBATCH -e hello_%j.err #异常退出,则保存屏幕输出到这个文件,可选项,可以只指定*.out文件,则错误也会输出到*.out文件
#SBATCH -t 12:00:00 #最长运行时间, 此处为12小时
#SBATCH -N 1 #申请节点数
#SBATCH --ntasks-per-node=1 #每个节点分配的任务数
#SBATCH --cpus-per-task=4 #每个任务分配的cpu数
#SBATCH -p gpu2Q #提交到gpu分区才能申请gpu
#SBATCH -w gpu202 #指定gpu节点,不写则自动分配
#SBATCH --gres=gpu:1 #申请1块gpu
#SBATCH --mail-type=end #邮件通知类型start/end/failed, end表示作业结束时邮件通知, 可选项
#SBATCH --mail-user=your_email #邮件通知邮箱, 可选项
eval "$(/public/software/anaconda3/bin/conda shell.bash hook)"
conda activate /path/to/your/env #激活环境
# python ~/prototype/main.py -few 1 -prefix exp1 -form Pre-Train #运行代码
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>

  1. 提交任务

sbatch ~/hello.sh

  1. 查看任务状态

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
  1. 查看保存的屏幕输出

cat ~/hello.out

1
2
cuda True
hello world

注意事项

  1. 如果python代码中有中文,需要在py文件的第一行加上以下三行代码中的任一行,作用是声明文件的编码格式
1
2
3
#coding=utf-8
#coding:utf-8
#-*- coding:utf-8 -*-
  1. 安装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 测试不通过
  1. bash脚本的单行注释为#,sbatch参数也以#开头,注释sbatch参数的方法如下
    ##SBATCH --job-name=xxx

参考资料

[1] 北大工作站使用指南
[2] Slurm官方文档
[3] 中科大slurm使用指南.pdf