Slurm
使用图形界面快速开始
使用命令 sbatch-tui
或者 sbatch
不带任何参数,就可以看到一个图形界面1。
按照提示,鼠标点选对应按钮,即可提交任务。这可以满足一多半的需求。
以下用一些例子来进一步介绍如何使用 Slurm。更多细节请参考官方文档。 例子中一些选项是可选的、一些是必写的,会详细说明。
提交任务
使用 sbatch
命令提交任务。当加上参数时,会直接提交任务;当不加任何参数时,会调用 sbatch-tui
让你选。
提交一个 VASP(CPU)任务的例子:
sbatch --partition=localhost --nodes=1-1 --ntasks=2 --cpus-per-task=4 --hint=nomultithread --job-name="my great job" --output=output.txt --export=ALL,OMP_STACKSIZE=512m --mem=28G --wrap="vasp-intel srun vasp-std"
sbatch -p localhost -N 1-1 -n 2 -c 4 -J "my great job" -o output.txt --wrap="vasp-intel srun vasp-std"
--partition
或-p
指定使用哪个队列,不写则使用默认队列。--nodes=1-1
或-N 1-1
强制所有任务分配到一个节点上(即不跨节点运行),推荐在大多情况下使用2。 若要跨节点并行,并且节点 CPU/GPU 相同,不写这个参数就可以。 当要跨的节点的 CPU/GPU 型号不同时,还有别的注意事项,详见这里。--ntasks --cpus-per-task
或-n -c
两者的乘积指定使用多少 CPU 核3,必写。 同样是占用 9 个核,--ntasks=3 --cpus-per-task=3
和--ntasks=9 --cpus-per-task=1
性能并不相同。 此外,当--cpus-per-task
不为1
时,VASP 的NCORE
等参数也与这里的参数耦合4。 可以照抄下面的设置,或者自己尝试一下如何设置性能更好5:- 对于 srv1 的
localhost
队列:--cpus-per-task=10
,--ntasks=8
或按需设置。 - 对于 srv1 的
old
队列:--ntasks=4 --cpus-per-task=8
。 - 对于 srv2 的 n0 队列:
--ntasks=8 --cpus-per-task=5
。 - 对于 srv2 的 n0 队列:
--ntasks=3 --cpus-per-task=4
。
- 对于 srv1 的
--hint
一般不要修改也无需指定6。--job-name
或-J
指定任务的名字,可以不写。--output
或-o
指定输出文件的名字,可以不写。--export=ALL,OMP_NUM_THREADS=4,OMP_STACKSIZE=512m
指定环境变量。完全不写这个参数时,相当于--export=ALL
。 vasp 脚本中已经设置了一些必需的参数,通常情况下不需要再手动指定。--mem=28G
指定只使用内存大于等于 28 G 的节点,不设置则没有这个限制。 由于 Slurm 看到的内存大小比物理内存小一些7(例如 32 G 内存的节点,Slurm 可能会认为它只有 31.5 G),因此指定时也需要略小一些。--wrap="vasp-intel srun vasp-std"
指调用 std 版本的 VASP8。 要使用 gam 或 ncl 版本,将最后的vasp-std
改为vasp-gam
或vasp-ncl
。
以下是一个提交 VASP(GPU)任务的例子:
sbatch --partition=localhost --ntasks=1 --cpus-per-task=1 --gpus=4060:1 --job-name="my great job" --output=output.txt --wrap="vasp-nvidia mpirun vasp-std"
sbatch -p localhost -n 1 -c 1 -G 4060:1 -J "my great job" -o output.txt --wrap="vasp-nvidia mpirun vasp-std"
--gpus
或-G
指定使用哪个 GPU:- 要占用任意一个 GPU(排到这个任务时哪个空闲就使用哪个),写
--gpus=1
或-G 1
。 对于 VASP,单个任务一般不需要占用超过一个 GPU,多个显卡的速度会比单个更慢(因为显卡之间的通信速度会是瓶颈)9。 - 要指定具体使用哪一个 GPU 时,写
--gpus=4090:1
。2080 Ti 需要写为2080_ti
,P5000 需要写为p5000
。 - 当需要使用多个不同型号的 GPU 时,写
--gres=gpu:3090:1,gpu:4090:1
(使用一个 3090 和一个 4090)或-G 2
(使用任意两个 GPU)。 如果这些 GPU 可能分布在不同节点,可能还有其它注意事项,详见--nodes
参数的说明。
- 要占用任意一个 GPU(排到这个任务时哪个空闲就使用哪个),写
--ntasks-per-gpu
对于 VASP(GPU)来说一定要写且只能设置为1
,对于其它任务(例如 LAMMPS)可以适当修改。10--cpus-per-task
对于 VASP(GPU)通常来说设置为1
已经足够11。
要把其它程序提交到队列里,也是类似的写法。请自行举一反三。
查看任务
要列出正在等待和正在运行的任务:
squeue -l
要列出已经提交(包括已经完成、取消、失败)的任务:
squeue -t all -l
要显示还没有完成的任务的详细信息,或刚刚完成的任务的详细信息:
scontrol show job -d 114514
要在数据库中查找某一段时间内(例如 2024 年 8 月)提交的所有任务的详细信息12:
sacct --units M --format=ALL --starttime 2024-08-01T00:00:00 --endtime 2024-09-01T00:00:00 | bat -S
调整和取消任务
取消一个任务:
# 按任务的 id 取消
scancel 114514
# 按任务的名字取消
scancel -n my_great_job
# 取消一个用户的所有任务
scancel -u chn
如果自己已经提交了许多任务,现在想要把一个任务调整到自己的其它任务前面(不会影响自己任务的整体优先级),可以使用:
scontrol top 114514
要无条件将一个任务优先级设置为最高或最低(需要管理员权限):
# 最高
sudo scontrol update JobId=3337 Nice=-2147483645
# 最低
sudo scontrol update JobId=3337 Nice=2147483645
-
其实这个不能叫“图形用户界面(gui)”,应该叫“文本用户界面(tui)”。但后者会让不熟悉的人误解,所以这里还是叫“图形界面”。 ↩︎
-
跨节点并行可能会有比较大的损耗。我们的服务器都仅仅使用千兆网互联,比不上学校的超算,可能损耗更大。 ↩︎
-
通常来说,
--ntasks
对应 MPI 进程数,--cpus-per-task
对应 OpenMP 线程数。 这个对应关系并不是一定的,比如你先请求 10 个 task,然后用srun
运行 10 个不相关的程序也是可以的,这个过程中可以根本没有 MPI 和 OpenMP。 ↩︎ -
按照经验,OpenMP 线程数等于单个 CPU 或单个 ccx 的核心数或者核心数的一半时,性能最好。 ↩︎
-
--hint=nomultithread
用于忽略 CPU 的超线程,即按照物理核心来分配 CPU,每个物理核心上只运行一个线程。 对于大多数科学计算软件,忽略超线程的性能会比使用超线程更好(这与日常使用不同)。--hint=nomultithread
已经被设置为默认值(通过SLURM_HINT
环境变量)。 ↩︎ -
使用
--wrap
参数和直接写在sbatch
后面,都可以指定要运行的程序。 区别在于,后者必须是一个脚本(不能是二进制程序),并且在脚本里可以指定一些给 Slurm 看的参数。 ↩︎ -
如果有 nvlink,或许就不会出现这种情况。 ↩︎
-
这个参数指定的通常是 MPI 进程数(为这个参数指定的数值乘以 GPU 数量),其实就是
--ntasks
的另外一种写法。 VASP(GPU)限制每个 GPU 必须对应且只能对应一个 MPI 进程,不满足这个条件就会报错或者只使用 CPU 计算,因此只能用一个。 ↩︎ -
少数情况下增加可能会有用,例如运行机器学习时(VASP 的机器学习使用纯 CPU 实现)。 ↩︎
-
我不确定这里是否真的是任务的“提交时间”而不是“完成时间”或者别的什么时间,官方文档没有说清楚。 ↩︎