计算化学公社

 找回密码 Forget password
 注册 Register
Views: 1166|回复 Reply: 0
打印 Print 上一主题 Last thread 下一主题 Next thread

[VASP] 從零開始透過Spack套件管理器部屬VASP全家桶@7K62*2 (AOCC, AOCL and HDF5)

[复制链接 Copy URL]

1

帖子

1

威望

45

eV
积分
66

Level 2 能力者

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 christopher0105 于 2025-1-26 19:42 编辑

1. 前言

最近打算踏入量化計算的領域,做簡單的材料表面催化自由能與d態密度計算,原先操起了之前架Chia挖礦的兩顆7302雙路平台,希望可以用來做計算。但後來為了計算效率(其實有一部分是平台硬體配置與設定失誤導致平台沒有發揮應有的性能,但這就是後話了……),將平台升級成雙路7K62,從原本的雙路16核心(共32核)升級到雙路48核心(共96核),並重新檢視所有平台建置的細節,包括NUMA的配置、記憶體插槽分配與L3 Cache的Mapping,由於長時間關注計算化學公社的資訊,對於計算上的疑問得到很多解答,於是作了這篇文章作為回饋,也避免未來要打掉重練時又要走一次彎路。這篇文章會從最一開始的Ubuntu安裝到VASP的測試做詳細的紀錄,如果有圖會放圖,但主要還是以安裝指令為主。

操作平台:
CPU: AMD EPYC 7K62*2
主板:Supermicro H11DSI
記憶體:三星 DDR4 RIDMM 32G 2666V*8 (四通道,未來會擴充到八通道[已訂等年後到貨],最好插滿)
硬碟:SN580 1T (與SATA SSD性能差距不大,已測試)

2. Ubuntu Server 24.04.1 LTS安裝

這邊其實沒有甚麼太大的問題,我是使用Ventory引導Ubuntu安裝的,最初架好這台伺服器時Windows Server與Ubuntu引導都有一些問題,不確定只是那時沒搞懂發生甚麼或是運氣不好導致的,但這次使用Ventory引導,不管是Windows Server 2022安裝還是Ubuntu Server 24.04.1安裝都沒有太大的問題。唯一需要注意的是,不知道Ubuntu Server預設的磁碟分割設定檔想給使用者自由發揮的空間還是怎樣,其實在根目錄(/)是不會分配所有硬碟的空間的,要自己設置。

3. Spack 安裝

這部份也很簡單,AMD官方對於HPC的文檔寫得都很清楚,我這邊只記錄我自己的步驟:
  1. # 定義SPACK_ROOT,我這裡在家目錄下mkdir spack建立一個spack資料夾
  2. export SPACK_ROOT=/home/christopher/spack
复制代码
再來從Github拉取最新源碼:
  1. # 安裝spack到SPACK_ROOT下
  2. git clone -c feature.manyFiles=true https://github.com/spack/spack.git ${SPACK_ROOT}
  3. source ${SPACK_ROOT}/share/spack/setup-env.sh
  4. spack --help
复制代码
將Spack啟動加進開機自啟當中
  1. # 加到/etc/profile的尾部
  2. export SPACK_ROOT=/home/christopher/spack
  3. source ${SPACK_ROOT}/share/spack/setup-env.sh
  4. # 執行以下命令套用設定
  5. source /etc/profile
  6. # 確認SPACK_ROOT已經被定義
  7. echo ${SPACK_ROOT}
复制代码

4. AOCC 安裝

可以先看看目前現有的編譯器(應該是沒有):
  1. spack compilers
复制代码
可能會有以下輸出:
  1. christopher@chris-vasp-testserver:~$ spack compilers
  2. ==> No compilers available. Run `spack compiler find` to autodetect compilers
复制代码
接著安裝lbzip2,先前測試沒安裝所以安裝AOCC遇到問題:
  1. sudo apt-get install lbzip2
复制代码
然後輸入指令安裝AOCC:
  1. spack install aocc +license-agreed
复制代码
安裝完後導入安裝好的編譯器:
  1. spack compiler find
复制代码
輸出如下:
  1. christopher@chris-vasp-testserver:~$ spack compiler find
  2. ==> Warning: "llvm@17.0.6+clang+lld~lldb" has been detected on the system but will not be added to packages.yaml [reason=c compiler not found for llvm@17.0.6+clang+lld~lldb]
  3. ==> Added 1 new compiler to /home/christopher/.spack/linux/compilers.yaml
  4.     aocc@5.0.0
  5. ==> Compilers are defined in the following files:
  6.     /home/christopher/.spack/linux/compilers.yaml
复制代码
有遇到一個Warning,但不影響後續的安裝過程與VASP計算範例測試,接著看看目前有的編譯器:
  1. spack compilers
复制代码
輸出如下:
  1. christopher@chris-vasp-testserver:~$ spack compilers
  2. ==> Available compilers
  3. -- aocc ubuntu24.04-x86_64 --------------------------------------
  4. aocc@5.0.0

  5. -- gcc ubuntu24.04-x86_64 ---------------------------------------
  6. gcc@13.3.0
复制代码
這樣就是安裝完成了,在安裝VASP之前要先load AOCC編譯器(不會有輸出):
  1. spack load aocc
复制代码

5. VASP 安裝

先mkdir vasp建立一個裝VASP源碼的資料夾,我是建立在家目錄下,接著將vasp.6.4.3.tgz上傳到這個資料夾內,目前VASP最新版6.5.0已經發布,但Spack還沒支援,在索引列表中沒有這個檔案:
  1. spack info vasp
复制代码
輸出:
  1. christopher@chris-vasp-testserver:~/vasp/test/PtFeCoNiAg$ spack info vasp
  2. MakefilePackage:   vasp

  3. Description:
  4.      The Vienna Ab initio Simulation Package (VASP) is a computer program
  5.     for atomic scale materials modelling, e.g. electronic structure
  6.     calculations and quantum-mechanical molecular dynamics, from first
  7.     principles.

  8. Homepage: https://vasp.at

  9. Preferred version:  
  10.     6.4.3        file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.4.3.tgz

  11. Safe versions:  
  12.     6.4.3        file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.4.3.tgz
  13.     6.3.2        file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.3.2.tgz
  14.     6.3.0        file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.3.0.tgz

  15. Deprecated versions:  
  16.     6.2.0        file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.2.0.tgz
  17.     6.1.1        file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.1.1.tgz
  18.     5.4.4.pl2    file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.5.4.4.pl2.tgz
  19.     5.4.4        file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.5.4.4.tgz

  20. Variants:
  21.     build_system [makefile]        makefile
  22.         Build systems supported by the package
  23.     cuda [false]                   false, true
  24.         Enables running on Nvidia GPUs
  25.     shmem [true]                   false, true
  26.         Enable use_shmem build flag

  27.     when +cuda
  28.       cuda_arch [none]             none, 10, 11, 12, 13, 20, 21, 30, 32, 35, 37, 50, 52, 53, 60, 61, 62, 70, 72, 75, 80, 86, 87, 89, 90, 90a
  29.           CUDA architecture

  30.     when @6:
  31.       openmp [false]               false, true
  32.           Enable openmp build

  33.     when @:5
  34.       scalapack [false]            false, true
  35.           Enables build with SCALAPACK

  36.     when @6.2:+openmp
  37.       fftlib [true]                false, true
  38.           Enables fftlib build

  39.     when @:6.2
  40.       vaspsol [false]              false, true
  41.           Enable VASPsol implicit solvation model
  42.           https://github.com/henniggroup/VASPsol

  43.     when @6.2:
  44.       hdf5 [false]                 false, true
  45.           Enabled HDF5 support

  46. Build Dependencies:
  47.     amdblis  amdfftw  blas  cuda  fftw  fftw-api  gmake  hdf5  lapack  mpi  nccl  nvhpc  openblas  openmpi  rsync  scalapack

  48. Link Dependencies:
  49.     amdblis  amdfftw  blas  cuda  fftw  fftw-api  hdf5  lapack  mpi  nccl  nvhpc  openblas  openmpi  scalapack

  50. Run Dependencies:
  51.     mpi

  52. Licenses:
  53.     None
