Skip to content

Instantly share code, notes, and snippets.

@bio-punk
Created March 10, 2026 09:53
Show Gist options
  • Select an option

  • Save bio-punk/29cf3568ae72c6841a5133fffdaa3601 to your computer and use it in GitHub Desktop.

Select an option

Save bio-punk/29cf3568ae72c6841a5133fffdaa3601 to your computer and use it in GitHub Desktop.
容器云部署vasp #vasp #build

VASP 部署环境准备笔记(Environment Modules + NVHPC)

1. 目标与环境

  • 目标: 在容器内使用 Environment Modules 管理 nvhpc 与后续的 VASP 环境。
  • 系统环境: Linux 容器,基于 Ubuntu 24.04(apt 可用)。
  • GPU 环境: 2× NVIDIA GeForce RTX 3090(24 GB,Ampere sm_86),驱动 550.54.14nvidia-smi 报告 CUDA 12.4nvcc -V 为 CUDA 12.6.20
  • NVHPC/HPC-X 版本: NVIDIA HPC SDK 24.9,主要使用 module nvhpc-hpcx-cuda12/24.9
  • NVHPC 安装路径: /root/shared-nvme/nvhpc_sdk/
  • 约定: 只使用 Environment Modules(Tcl 版 module),不使用 Lmod。

2. 安装 Environment Modules

apt-get update
apt-get install -y environment-modules tcl tcl-dev

3. 安装基础数学库(BLAS / LAPACK / FFTW)

VASP 构建需要 BLAS、LAPACK 和 FFTW,这里统一使用系统库(不依赖 MKL):

apt-get install -y libblas-dev liblapack-dev libfftw3-dev
  • 安装完成后,相关库通常位于 /usr/lib/x86_64-linux-gnu/,头文件在 /usr/include

  • 在 VASP 的 makefile.include.nvhpc_acc 中:

    BLAS      = -lblas
    LAPACK    = -llapack
    SCALAPACK = -Mscalapack
    
    FFTW_ROOT ?= /usr
    LLIBS     += -L$(FFTW_ROOT)/lib -lfftw3
    INCS      += -I$(FFTW_ROOT)/include

4. 启用 module 命令(按当前 ~/.bashrc 定义)

3.1 ~/.bashrc 中的统一配置(推荐)

当前 ~/.bashrc 已统一配置好 Environment Modules 与 NVHPC modulefiles,关键片段为:

source /etc/profile.d/modules.sh

# Add NVHPC SDK modulefiles to default MODULEPATH
module use /root/shared-nvme/nvhpc_sdk/modulefiles

只要是通过 bash 启动的交互 shell(包括 ssh 登录后),都会自动:

  • 初始化 Environment Modules(module 命令可用);
  • /root/shared-nvme/nvhpc_sdk/modulefiles 加入默认 MODULEPATH

3.2 手动加载 NVHPC / HPC-X 模块

在任意新的 shell 中,只需要:

source ~/.bashrc          # ssh 登录后通常会自动执行,这里只是显式写出来

module avail nvhpc        # 确认 nvhpc 相关模块已经可见
module avail nvhpc-hpcx*  # 查看带 HPC-X 的 module 变体

# 本笔记中实际使用的构建环境
module load nvhpc-hpcx-cuda12/24.9
module list

确认:

which nvfortran
which mpif90
which nvcc

路径都在 /root/shared-nvme/nvhpc_sdk/Linux_x86_64/24.9/... 下,则说明当前 shell 的 NVHPC/HPC-X 环境加载正确。

6. 使用 nvhpc-hpcx-cuda12/24.9 + GPU(无 MKL)构建 VASP 6.4.2

  • 编译环境nvhpc-hpcx-cuda12/24.9(NVHPC 24.9 + HPC-X + CUDA 12),不使用 MKL。
  • VASP 源码目录/root/shared-nvme/dev260310/vasp.6.4.2

6.1 加载编译环境(在 ssh 进去的干净 shell 中)

source /etc/profile.d/modules.sh
module use /root/shared-nvme/nvhpc_sdk/modulefiles
module load nvhpc-hpcx-cuda12/24.9

module list
which mpif90

6.2 选择不要 MKL、支持 CUDA 的 NVHPC 配置

cd /root/shared-nvme/dev260310/vasp.6.4.2
cp arch/makefile.include.nvhpc_acc makefile.include
  • 该配置:
    • 使用 NVHPC + OpenACC/CUDA(-acc -gpu=... -cudalib=cublas,cusolver,cufft,nccl);
    • 使用通用 BLAS/LAPACK(-lblas -llapack)+ ScaLAPACK(-Mscalapack),不依赖 MKL

推荐根据 RTX 3090 + CUDA 12 调整 GPU 架构行(示例):

FC  = mpif90 -acc -gpu=cc86,cuda12.0
FCL = mpif90 -acc -gpu=cc86,cuda12.0 -c++libs

6.3 BLAS/LAPACK/FFTW 的占位与后续

makefile.include.nvhpc_acc 中相关部分(简要):

BLAS      = -lblas
LAPACK    = -llapack
SCALAPACK = -Mscalapack

FFTW_ROOT ?= /path/to/your/fftw/installation
LLIBS     += -L$(FFTW_ROOT)/lib -lfftw3
INCS      += -I$(FFTW_ROOT)/include
  • 若使用系统库,可通过 apt 安装:

    apt-get install -y libblas-dev liblapack-dev libfftw3-dev

    然后将 FFTW_ROOT 改为 /usr 即可:

    FFTW_ROOT ?= /usr
  • 若改为使用 NVHPC 自带 math_libs,可后续按实际安装路径调整 BLAS/LAPACK/FFTW_ROOT

6.4 编译 VASP

cd /root/shared-nvme/dev260310/vasp.6.4.2
make std -j1                # 仅编译 vasp_std
# 或:make all -j$(nproc)   # vasp_std / vasp_gam / vasp_ncl 全部

ls bin
file bin/vasp_std

若编译失败,查看并保存最后一段 make 输出(或 build_log.txt),按错误信息调整 makefile.include 中的库路径配置。


7. VASP 模块文件 vasp/6.4.2(已完成)

  • 模块文件路径:/root/shared-nvme/modulefiles/vasp/6.4.2
  • 主要内容(Environment Modules Tcl 格式):
#%Module1.0

proc ModulesHelp { } {
    puts stderr "VASP 6.4.2 (std, GPU, built with nvhpc-hpcx-cuda12/24.9)"
    puts stderr "Installed by wangzk@paratera.com"
    puts stderr "Installed at 2026-3-10 17:45:35"
}

module-whatis "VASP 6.4.2 (std, GPU, NVHPC 24.9 + HPC-X + CUDA 12.x)"

# 依赖的编译环境
module load nvhpc-hpcx-cuda12/24.9

# VASP 安装根目录
set    root      /root/shared-nvme/dev260310/vasp.6.4.2
setenv VASP_ROOT $root

# 允许 root 运行 HPC-X 的 mpirun
setenv OMPI_ALLOW_RUN_AS_ROOT          1
setenv OMPI_ALLOW_RUN_AS_ROOT_CONFIRM  1

# 默认 OpenMP 线程数(两卡纯 MPI + GPU)
setenv OMP_NUM_THREADS 1

# 将 vasp_std 加入 PATH
prepend-path PATH $root/bin

使用方式:

source ~/.bashrc
module load vasp/6.4.2
module list
which vasp_std

确认 vasp_std 指向 /root/shared-nvme/dev260310/vasp.6.4.2/bin/vasp_std


8. O₂ 测试算例(vasp_test/o2

  • 测试目录/root/shared-nvme/dev260310/vasp_test/o2

  • POSCAR 修正记录

    • 初始 POSCAR 来自 CONTCAR,且为 Windows 风格行尾(\r\n),导致 VASP 报错:

      ERROR: there must be 1 or 3 items on line 2 of POSCAR

    • 最终改为简单气相 O₂ 分子、并统一为 Unix 行尾(\n),内容为:

      O2 molecule
      1.0
      10.0  0.0  0.0
      0.0  10.0  0.0
      0.0   0.0 10.0
      O
      2
      Cartesian
      0.0   0.0  0.0
      1.2   0.0  0.0
      
  • 运行环境与命令(在 ssh 登录的干净 shell 中):

    cd /root/shared-nvme/dev260310
    
    # 加载模块(会自动设置 NVHPC/HPC-X、允许 root、OMP=1)
    source ~/.bashrc
    module load vasp/6.4.2
    
    cd vasp_test/o2
    mpirun -np 2 vasp_std > ../../test.log 2>&1
  • 预期现象

    • test.log 中出现:
      • POSCAR, INCAR and KPOINTS ok, starting setup
      • reached required accuracy - stopping structural energy minimisation
    • O₂ 自旋极化,mag ≈ 2.0,总能量约 F ~ -9.86E+01 eV(以当时计算为准)。

9. 排错:VASP Fortran 模块依赖问题(*.mod 找不到)

  • 现象示例(make std 报错):

    NVFORTRAN-F-0004-Unable to open MODULE file incar_reader.mod (reader_base.F: 13)
    NVFORTRAN-F-0004-Unable to open MODULE file reader_tags.mod (openmp.F: 57)
    NVFORTRAN-F-0004-Unable to open MODULE file openmp.mod (mpi.F: 3991)
    
  • 原因:VASP 目前仍然使用“传统 make 驱动”的 Fortran 构建系统,模块依赖并行度控制比较原始,make -j$(nproc) 容易因为 .mod 文件尚未生成就被其他目标依赖而失败。

  • 解决步骤(建议保守方式):

    cd /root/shared-nvme/dev260310/vasp.6.4.2
    
    # 清空上一轮 std 构建
    rm -rf build/std
    
    # 使用单线程重新构建(避免模块依赖竞态)
    make std -j1
  • 若单线程编译成功,再按需尝试小并行度(如 -j2-j4),但在 GPU + OpenACC + NVFORTRAN 组合下,推荐长期保持 -j1,把并行度交给 MPI + GPU。

备注:VASP 官方当前仍主要依赖手工维护的 makefilemakefile.include.*,尚未提供现代 CMake 风格的一键多平台构建链,这类 Fortran 模块顺序问题较常见。


10. 排错:清理 Cursor 后端进程(极端情况)

在极端情况下,如果 Cursor 后端进程出现异常(例如环境被写乱、无法正常连接等),可以通过下面命令在容器内强制杀掉所有名为 cursor 的进程,让其由上层重新拉起:

ps -aux | grep cursor | awk '{print $2}' | xargs kill

注意:这条命令会杀掉所有名字里包含 cursor 的进程,使用前确认当前只在这个容器里开发,避免误杀无关进程。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment