整理文档

This commit is contained in:
2025-01-12 12:11:54 +08:00
parent 80629870fa
commit dcd5200485
8 changed files with 172 additions and 210 deletions

View File

@@ -16,13 +16,12 @@ title: "使用队列系统"
不同的服务器使用不同的队列系统。
* 厦大超算jykang使用 LSF。
* srv1使用 Slurm。
* srv1 和 srv2:使用 Slurm。
* srv1Windows没有队列系统但请阅读 [Windows](#windows) 章节,了解相关注意事项。
* xmupc1 和 xmupc2也使用 Slurm但有一些不同见 [Slurm](#slurm旧)。
{{< cards >}}
{{< card link="lsf" title="LSF" subtitle="IBM Spectrum LSF适用于厦大超算jykang" >}}
{{< card link="slurm" title="Slurm" subtitle="Slurm适用于 srv1" >}}
{{< card link="slurm" title="Slurm" subtitle="Slurm适用于 srv1 srv2" >}}
{{< /cards >}}
### Windows
@@ -137,16 +136,5 @@ run;
```
{{% /details %}}
### Slurm
与 Slurm基本相同只是 VASPCPU的打包方式不同使得提交任务的命令略有不同。
下一次服务器维护时xmupc1 和 xmupc2 计划合并为一个集群,并且应用新的打包方式。
提交 VASPCPU任务的例子
```bash
sbatch --ntasks=2 --cpus-per-task=4 --hint=nomultithread --job-name="my great job" --output=output.txt vasp-intel-std
```
[^1]: 实际上队列系统与要运行的软件还是有许多耦合的,尤其是使用 MPI 并行的程序(包括绝大多数成熟的大型科学计算软件)。
如何让队列系统与这些软件对接好有时会很麻烦,只是普通用户不需要关心(我替你们搞定了)。

View File

@@ -13,54 +13,56 @@ title: "Slurm"
## 提交任务
{{< callout type="warning" >}}
近期服务器正在陆续升级,这里记录的命令不一定适用。请以 tui 的提示为准。
{{< /callout >}}
使用 `sbatch` 命令提交任务。当加上参数时,会直接提交任务;当不加任何参数时,会调用 `sbatch-tui` 让你选。
提交一个 VASPCPU任务的例子
```bash
sbatch --ntasks=2 --cpus-per-task=4 --hint=nomultithread --job-name="my great job" --output=output.txt --queue=localhost --export=ALL,OMP_NUM_THREADS=4,OMP_STACKSIZE=512m --nodes=1-1 --mem=28G --wrap="vasp-intel srun --mpi=pmix vasp-std"
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"
```
* `--ntasks=2 --cpus-per-task=4` 两者的乘积指定使用多少 CPU 核[^5],必写
* `--partition``-p` 指定使用哪个队列,不写则使用默认队列
* `--nodes=1-1``-N 1-1` 强制所有任务分配到一个节点上(即不跨节点运行),推荐在大多情况下使用[^11]。
若要跨节点并行,并且节点 CPU/GPU 相同,不写这个参数就可以。
当要跨的节点的 CPU/GPU 型号不同时,还有别的注意事项,详见[这里](../qa#混合使用不同型号的节点)。
* `--ntasks --cpus-per-task``-n -c` 两者的乘积指定使用多少 CPU 核[^5],必写。
同样是占用 9 个核,`--ntasks=3 --cpus-per-task=3``--ntasks=9 --cpus-per-task=1` 性能并不相同。
此外,当 `--cpus-per-task` 不为 `1`VASP 的 `NCORE` 等参数也与这里的参数耦合[^9]。
可以照抄下面的设置,或者自己尝试一下如何设置性能更好[^15]
* 对于 xmupc1`--ntasks=3 --cpus-per-task=4`
* 对于 xmupc2`--ntasks=4 --cpus-per-task=10`
* 对于 srv1默认队列:`--cpus-per-task=10``--ntasks=8` 或按需设置
* 对于 srv1其它队列:`--ntasks=4 --cpus-per-task=8`
* `--hint=nomultithread` 对于大多软件(包括 VASP都需要写[^6],不写不会出错但会比较慢
* `--job-name=xxx` 指定任务的名字,可以不写。
* `--queue=xxx` 指定队列的名字,不写时使用默认队列
* 对于 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`
* `--hint` 一般不要修改也无需指定[^6]
* `--job-name``-J` 指定任务的名字,可以不写。
* `--output``-o` 指定输出文件的名字,可以不写
* `--export=ALL,OMP_NUM_THREADS=4,OMP_STACKSIZE=512m` 指定环境变量。完全不写这个参数时,相当于 `--export=ALL`
* `ALL` 表示使用当前环境中的所有变量,并额外设置后面追加的值;
* `OMP_NUM_THREADS=4` 表示设置 OpenMP 的线程数为 4。
对于使用 OPENMP 并行的程序(包括 VASPCPU但不包括 VASPGPU`OMP_NUM_THREADS` 必须设置为与 `--cpus-per-task` 相同的值;
即使没有设置 `--cpus-per-task`,也需要设置 `OMP_NUM_THREADS=1`
* `OMP_STACKSIZE` 设置每个 OpenMP 线程的栈大小需要足够大VASP 文档推荐设置为 `512m`,通常已经足够。
如果遇到段错误Segmentation fault可以尝试增大这个值。
* `--nodes=1-1` 强制所有任务分配到一个节点上(即不跨节点运行),推荐在大多情况下使用[^11]。
若要跨节点并行,并且节点 CPU/GPU 相同,不写这个参数就可以。
当要跨的节点的 CPU/GPU 型号不同时,还有别的注意事项,详见[这里](../qa#混合使用不同型号的节点)。
vasp 脚本中已经设置了一些必需的参数,通常情况下不需要再手动指定。
* `--mem=28G` 指定只使用内存大于等于 28 G 的节点,不设置则没有这个限制。
由于 Slurm 看到的内存大小比物理内存小一些[^14](例如 32 G 内存的节点Slurm 可能会认为它只有 31.5 G因此指定时也需要略小一些。
* `--wrap="vasp-intel srun --mpi=pmix vasp-std"` 指调用 std 版本的 VASP[^7]。
* `--wrap="vasp-intel srun vasp-std"` 指调用 std 版本的 VASP[^7]。
要使用 gam 或 ncl 版本,将最后的 `vasp-std` 改为 `vasp-gam``vasp-ncl`
以下是一个提交 VASPGPU任务的例子(这个例子适用于旧的打包方式,会在下次服务器维护后更改)
以下是一个提交 VASPGPU任务的例子
```bash
sbatch --gpus=1 --ntasks-per-gpu=1 --nodes=1-1 --job-name="my great job" --output=output.txt vasp-nvidia-std
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` 指定使用哪个 GPU
* 要占用任意一个 GPU排到这个任务时哪个空闲就使用哪个`--gpus=1`。要占用任意两个就写 `--gpus=2`,以此类推
对于 VASP单个任务要占用超过一个 GPU多个显卡的速度会比单个更慢(因为显卡之间的通信速度会是瓶颈)[^12]。
* `--gpus``-G` 指定使用哪个 GPU
* 要占用任意一个 GPU排到这个任务时哪个空闲就使用哪个`--gpus=1``-G 1`
对于 VASP单个任务一般不需要占用超过一个 GPU多个显卡的速度会比单个更慢因为显卡之间的通信速度会是瓶颈[^12]。
* 要指定具体使用哪一个 GPU 时,写 `--gpus=4090:1`。2080 Ti 需要写为 `2080_ti`P5000 需要写为 `p5000`
* 当需要使用多个不同型号的 GPU 时(例如,指定使用一个 3090 和一个 4090 ,写 `--gres=gpu:3090:1,gpu:4090:1`
* `--ntasks-per-gpu=1` 对于 VASPGPU来说一定要写且只能设置为 `1`,对于其它任务(例如 LAMMPS可以适当修改。[^4]
* `--cpus-per-task` 对于 VASPGPU来说通常不用指定[^13],其它程序可能需要。这个选项的具体含义参考上一个例子。
* `vasp-nvidia-std` 即要执行的程序[^7],要使用 gam 或 ncl 版本时,写为例如 `vasp-nvidia-gam`
* 当需要使用多个不同型号的 GPU 时,写 `--gres=gpu:3090:1,gpu:4090:1`(使用一个 3090 和一个 4090`-G 2` (使用任意两个 GPU
如果这些 GPU 可能分布在不同节点,可能还有其它注意事项,详见 `--nodes` 参数的说明。
* `--ntasks-per-gpu` 对于 VASPGPU来说一定要写且只能设置为 `1`,对于其它任务(例如 LAMMPS可以适当修改。[^4]
* `--cpus-per-task` 对于 VASPGPU通常来说设置为 `1` 已经足够[^13]
要把其它程序提交到队列里,也是类似的写法。请自行举一反三。
@@ -81,7 +83,7 @@ squeue -t all -l
要显示还没有完成的任务的详细信息,或刚刚完成的任务的详细信息:
```bash
scontrol show job 114514
scontrol show job -d 114514
```
要在数据库中查找某一段时间内(例如 2024 年 8 月)提交的所有任务的详细信息[^10]
@@ -103,7 +105,7 @@ scancel -n my_great_job
scancel -u chn
```
如果自己已经提交了许多任务,现在想要把一个任务调整到自己的其它任务前面(不会影响整体优先级),可以使用:
如果自己已经提交了许多任务,现在想要把一个任务调整到自己的其它任务前面(不会影响自己任务的整体优先级),可以使用:
```bash
scontrol top 114514
@@ -123,16 +125,16 @@ sudo scontrol update JobId=3337 Nice=2147483645
VASPGPU限制每个 GPU 必须对应且只能对应一个 MPI 进程,不满足这个条件就会报错或者只使用 CPU 计算,因此只能用一个。
[^5]: 通常来说,`--ntasks` 对应 MPI 进程数,`--cpus-per-task` 对应 OpenMP 线程数。
这个对应关系并不是一定的,比如你先请求 10 个 task然后用 `srun` 运行 10 个不相关的程序也是可以的,这个过程中可以根本没有 MPI 和 OpenMP。
[^6]: 这个选项用于忽略 CPU 的超线程,即认为物理核心和对应的虚拟核心总共算一个核心
Slurm 默认会把超线程核心和物理核各算成一个核,但做科学计算时一般要关掉超线程
[^6]: `--hint=nomultithread` 用于忽略 CPU 的超线程,即按照物理核心来分配 CPU每个物理核心上只运行一个线程
对于大多数科学计算软件,忽略超线程的性能会比使用超线程更好(这与日常使用不同)
`--hint=nomultithread` 已经被设置为默认值(通过 `SLURM_HINT` 环境变量)。
[^7]: 使用 `--wrap` 参数和直接写在 `sbatch` 后面,都可以指定要运行的程序。
区别在于,后者必须是一个脚本(不能是二进制程序),并且在脚本里可以指定一些给 Slurm 看的参数。
[^9]: 具体是如何耦合的,见[官方文档](https://www.vasp.at/wiki/index.php/Combining_MPI_and_OpenMP)。
[^10]: 我不确定这里是否真的是任务的“提交时间”而不是“完成时间”或者别的什么时间,官方文档没有说清楚。
[^11]: 跨节点并行可能会有比较大的损耗。我们的服务器都仅仅使用千兆网互联,比不上学校的超算,可能损耗更大。
[^12]: 如果有 nvlink或许就不会出现这种情况。
[^13]: 按照经验,大多情况下,对于 VASP一个 CPU 核心搭配一个显卡已经足够,增加核心数并不会更快
少数情况下增加可能会有用例如运行机器学习时VASP 的机器学习使用纯 CPU 实现)。
[^13]: 少数情况下增加可能会有用例如运行机器学习时VASP 的机器学习使用纯 CPU 实现)
[^14]: 实际上是在 Slurm 的配置文件中手动指定的。具体每个节点指定了多少,见[系统配置文件](https://github.com/CHN-beta/nixos)。
[^15]: 按照经验OpenMP 线程数等于单个 CPU 或单个 ccx 的核心数或者核心数的一半时,性能最好。