复制代码
所以就直接安裝6.4.3,cd到有VASP源碼的資料夾,我這裡是在家目錄的vasp資料夾下:
  1. spack install vasp +openmp +fftlib +hdf5 %aocc ^amdfftw ^amdblis threads=openmp ^amdlibflame ^amdscalapack ^openmpi fabrics=cma,ucx
复制代码
這是支援HDF5的VSP,並且是以單線程編譯安裝,我自己測試這個環境下大概1小時內就可以安裝完了,安裝過程還是很順的,沒有任何錯誤,安裝完後可以輸入以下指令看看安裝的VASP有啟用那些tag:
  1. spack find -lv vasp
复制代码
輸出如下:
  1. christopher@chris-vasp-testserver:~/vasp$ spack find -lv vasp
  2. -- linux-ubuntu24.04-zen2 / aocc@5.0.0 --------------------------
  3. 745zuae vasp@6.4.3~cuda+fftlib~hdf5+openmp+shmem build_system=makefile  
  4. htx3dzc vasp@6.4.3~cuda+fftlib+hdf5+openmp+shmem build_system=makefile
  5. ==> 2 installed packages
复制代码
因為我安裝了兩個VASP(有無HDF5)做比較,所以一個是~hdf5,一個是+hdf5(這是支援的意思),如果只有安裝一個VASP,再開始計算之前須要先輸入以下命令載入VASP:
  1. spack load vasp %aocc
复制代码
如果像是我有多個VASP版本,就要用特徵碼載入:
  1. spack load /htx3dzc %aocc #載入有HDF5功能的VASP
复制代码
可以用以下命令看已經載入的VASP:
  1. spack find --loaded vasp
复制代码
會有以下輸出:
  1. christopher@chris-vasp-testserver:~/vasp$ spack find --loaded vasp
  2. -- linux-ubuntu24.04-zen2 / aocc@5.0.0 --------------------------
  3. vasp@6.4.3
  4. ==> 1 loaded packages
复制代码
這樣代表VASP已經安裝完成可供計算了

6. VASP計算指令與測試

其實接下來的內容應該都可以用腳本或是隊列系統實現,這邊只是紀錄一個新開的Terminal該怎麼開始做計算:

首先須先載入VASP:
  1. spack load vasp %aocc
复制代码
然後cd到有INCAR/POSCAR/POTCAR/KPOINT等VASP輸入文件的資料夾(除了INCAR與POSCAR要自己準備外,另外兩個可以透過vaspkit生成),就可以執行指令開始計算:
  1. mpirun -np 96 vasp_std
复制代码
可以開新的Terminal輸入以下指令查看OUTCAR的每步計算時間:
  1. grep "LOOP:  cpu time" OUTCAR
复制代码
平台有96個物理核心,所以-np後是用96進行全核心計算,計算我的多元金屬合金範例(108個原子,測試使用1x1x1 k-point),電子步的時間如下(前10步平均18.236):
  1. LOOP:  cpu time     37.1084: real time     19.2691
  2. LOOP:  cpu time     33.5258: real time     17.4846
  3. LOOP:  cpu time     37.2365: real time     19.4565
  4. LOOP:  cpu time     38.7297: real time     20.3210
  5. LOOP:  cpu time     47.0021: real time     24.5024
  6. LOOP:  cpu time     31.6126: real time     16.5894
  7. LOOP:  cpu time     29.7579: real time     16.4944
  8. LOOP:  cpu time     29.1972: real time     15.7675
  9. LOOP:  cpu time     31.0749: real time     16.2721
  10. LOOP:  cpu time     30.9988: real time     16.2104
复制代码
先前把8根記憶體都插在CPU1時+全自編譯VASP 6.4.3(沒有使用Spack,過程冗長)計算同一個範例,電子步的時間如下(前10步平均37.251),可以看到硬體架構配置(主要是資源分配)會影響計算速度:
  1. LOOP:  cpu time     87.8196: real time     43.9419
  2. LOOP:  cpu time     79.7427: real time     39.8904
  3. LOOP:  cpu time     82.9829: real time     41.7473
  4. LOOP:  cpu time     97.4278: real time     48.8626
  5. LOOP:  cpu time     90.7791: real time     45.5097
  6. LOOP:  cpu time     59.5127: real time     30.3201
  7. LOOP:  cpu time     60.1066: real time     30.5536
  8. LOOP:  cpu time     59.5769: real time     30.2909
  9. LOOP:  cpu time     60.3508: real time     30.7876
  10. LOOP:  cpu time     60.2076: real time     30.6101
复制代码
後來重新研究7002 EPYC的架構並參考AMD對於VASP計算腳本的建議(以下是原文,本篇不會用到):
  1. #!/bin/bash
  2. # Loading vasp build with AOCC
  3. spack load vasp %aocc

  4. # Si256 dataset is available with VASP source at testsuite/tests/Si256_VJT_HSE06
  5. VASP_SOURCE=<Path to the VASP source file>
  6. cd ${VASP_SOURCE}/testsuite/tests/Si256_VJT_HSE06

  7. # Steps to setup the input files for run
  8. cp INCAR.1.STD INCAR
  9. cp ${VASP_SOURCE}/testsuite/POTCARS/POTCAR.Si256_VJT_HSE06 POTCAR

  10. # Mapping of process to hardware resources
  11. # For AMD EPYC processors it is recommended to use a single rank per L3 cache
  12. # and set OMP_NUM_THREADS to the number of cores per L3 cache. Below is the example
  13. # for processors with 8 cores per L3 cache, hence using OMP_NUM_THREADS=8
  14. CORES_PER_L3CACHE=8
  15. NUM_CORES=$(nproc)
  16. export OMP_NUM_THREADS=${CORES_PER_L3CACHE}  # 8 threads per MPI rank. Recommended OMP_NUM_THREADS= #cores per L3 cache

  17. MPI_RANKS=$(( $NUM_CORES / $OMP_NUM_THREADS ))
  18. RANKS_PER_L3CACHE=$(( $CORES_PER_L3CACHE / $OMP_NUM_THREADS ))
  19. MPI_OPTS=”-np $MPI_RANKS --map-by ppr:$RANKS_PER_L3CACHE:l3cache:pe=$OMP_NUM_THREADS”

  20. # Running VASP
  21. mpirun $MPI_OPTS vasp_std
复制代码
這個腳本對於VASP的計算有對應的L3 Cache資源Mapping,讓資源可以限定在CCX與其對應的L3 Cache中,大幅降低跨CCX與CCD間的資料傳輸延遲,但需要先知道處理器的L3 Cache數量與每個L3 Cache所對應的核心數量,對於L3 Cache數量可以以下列指令知道:
  1. lscpu | grep "L3 cache"
复制代码
輸出如下:
  1. christopher@chris-vasp-testserver:~/vasp/test/PtFeCoNiAg$ lscpu | grep "L3 cache"
  2. L3 cache:                             384 MiB (24 instances)
复制代码
代表我有24個L3 Cache,因為我是雙路7K62平台,單7K62有48個物理核心,所以總共有96個核心,96/24等於4個物理核心,代表每個L3 Cache對應的是4個物理核心,這其實也是7002系EPYC的處理器架構,單CCX有4個物理核心,一個CCD有2個CCX,所以一個CCD就有8個物理核心,7K62有6個CCD,這就構成48個物理核心,這同時也符合ChatGPT所說(我所在地區可訪問ChatGPT):
在 AMD EPYC 7002 系列處理器(代號 “Rome”)中,每個 L3 快取的大小為 16MB,且每個 L3 快取由 4 個核心共享。因此,每個核心對應 4MB 的 L3 快取。這意味著在一個 8 核心的 CCD(核心晶片組)中,包含兩個 4 核心的 CCX(核心複合體),每個 CCX 共享 16MB 的 L3 快取。這種配置在 AMD 的 Zen 2 架構中得以實現

