交互式任务是一种特殊的队列任务,在该模式下,用户可以直接登录到计算节点,此后 所有的操作都在这个节点上进行。这个功能主要是方便用户在服务器上调试程序, 以便能够实时看到程序的输出。
我们需要使用 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命令可以查看作业调度系统中所有的作业。
随后可以使用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
#!/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}
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。conda config --system --set env_prompt "({default_env})[\u@\h \W]\$ "