进阶与工具

CPU与GPU并行设置

理解进程、线程与GPU,按VASP、ABACUS、LAMMPS、GROMACS等模板修改单节点资源。

更新于 2026-10-22约 14 分钟阅读按任务与环境选择适用配置
阅读本篇目录

本篇承接已经会提交作业后的资源调整。先通过yskit复制对应软件模板,再修改自己的副本;保留模板指定的MPI、绑定和运行环境。

CPU整节点与软件布局#

8173m 整节点规则: cpu-8173m 为独占模式,无论使用多少核心均按整节点56核计费。因此公共提交模板和新建作业必须按每节点56核配置,不能以少申请CPU来节省费用。MPI采用56进程×1线程,混合并行可采用28×2或7×8,单进程OpenMP采用1×56;不能把56个MPI进程再各开56线程。启动命令必须读取对应Slurm资源变量。串行小工具在login01按已说明范围使用,不为它单独提交不足56核的8173m任务,也不启动56份相同程序写同一输出。线程/进程配置为56核并不代表程序每个阶段都能满载。

当前公共CPU模板:ORCA为56MPI×1CPU,但由串行驱动启动MPI,不在外层mpirun/srun;CP2K/QE/ABACUS为28×2;GROMACS MPI为7×8、thread-MPI为1进程分配56CPU;MACE/LOBSTER/xTB为1×56;VASP/LAMMPS/Wannier90/WannierTools/VASPBERRY/Hefei-NAMD DEV/TDEP/SPPARKS及ATAT MPI/VASP为56×1。ATAT mcsqs使用56个带独立编号的搜索进程协作搜索,sub_mcsqs_single.sh仅保留历史文件名兼容,现也使用56个搜索进程。DP-GEN的VASP阶段每节点56CPU。

改变混合并行划分时每节点进程数×每进程线程数仍应等于56。个人目录中已复制的脚本不会自动更新,更换软件或资源时请重新通过yskit复制模板,并核对上述56核规则。

常见并行配置对照#

下表是现有模板的起点,不是所有体系的最优参数。

软件/任务 MPI 进程 每进程 CPU GPU 还需对应的设置
GPU VASP 单卡 1 1 1 对应 P100/V100 程序、匹配的 INCAR
ABACUS CPU 28 2 0 OMP_NUM_THREADS=2
ABACUS GPU PW 单卡 1 2 1 INPUT 中 device、求解器与 kpar
DeePMD 单卡训练模板 1 2 1 选择 TF/PT 后端;模板限制单卡
LAMMPS 配套 GPU 模板 每 GPU 1 进程 按模板 与进程数一致 区分 deepmd、classic、deepmd-kk 模式
GROMACS GPU thread-MPI Slurm 1 个 task 4 1 程序内部 -ntmpi 1 -ntomp 4
LOBSTER 1 56 0 OMP_NUM_THREADS=56,直接启动
xTB 1 56 0 --parallel读取CPU数;OpenMP/MKL线程,无MPI
Wannier90 3.1.0 MPI 模板 56 1 0 seedname 参数;MPI 启动
TDEP拟合/热导 56 1 0 IntelMPI;参数由sbatch传入,数学库单线程

已有脚本里设置的 MPI 启动器和绑定参数属于软件运行配置,不应统一替换成另一套 mpirun 或 srun。需要多节点时,单独确认软件支持、通信路径和输入规模,不能仅把 --nodes=1 改成 2。

各软件如何从单卡改成多卡#

本节针对当前公共模板的单节点任务。先复制模板到自己的算例目录,再修改本地副本;下面的参数片段用于替换原有行,不是在脚本末尾重复追加一组SBATCH指令。核时与套餐用户采用相同的资源计算方法,但保留自己账户对应的分区、GPU型号、程序路径和运行环境。

先区分 GPU、进程和线程#

--gres申请GPU,--ntasks申请进程,--cpus-per-task申请每个进程的CPU资源。这三个参数不会自动联动。OMP_NUM_THREADS和程序选项决定申请到的CPU如何使用;它们本身不会额外申请CPU。

下文的G表示GPU数量,T表示每个计算rank的OpenMP线程数,只是说明用符号,不能直接写进SBATCH行。P100使用gpu:p100-16g:G;V100按分区使用gpu:v100-16g:G或gpu:v100-32g:G,实际替换为整数。例如:

#SBATCH --gres=gpu:p100-16g:2

保持--nodes=1。不要手工将CUDA_VISIBLE_DEVICES改成节点上的物理卡编号;由Slurm分配可见GPU。若脚本同时有--ntasks-per-node,需与单节点总进程数一致。以下配置说明资源参数的对应关系。选择多卡前,仍需确认所用版本、求解器和输入支持这种并行方式,再以自己的短试算选择卡数。