所以根據AMD官方對於MPI_OPTS的定義可以將MPI_OPTS定義成:
  1. MPI_OPTS="-np 24 --map-by ppr:1:l3cache:pe=4"
复制代码
這樣新的計算命令就會變成:
  1. export OMP_NUM_THREADS=4
  2. mpirun -np 24 --map-by ppr:1:l3cache:pe=4 vasp_std
复制代码
如此一來計算的前10個電子步平均變成10.332:
  1. LOOP:  cpu time     95.0959: real time     12.1113
  2. LOOP:  cpu time     85.7824: real time     10.7397
  3. LOOP:  cpu time     90.5418: real time     11.4379
  4. LOOP:  cpu time    101.3257: real time     12.7872
  5. LOOP:  cpu time    104.9692: real time     13.1437
  6. LOOP:  cpu time     66.7829: real time      8.7147
  7. LOOP:  cpu time     66.8999: real time      8.4833
  8. LOOP:  cpu time     67.2637: real time      8.5999
  9. LOOP:  cpu time     68.1013: real time      8.9209
  10. LOOP:  cpu time     66.3250: real time      8.3886
复制代码
這個提升可以說是非常大了,相較於原本的速度提升接近3倍(記憶體全插CPU1,超微主版這樣建議的...),在調整L3 Cache資源Mapping後計算效率有所提升。等記憶體到貨之後充分利用CPU記憶體通道後再來做實測看看完整的通道利用計算效率的差異。如此一來在冷/熱啟動後開始VASP計算只需要三條命令:
  1. spack load vasp %aocc
  2. export OMP_NUM_THREADS=4
  3. mpirun -np 24 --map-by ppr:1:l3cache:pe=4 vasp_std
复制代码

7. 計算前EPYC HPC提升性能的Tips

關閉SWAP (可用free -g確認SWAP分區是否開啟)
  1. sudo swapoff -a
复制代码
關閉NUMA Balancing
  1. echo 0 | sudo tee /proc/sys/kernel/numa_balancing
复制代码
關閉ALSR
  1. echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
复制代码
關閉THR
  1. echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
  2. echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
复制代码
設定CPU為性能模式
  1. sudo cpupower frequency-set -g performance
复制代码
關閉CPU節能C2
  1. sudo cpupower -c 0-95 idle-set -d 2
复制代码

8. 總結

等年後新訂的8根記憶體到了再來看看記憶體帶寬增加對於計算速度的影響,但不得不說AMD官方提供的VASP安裝文檔給我很大的方便,少走很多彎路。也不得不佩服Spack所帶來的方便性,讓安裝VASP的過程沒有這麼痛苦,但缺點是要等Spack更新針對新版VASP的索引支援,自己添加所以可能需要解決非常多的依賴問題,畢竟VASP 6.5.0是一個大版本更新,也增加了許多新的特性。

在此感謝社長與廣大社友們在計算化學公社中熱烈討論所帶來的貢獻,讓計算小白的我在遇到問題時可以有地方找到解決方案,也預祝大家科研順利、年年高升與新年快樂!!!

如果對細節有任何問題與建議也歡迎各位踴躍提出討論

评分 Rate

参与人数
Participants 5
威望 +1 eV +14 收起 理由
Reason
plk412 + 5 谢谢分享
Liv_ + 1 GJ!
ABetaCarw + 5 精品内容
莞cc + 3 赞!
sobereva + 1

查看全部评分 View all ratings

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2025-8-15 17:02 , Processed in 0.167931 second(s), 28 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list