跳转至

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)
如果遇到这种情况,可尝试:

  1. 申请的内存足够内存, 具体请参考以下"容器"一节的详细说明;
  2. 将作业提交到内存更大的 fat 节点;
  3. 减少每个节点的进程数,以确保每个进程有足够的内存。

容器位于 /public/images 目录下,您可以在该目录下查找所需要的容器。以下为示例脚本。

cp2k-singularity-example.sh
#!/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
/public/slurmscript_demo/cp2k-2022.1.slurm
#!/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。 建议您在使用时仔细检查计算结果。

/public/slurmscript_demo/cp2k-2024.3.slurm
#!/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
/public/slurmscript_demo/cp2k-2023.2.slurm
#!/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
/public/slurmscript_demo/cp2k-7.1.slurm
#/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
/public/slurmscript_demo/cp2k-2024.1.slurm
#!/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

若仍然存在问题,请进一步按照以下步骤进行测试:

  1. 若为多节点并行任务,请调查任务是否正确并行在每个节点上,当使用 mpirun 时,一般需要确保 -np 的值为所有节点的进程总数(通常使用 popt 或者 OMP_NUM_THREADS=1 时为核数)

  2. 检查输入参数中交换关联泛函部分的 MAX_MEMORY 设置(单位为MB),若该值太大则需要根据节点总量适当缩减。 例如采用杂化泛函进行模拟时,可限制每个进程存储双电子积分的最大内存占用量,以避免需要存储的 ERI 过多导致 OOM:

    &XC
      &HF
        &MEMORY
          MAX_MEMORY 1500
          EPS_STORAGE_SCALING 0.1
        &END
      &END
    &END XC
    

    具体数值请根据体系情况进行测试,确保不会造成OOM。

  3. 使用 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
    
  4. 若问题仍然存在或者出现了意料之外的报错(此时请恢复到 popt 版本),建议尝试降低每个节点上的核数,即调整 #SBATCH --ntasks-per-node 为更低的值。