MPI 程序:GPU 数和进程数一起修改#

下表按每GPU一个MPI进程作为当前模板的起点,表中的CPU总数为ntasks × cpus-per-task。保留各模板原有的MPI启动器与绑定参数。

软件/模板 GPU数 --ntasks --cpus-per-task CPU总数 应用侧还需检查
GPU VASP 2 2 1 2 INCAR的NCORE、KPAR及特殊任务分组
GPU VASP 4 4 1 4 同上
ABACUS GPU PW 2 2 2 4 INPUT的device、kpar及实际k点
ABACUS GPU PW 4 4 2 8 同上
LAMMPS GPU/KOKKOS 2 2 1 2 GPU包参数是否自动读取卡数,势与模式是否匹配
LAMMPS GPU/KOKKOS 4 4 1 4 同上
GROMACS mpi-plumed 2 2 4 8 -ntomp从每task核数读取,保留-update cpu
GROMACS mpi-plumed 4 4 4 16 同上,检查md.log中的GPU任务分配
CP2K GPU 2 2 2 4 保留MPICH绑定与OMP设置
CP2K GPU 4 4 2 8 同上;输入、规模及GPU卸载实际生效情况
CP2K GPU 8 8 2 16 2025.2的PBE有八卡使用实例;扩展效率需按体系比较
QE GPU 2 2 2 4 保留-ndiag 1,不要把对角化组数设成卡数
QE GPU 4 4 2 8 同上;k点池另按输入选择

例如CP2K双卡,在原模板中修改为:

#SBATCH --nodes=1
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=2
#SBATCH --gres=gpu:p100-16g:2

原模板已经用SLURM_NTASKS启动MPI、用SLURM_CPUS_PER_TASK设置OpenMP,因此运行命令无需再手改数字。此关系适用于表中已经采用这些变量的MPI模板,不适用于下一节的GROMACS thread-MPI。

**VASP:**当前OpenACC程序按每GPU一个MPI rank运行。不要沿用CPU版的NCORE分组;使用NCORE=1,清理不适合GPU路径的旧NPAR设置。KPAR不能仅凭卡数随意增大,要与MPI分组及实际k点相容;单k点任务先保留KPAR=1。VTST/NEB的IMAGES还会分组进程,需按任务单独配置,不能把普通单结构的双卡示例当作完整NEB配置。增加CPU线程时同时调整cpus-per-task,脚本会设置OMP线程。VASP GPU说明

**ABACUS:**PW按当前模板每GPU一个MPI rank,输入保持device gpu;在适用的PW k点并行任务中,双卡检查kpar 2、四卡检查kpar 4,同时核对实际k点数和程序日志。不要只增加kpar而不申请相应进程/GPU。LCAO的cusolver、elpa与PW不是同一种分解方式,不能将PW的kpar示例直接套给LCAO;当前LCAO用户先保留单卡配置,多卡需针对该3.10.1构建、求解器和输入单独验证。不同版本和求解器的支持范围见第一性原理软件环境;查阅上游手册时请选择与程序匹配的版本。

**LAMMPS:**新建DeePMD任务优先选择当前*-source配套程序及PLUMED2.9.5模板,尤其是V100多卡任务。旧离线DeePMD配套程序用于保留既有环境,不作为多卡推荐路线;两套程序的DeePMD库和PLUMED kernel不能混用。以下区分启动命令,便于检查自己的脚本:

模板类别 增卡时的操作
路径带deepmd-<版本>-plumed-2.9.5的配套模板 同时改ntasks和gres;脚本从可见GPU计算NGPU并检查每卡一个rank,GPU/KOKKOS模式自动使用该值
通用模板的命令使用-pk gpu "$SLURM_NTASKS"或相应变量 同时改ntasks和gres,保持两者相等;启动命令已有联动
旧离线DeePMD配套sub_deepmd_plumed_*.sh 命令中的-pk gpu 1或-k on g 1固定为单卡,不能只改SBATCH行扩卡。需要多卡时改选当前*-source配套模板

在支持多卡的当前构建中,GPU包的-pk gpu G和KOKKOS的-k on g G都要与实际单节点GPU数对应;上述新配套模板已自动读取。不要给普通DeePMD势擅自增加-sf kk,也不要改变模板对deepmd、classic、deepmd-kk的区分。输入中若写了processors或partition,还需与新的进程布局匹配。上述一进程一卡是本集群模板约定,不表示LAMMPS所有构建都只允许这种布局。

**CP2K:**MPI进程数与GPU数一起改,cpus-per-task控制每rank的OpenMP线程。保留模板的MPICH -bind-to core:<线程数>和数学库单线程设置;不要改成OpenMPI的绑定参数。增加卡数不会自动让所有计算转移到GPU,Libint/libGint等输入选择仍按CP2K章节处理。

**FourPhonon:**当前GPU版只支持单卡无采样RTA,保持gres=1与ntasks=1;不能采用本节其他MPI软件的多卡配置。CPU线程可按个人输入调整,同时修改cpus-per-task,详见FourPhonon。

GROMACS thread-MPI:一个进程内部增加 rank#

普通threadmpi构建只启动一个操作系统进程,Slurm的--ntasks保持1。内部rank数由-ntmpi指定,--cpus-per-task则要覆盖整个进程中所有rank的OpenMP线程:

申请CPU总数 = 内部rank数 × 每rank线程数

GPU数 --ntasks --cpus-per-task -ntmpi -ntomp
1 1 4 1 4
2 1 8 2 4
4 1 16 4 4

当前2025.5、2026.3公共模板仍为单卡写法:-ntmpi 1,并将SLURM_CPUS_PER_TASK直接传给-ntomp。要按上表改成双卡,除了修改SBATCH资源,还必须替换原来的OMP设置与mdrun命令;只把CPU申请改成8,会得到每rank8线程,并不是目标的每rank4线程。

以下片段用于替换个人副本中的对应内容,保留原模板的环境加载以及INPUT、OUTPUT、GMX_BIN定义:

#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --gres=gpu:p100-16g:2

# 放在原模板环境加载之后、mdrun之前。
NTMPI=2
CPU_TOTAL=${SLURM_CPUS_PER_TASK:?}
if (( CPU_TOTAL < NTMPI || CPU_TOTAL % NTMPI != 0 )); then
    echo "CPU核数必须是内部rank数的正整数倍" >&2
    exit 2
fi
export OMP_NUM_THREADS=$((CPU_TOTAL / NTMPI))
"$GMX_BIN" mdrun -s "$INPUT" -deffnm "$OUTPUT" \
    -ntmpi "$NTMPI" -ntomp "$OMP_NUM_THREADS" \
    -pin auto -nb gpu -pme auto -update auto

四卡时把gres数量改4、cpus-per-task改16、NTMPI改4。不能把这里的NTMPI简单替换为SLURM_NTASKS,因为Slurm仍只分配一个进程。当前公共脚本也尚未改成自动读取GPU数;本节是个人脚本的明确修改方法。

mpi-plumed版使用上方MPI表,双卡为2进程×4线程,四卡为4进程×4线程;它的mpirun -np "$SLURM_NTASKS"和-ntomp "$OMP_NUM_THREADS"已经读取资源变量,不加-ntmpi。保留-plumed及-update cpu。两种构建均应检查md.log的PP/PME分配、GPU任务映射和实际吞吐,不能保证每增加一张卡就等比例加速。8卡×4线程需要32CPU,超过本集群V100节点24CPU配置,不能机械沿用。GROMACS并行说明

DeePMD-kit:现有单卡训练模板不能直接扩成多卡#

当前各版本公共训练脚本保留单节点、单task、单GPU。申请两张GPU不会自动把dp train变成分布式训练;也不能简单加mpirun -np 2,否则可能启动两个互相覆盖输出的训练任务。

单个模型的分布式训练需要按版本、TF/PT后端配置专用启动器和依赖;当前公共训练模板用于单卡,如需多卡训练请先联系技术支持确认配置。DeePMD2.2.11仅TF,3.x的TF/PT训练不能混用启动配置。多个独立模型可以各用一个单卡作业、独立目录同时运行;这是任务并发,不是同一个模型的多卡训练。

DP-GEN:修改各阶段资源和启动器,不改主控GPU数#

DP-GEN主控不因多申请GPU而加速。实际资源配置位于个人工作流目录的machine.json,分别检查train、model_devi、fp条目;configure.py重新生成配置可能覆盖手工修改,修改后保留个人备份并检查实际生成的Slurm脚本。

当前安装的DPDispatcher1.1.0 Slurm后端将resources.cpu_per_node写成--ntasks-per-node,线程数另由custom_flags中的--cpus-per-task指定;所以不能把这里的cpu_per_node直接当作“进程×线程”的总核数。另外,kwargs.custom_gpu_line会覆盖由gpu_per_node生成的GPU行,两处应保持一致。

以已有的单节点、普通DeePMD势LAMMPS探索启动器为例,双卡资源片段为:

{
  "number_node": 1,
  "cpu_per_node": 2,
  "gpu_per_node": 2,
  "queue_name": "gpu-8v100-16g-hs",
  "group_size": 1,
  "para_deg": 1,
  "custom_flags": ["#SBATCH --cpus-per-task=2"],
  "kwargs": {"custom_gpu_line": "#SBATCH --gres=gpu:v100-16g:2"}
}

这是model_devi中resources对象的示例,四卡时将cpu_per_node、gpu_per_node及gres数量都改4;保持原machine、command、路径和其他配置。示例双卡申请2进程×2线程,共4CPU;运行器必须像现有run-lammps.sh一样读取SLURM_NTASKS。若换用固定GPU包/KOKKOS参数的启动器,还要按LAMMPS规则检查命令中的卡数。

train阶段当前run-dp.sh直接执行dp,仍按单GPU任务配置,不能照搬上述探索资源片段。fp若选GPU VASP,可按VASP规则联动资源并核对启动器;选择8173m CPU VASP时gpu_per_node保持0。group_size和para_deg涉及任务打包/并发,不等于GPU数,也不会自动实现分布式训练;先保持模板值,不让多个并发任务争用同一组GPU。

GPUMD、NEP、GNEP:单进程管理可见 GPU#

三个程序均不通过MPI启动,支持的任务可使用进程可见的多张GPU,Slurm的ntasks始终为1。当前模板以2个CPU线程作为起点,可先保持不变:

GPU数 --ntasks --cpus-per-task 修改内容
2 1 2 将原gres数量改2,保留直接执行程序的命令
4 1 2 将原gres数量改4,保留直接执行程序的命令

这类模板可以先只改GPU申请数,但前提是具体势与功能支持多卡。GPUMD标准NEP需满足对应软件指南中的盒子尺寸要求,不适用的势或DFT-D3组合不能靠增加gres解决。NEP训练数据会复制到各卡,显存不会自动合并;GNEP的global batch中要有足够构型,否则部分GPU没有工作。按同一batch比较性能,不要为追求加速悄悄改变训练语义。势函数与多卡限制见机器学习势软件环境。

CPU 软件与辅助工具#

Phonopy2.43.6大计算同样为1进程×56CPU、OMP56/BLAS1,无RAYON;Phonopy4.7.2大计算为1进程×56CPU,Rust的RAYON_NUM_THREADS和C的OMP_NUM_THREADS随cpus-per-task设置56,内层BLAS1;无MPI/GPU构建。小准备/绘图可login01单线程。详见5.18节。

当前SPPARKS、ATAT、Wannier90独立程序、LOBSTER,以及各软件明确标为8173m CPU的构建,都不能通过增加gres变成GPU程序。CPU MPI程序调整进程数;LOBSTER等单进程线程程序调整cpus-per-task及OMP;ATAT普通程序与MPI工具分别按对应模板使用。VASPKIT、yskit、dpdata、tqdm等辅助工具也不因申请GPU而获得对应加速。PLUMED随宿主软件运行,本身不是一份通用GPU数扩展模板;gpu-burn是管理员压力测试工具,不用于套用以上生产作业配置。

phono3py、AMSET、CREST、ALAMODE、hiPhive、Multiwfn、OVITO和critic2在本集群均使用CPU程序,不能增加gres自动变为GPU程序。ALAMODE anphon为56MPI×1线程,alm为1×56;AMSET为56工作进程且内层BLAS1,其余按各自56核线程模板。Bader串行,ASE/pymatgen小型预处理可login01使用。

修改后如何确认真的用了多卡#

提交后先查看作业分配的GPU数及进程/线程数,再查应用日志中的设备和任务映射。保留原始单卡输入,用相同模型、步数和收敛条件做短对照;检查能量、力等结果,再比较每步耗时、ns/day或训练吞吐。增加资源却没有提速时,先检查体系规模、分区方式、CPU供给和通信,不继续机械增加卡数。不要用不同物理输入的耗时来证明加速。

选择与功能边界#

申请两张 GPU 是否只修改 gres?#

不一定。逐软件的修改位置、双卡/四卡参数及限制见多卡设置。MPI模板通常同步改ntasks和gres;GROMACS thread-MPI要另改内部rank及线程分配;GPUMD保持一个task;DeePMD现有训练模板不能直接扩卡。

为什么仍需保留 VASP 的 HCOLL 设置?#

当前 GPU VASP 模板保留 OMPI_MCA_coll_hcoll_enable=0。这一设置用于避免当前软件通信环境中的HCOLL初始化错误。请保留模板设置;如仍有通信报错,提供完整日志并联系技术支持。

单精度是否总是更划算?#

单精度可能降低耗时和显存,但需要检查科学结果。ABACUS 已提供运行时精度选择,默认仍为 double;能量接近也不代表力和应力已足够准确。

为什么不能只根据软件目录判断支持哪些功能?#

同一软件可能有多个版本、CPU/GPU构建和扩展分支。请先在yskit选择明确版本与平台,再阅读对应的软件指南;不要仅凭目录名选择程序。GPU VASP应使用公共模板所加载的P100或V100模块。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