当前位置: 首页 > 工具软件 > SLURM > 使用案例 >

SLURM使用

越英范
2023-12-01

提交交互式任务

交互式任务是一种特殊的队列任务,在该模式下,用户可以直接登录到计算节点,此后 所有的操作都在这个节点上进行。这个功能主要是方便用户在服务器上调试程序, 以便能够实时看到程序的输出。
我们需要使用 salloc 命令来分配交互式任务所需的资源,它的语法为

$ salloc [申请资源]

其中,用户需要以选项的方式指定申请的资源,这些选项与 SLURM 脚本中的选项基本 相同。常用选项为:

-N <节点数量>
--cpus-per-task=<单进程 CPU 核心数>
--gres=gpu:<单节点 GPU 卡数>
-t <最长运行时间>
-p <使用的分区>
--qos=<使用的 QoS>

例如,可以使用如下方式申请资源:

salloc -N 1 --cpus-per-task=4 -t 5:00 -p compute --gres=gpu:1

执行成功后,此时的shell已经切换到计算节点。此时可以使用srun命令进行交互。例如查看GPU的使用情况

srun nvidia-smi

或是运行某python文件

srun python 1.py

交互式计算使用完毕后,使用exit命令退出计算节点。SLURM 会提示你交互式任务的资源已经被释放。

提交批处理任务

在工作站提交批处理任务需要编写 SLURM 脚本,以便明确申请的资源以及所要运行的程序。

查看可用资源

在提交任务之前,务必检查一下各个节点的状态,例如资源是否充足,当前有多少正在执行的任务等。

[name@node1]$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
compute*     up   infinite      2    mix node[3-4]
compute*     up   infinite      2   idle node[2,5]

如上所示,使用 sinfo 命令可粗略查看所有分区的节点信息,注意 ‘‘STATE’’ 一栏的输出 若为 ‘‘idle’’ 表示该节点处于闲置状态,若为 ‘‘alloc’’ 表示该节点已经没有多余的 资源了,若为 ‘‘mix’’ 表示该节点有人在占用,但是仍然有剩余资源。

[name@node1]$ squeue
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
 4060   compute      123 username1  R 1-11:52:15     1 node4
 4094   compute      123 username2  R   10:31:20     1 node3
 4103   compute       d3 username3  R    9:30:20     1 node4
 4106   compute     loss username4  R      19:10     1 node3

如上所示,使用squeue命令可以查看作业调度系统中所有的作业。

Slurm脚本示例

随后可以使用sbatch命令提交作业到作业调度系统中。下面是一个作业脚本示例。

#!/bin/bash
#SBATCH -o job.%j.out
#SBATCH -p compute
#SBATCH --qos=low
#SBATCH -J FirstJob
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:1 
#SBATCH --mail-type=all
#SBATCH --mail-user=youreamil
#SBATCH -w node4
#SBATCH --mem-per-cpu 10000
python test.py

常用参数说明如下:

#SBATCH -o job.%j.out         # 脚本执行的输出将被保存在job.%j.out文件下,%j表示作业号;
#SBATCH -p C032M0128G         # 作业提交的指定分区为compute;
#SBATCH --qos=low             # 指定作业的QOS为low;
#SBATCH -J myFirstJob         # 作业在调度系统中的作业名为FirstJob;
#SBATCH --nodes=1             # 申请节点数为1;
#SBATCH --ntasks-per-node=1   # 每个节点上运行一个任务,默认一情况下也可理解为每个节点使用一个核心;
#SBATCH --mail-type=<type>    # 指定状态发生时,发送邮件通知,有效种类为(NONE, BEGIN, END, FAIL, REQUEUE, ALL);
#SBATCH --mail-user=<user>    # 发送给指定邮箱;
#SBATCH -w node3             # 指定运行的节点

取消作业

使用scancel命令取消指定的作业,以下为一个示例

# 取消JOBID为123的作业
scancel 123

Slurm使用jupyter notebook

  • 使用sbatch申请notebook,sbatch文件示例如下,自行修改port与node,注意:端口号要大于1024
#!/bin/bash
#SBATCH -o jupyter.out        
#SBATCH --qos=low             
#SBATCH -J jupyter_notebook   
#SBATCH --nodes=1             
#SBATCH --ntasks-per-node=1  
#SBATCH -w node4_3060
#SBATCH --gres=gpu:1 

port=port
ip=`ifconfig |grep -m 1 inet |awk '{print$2}'`

jupyter-notebook --no-browser --port=${port} --ip=${ip}
  • 交完SLURM任务后打开生成的jupyter.out
[I 16:55:39.575 NotebookApp] Serving notebooks from local directory: /home/home_node1/pya
[I 16:55:39.575 NotebookApp] Jupyter Notebook 6.4.8 is running at:
[I 16:55:39.575 NotebookApp] http://10.40.13.214:7777/?token=4850e0a7421b4e51d1809bd617f71a48c26e83c09a4b8159
[I 16:55:39.575 NotebookApp]  or http://127.0.0.1:7777/?token=4850e0a7421b4e51d1809bd617f71a48c26e83c09a4b8159
[I 16:55:39.575 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 16:55:39.577 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///home/home_node1/pya/.local/share/jupyter/runtime/nbserver-14851-open.html
    Or copy and paste one of these URLs:
        http://10.40.13.214:7777/?token=4850e0a7421b4e51d1809bd617f71a48c26e83c09a4b8159
     or http://127.0.0.1:7777/?token=4850e0a7421b4e51d1809bd617f71a48c26e83c09a4b8159
  • 校内同学在本地浏览器中打开http://10.40.13.214:7777/?token=4850e0a7421b4e51d1809bd617f71a48c26e83c09a4b8159即可使用jupyter。

使用sbatch提交申请notebook后一定要记得scancel掉!!!!!!!

  • 辣鸡jupyter全是坑,狗都不用
  • 安装ipthon或者nb_conda命令提示符丢了的跑下面的代码
conda config --system --set env_prompt "({default_env})[\u@\h \W]\$ "
  • conda虚拟环境中的kernel连不上的是因为版本不对,等nb_conda修完bug吧
  • 别用辣鸡jupyter了,出问题别找我
 类似资料: