CP2K¶
CP2K 是可用于DFT计算和分子动力学模拟的强大软件包。它支持多种计算方法,包括密度泛函理论(DFT)、半经验方法和经典力场。CP2K 以其高效的并行计算能力和灵活的输入文件格式而闻名,适用于从小分子到大规模材料系统的模拟。用户可以利用 CP2K 进行能量计算、几何优化、分子动力学模拟等多种任务。
嘉庚智算上的CP2K¶
我们推荐您使用容器的方式运行 CP2K 作业,该方法是目前较为稳定的方式。
Warning
如果您运行的体系较大,或者使用的方法较复杂,可能会遇到内存不足的问题。这类问题通常表现如下:
2080 = BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
2081 = RANK 127 PID 3300779 RUNNING AT cu363
2082 = KILLED BY SIGNAL: 9 (Killed)
- 申请的内存足够内存, 具体请参考以下"容器"一节的详细说明;
- 将作业提交到内存更大的 fat 节点;
- 减少每个节点的进程数,以确保每个进程有足够的内存。
容器位于 /public/images
目录下,您可以在该目录下查找所需要的容器。以下为示例脚本。
#!/bin/bash
#SBATCH --job-name=cp2k-demo # 作业名称
#SBATCH --nodes=4 # 节点数量
#SBATCH --ntasks-per-node=64 # 每个节点核心数量
#SBATCH --mem=250G # 指定总内存
#SBATCH --partition=cpu
# 这里需要注意的是,您可以使用的最大内存与您所申请的CPU核数有关。
# 因此,如果您希望使用更大的内存,就需要申请更多的CPU核数。
# 以CPU分区为例,每申请一个CPU核,您就可以使用4GB的内存。
# 因此为使用256GB的内存,您需要申请64个CPU核。
# 考虑到系统占用,此处指定为 250G。
module load mpi/openmpi/5.0.6-gcc singularity/3.8.3
export OMP_NUM_THREADS=1
export IMG=/public/images/cp2k-2025.1-cuda124-openmpi-avx512-psmp.sif
# 以下命令中
# --map-by ppr:32:node 指定了每个节点上使用的进程数为32,
# -n $((32*4)) 指定了总进程数为 32 * 4 = 128
#
# 需要注意的是,此处32个进程是针对复杂度较高的体系而言设置,
# 以确保每个进程有足够的内存而不会出现 OOM 的问题。
#
# 具体数值请根据您的体系进行调整,例如,如果您的体系较简单,
# 则可以使用全部的核数来进行计算,例如:
# -n $((64*4)) --map-by ppr:64:node
mpirun -n $((32*4)) --map-by ppr:32:node singularity run $IMG cp2k.psmp -i input.inp >& output
#!/bin/bash
#SBATCH --nodes=2 # 节点数量
#SBATCH --ntasks-per-node=64 # 每个节点核心数量
#SBATCH --account=[budget] # Account name
#SBATCH --partition=cpu # Partition name
#SBATCH --qos=[qos] # QOS name
#SBATCH --job-name=hello # 作业名称
#SBATCH --output=%j.out # 正常日志输出 (%j 参数值为 jobId)
##SBATCH --error=%j.err # 错误日志输出 (%j 参数值为 jobId)
##############################################
# Software Envrironment #
##############################################
module load gcc/9.3 intel/2020.2
module load cp2k/2022.1-intel-2020
##############################################
# Run job #
##############################################
export OMP_NUM_THREADS=1
mpirun cp2k.psmp -i input.inp >> output
Failure
此版本未能通过官方提供的 Regtest,可能会在计算过程中意外退出,但无数值 Issue。 建议您在使用时仔细检查计算结果。
#!/bin/bash
#SBATCH --nodes=1 # 节点数量
#SBATCH --ntasks-per-node=64 # 每个节点核心数量
#SBATCH --job-name=hello # 作业名称
#SBATCH --output=%j.out # 正常日志输出 (%j 参数值为 jobId)
#SBATCH --error=%j.err # 错误日志输出 (%j 参数值为 jobId)
#SBATCH --account=[budget] # Account name
#SBATCH --partition=cpu # Partition name
#SBATCH --qos=[qos] # QOS name
#SBATCH --mem=251G # use full memory of node to avoid OOM
##############################################
# Software Envrironment #
##############################################
module load cp2k/2024.3
##############################################
# Run job #
##############################################
mpirun cp2k.psmp cp2k.inp >> output
#!/bin/bash
#SBATCH --nodes=2 # 节点数量
#SBATCH --ntasks-per-node=64 # 每个节点核心数量
#SBATCH --account=[budget] # Account name
#SBATCH --partition=cpu # Partition name
#SBATCH --qos=[qos] # QOS name
#SBATCH --job-name=hello # 作业名称
#SBATCH --output=%j.out # 正常日志输出 (%j 参数值为 jobId)
##SBATCH --error=%j.err # 错误日志输出 (%j 参数值为 jobId)
##############################################
# Software Envrironment #
##############################################
module load gcc/12.1 intel/2020.2
module load app/cp2k/2023.2
##############################################
# Run job #
##############################################
export OMP_NUM_THREADS=1
mpirun cp2k.psmp -i test >> output
#/bin/bash
#SBATCH -o lgps.out
#SBATCH -J CP2K
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=32
#SBATCH --account=[budget] # Account name
#SBATCH --partition=cpu # Partition name
#SBATCH --qos=[qos] # QOS name
echo $SLURM_NTASKS
echo "Date = $(date)"
echo "Hostname = $(hostname -s)"
echo "Working Directory = $(pwd)"
echo ""
echo "Number of Nodes Allocated = $SLURM_JOB_NUM_NODES"
echo "Number of Tasks Allocated = $SLURM_NTASKS"
echo "Number of Cores/Task Allocated = $SLURM_CPUS_PER_TASK"
echo $SLURM_NPROCS
module load intel/oneapi2021.1
module load cp2k/7.1
srun hostname >./hostfile
echo $SLURM_NTASKS
mpirun -np $SLURM_NTASKS cp2k.psmp -i lgps.inp -o lgps.out
#!/bin/bash
#SBATCH --nodes=2 # 节点数量
#SBATCH --ntasks-per-node=64 # 每个节点核心数量
#SBATCH --account=[budget] # Account name
#SBATCH --partition=cpu # Partition name
#SBATCH --qos=[qos] # QOS name
#SBATCH --job-name=hello # 作业名称
#SBATCH --output=%j.out # 正常日志输出 (%j 参数值为 jobId)
##SBATCH --error=%j.err # 错误日志输出 (%j 参数值为 jobId)
##############################################
# Software Envrironment #
##############################################
module load app/cp2k/2024.1
##############################################
# Run job #
##############################################
export OMPI_MCA_btl_openib_allow_ib=1
mpirun cp2k.popt cp2k.inp >> output
已知问题¶
内存 OOM 问题排查¶
请首先检查所申请内存是否足够,具体可参考 容器 一节的详细说明。
我们推荐您使用容器的方式运行 CP2K 作业,该方法是目前较为稳定的方式。
一些版本可能存在严重的内存泄漏 Issue,若遇到内存 OOM 问题,建议用户关闭 ELPA 功能(特别是使用 DIIS 做对角化的情况),使用 Scalapack 进行对角化。
&GLOBAL
PREFERRED_DIAG_LIBRARY SL
&END GLOBAL
若仍然存在问题,请进一步按照以下步骤进行测试:
-
若为多节点并行任务,请调查任务是否正确并行在每个节点上,当使用
mpirun
时,一般需要确保-np
的值为所有节点的进程总数(通常使用popt
或者OMP_NUM_THREADS=1
时为核数) -
检查输入参数中交换关联泛函部分的
MAX_MEMORY
设置(单位为MB),若该值太大则需要根据节点总量适当缩减。 例如采用杂化泛函进行模拟时,可限制每个进程存储双电子积分的最大内存占用量,以避免需要存储的 ERI 过多导致 OOM:&XC &HF &MEMORY MAX_MEMORY 1500 EPS_STORAGE_SCALING 0.1 &END &END &END XC
具体数值请根据体系情况进行测试,确保不会造成OOM。
-
使用
psmp
版本并尝试提高 OMP 线程数,以减少总进程数,线程间可以共享内存例如总共申请64核,采用16个进程,每个进程4个线程:
... #SBATCH -N 1 #SBATCH --ntasks-per-node=64 ... export OMP_NUM_THREADS=4 mpirun -np 16 cp2k.psmp -i input
-
若问题仍然存在或者出现了意料之外的报错(此时请恢复到
popt
版本),建议尝试降低每个节点上的核数,即调整#SBATCH --ntasks-per-node
为更低的值。