|
本帖最后由 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的文檔寫得都很清楚,我這邊只記錄我自己的步驟:
- # 定義SPACK_ROOT,我這裡在家目錄下mkdir spack建立一個spack資料夾
- export SPACK_ROOT=/home/christopher/spack
复制代码 再來從Github拉取最新源碼:
- # 安裝spack到SPACK_ROOT下
- git clone -c feature.manyFiles=true https://github.com/spack/spack.git ${SPACK_ROOT}
- source ${SPACK_ROOT}/share/spack/setup-env.sh
- spack --help
复制代码 將Spack啟動加進開機自啟當中
- # 加到/etc/profile的尾部
- export SPACK_ROOT=/home/christopher/spack
- source ${SPACK_ROOT}/share/spack/setup-env.sh
- # 執行以下命令套用設定
- source /etc/profile
- # 確認SPACK_ROOT已經被定義
- echo ${SPACK_ROOT}
复制代码
4. AOCC 安裝
可以先看看目前現有的編譯器(應該是沒有):
可能會有以下輸出:
- christopher@chris-vasp-testserver:~$ spack compilers
- ==> No compilers available. Run `spack compiler find` to autodetect compilers
复制代码 接著安裝lbzip2,先前測試沒安裝所以安裝AOCC遇到問題:
- sudo apt-get install lbzip2
复制代码 然後輸入指令安裝AOCC:
- spack install aocc +license-agreed
复制代码 安裝完後導入安裝好的編譯器:
輸出如下:
- christopher@chris-vasp-testserver:~$ spack compiler find
- ==> 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]
- ==> Added 1 new compiler to /home/christopher/.spack/linux/compilers.yaml
- aocc@5.0.0
- ==> Compilers are defined in the following files:
- /home/christopher/.spack/linux/compilers.yaml
复制代码 有遇到一個Warning,但不影響後續的安裝過程與VASP計算範例測試,接著看看目前有的編譯器:
輸出如下:
- christopher@chris-vasp-testserver:~$ spack compilers
- ==> Available compilers
- -- aocc ubuntu24.04-x86_64 --------------------------------------
- aocc@5.0.0
- -- gcc ubuntu24.04-x86_64 ---------------------------------------
- gcc@13.3.0
复制代码 這樣就是安裝完成了,在安裝VASP之前要先load AOCC編譯器(不會有輸出):
5. VASP 安裝
先mkdir vasp建立一個裝VASP源碼的資料夾,我是建立在家目錄下,接著將vasp.6.4.3.tgz上傳到這個資料夾內,目前VASP最新版6.5.0已經發布,但Spack還沒支援,在索引列表中沒有這個檔案:
輸出:
- christopher@chris-vasp-testserver:~/vasp/test/PtFeCoNiAg$ spack info vasp
- MakefilePackage: vasp
- Description:
- The Vienna Ab initio Simulation Package (VASP) is a computer program
- for atomic scale materials modelling, e.g. electronic structure
- calculations and quantum-mechanical molecular dynamics, from first
- principles.
- Homepage: https://vasp.at
- Preferred version:
- 6.4.3 file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.4.3.tgz
- Safe versions:
- 6.4.3 file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.4.3.tgz
- 6.3.2 file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.3.2.tgz
- 6.3.0 file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.3.0.tgz
- Deprecated versions:
- 6.2.0 file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.2.0.tgz
- 6.1.1 file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.6.1.1.tgz
- 5.4.4.pl2 file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.5.4.4.pl2.tgz
- 5.4.4 file:///home/christopher/vasp/test/PtFeCoNiAg/vasp.5.4.4.tgz
- Variants:
- build_system [makefile] makefile
- Build systems supported by the package
- cuda [false] false, true
- Enables running on Nvidia GPUs
- shmem [true] false, true
- Enable use_shmem build flag
- when +cuda
- 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
- CUDA architecture
- when @6:
- openmp [false] false, true
- Enable openmp build
- when @:5
- scalapack [false] false, true
- Enables build with SCALAPACK
- when @6.2:+openmp
- fftlib [true] false, true
- Enables fftlib build
- when @:6.2
- vaspsol [false] false, true
- Enable VASPsol implicit solvation model
- https://github.com/henniggroup/VASPsol
- when @6.2:
- hdf5 [false] false, true
- Enabled HDF5 support
- Build Dependencies:
- amdblis amdfftw blas cuda fftw fftw-api gmake hdf5 lapack mpi nccl nvhpc openblas openmpi rsync scalapack
- Link Dependencies:
- amdblis amdfftw blas cuda fftw fftw-api hdf5 lapack mpi nccl nvhpc openblas openmpi scalapack
- Run Dependencies:
- mpi
- Licenses:
- None
复制代码 所以就直接安裝6.4.3,cd到有VASP源碼的資料夾,我這裡是在家目錄的vasp資料夾下:
- spack install vasp +openmp +fftlib +hdf5 %aocc ^amdfftw ^amdblis threads=openmp ^amdlibflame ^amdscalapack ^openmpi fabrics=cma,ucx
复制代码 這是支援HDF5的VSP,並且是以單線程編譯安裝,我自己測試這個環境下大概1小時內就可以安裝完了,安裝過程還是很順的,沒有任何錯誤,安裝完後可以輸入以下指令看看安裝的VASP有啟用那些tag:
輸出如下:
- christopher@chris-vasp-testserver:~/vasp$ spack find -lv vasp
- -- linux-ubuntu24.04-zen2 / aocc@5.0.0 --------------------------
- 745zuae vasp@6.4.3~cuda+fftlib~hdf5+openmp+shmem build_system=makefile
- htx3dzc vasp@6.4.3~cuda+fftlib+hdf5+openmp+shmem build_system=makefile
- ==> 2 installed packages
复制代码 因為我安裝了兩個VASP(有無HDF5)做比較,所以一個是~hdf5,一個是+hdf5(這是支援的意思),如果只有安裝一個VASP,再開始計算之前須要先輸入以下命令載入VASP:
如果像是我有多個VASP版本,就要用特徵碼載入:
- spack load /htx3dzc %aocc #載入有HDF5功能的VASP
复制代码 可以用以下命令看已經載入的VASP:
會有以下輸出:
- christopher@chris-vasp-testserver:~/vasp$ spack find --loaded vasp
- -- linux-ubuntu24.04-zen2 / aocc@5.0.0 --------------------------
- vasp@6.4.3
- ==> 1 loaded packages
复制代码 這樣代表VASP已經安裝完成可供計算了
6. VASP計算指令與測試
其實接下來的內容應該都可以用腳本或是隊列系統實現,這邊只是紀錄一個新開的Terminal該怎麼開始做計算:
首先須先載入VASP:
然後cd到有INCAR/POSCAR/POTCAR/KPOINT等VASP輸入文件的資料夾(除了INCAR與POSCAR要自己準備外,另外兩個可以透過vaspkit生成),就可以執行指令開始計算:
可以開新的Terminal輸入以下指令查看OUTCAR的每步計算時間:
- grep "LOOP: cpu time" OUTCAR
复制代码 平台有96個物理核心,所以-np後是用96進行全核心計算,計算我的多元金屬合金範例(108個原子,測試使用1x1x1 k-point),電子步的時間如下(前10步平均18.236):
- LOOP: cpu time 37.1084: real time 19.2691
- LOOP: cpu time 33.5258: real time 17.4846
- LOOP: cpu time 37.2365: real time 19.4565
- LOOP: cpu time 38.7297: real time 20.3210
- LOOP: cpu time 47.0021: real time 24.5024
- LOOP: cpu time 31.6126: real time 16.5894
- LOOP: cpu time 29.7579: real time 16.4944
- LOOP: cpu time 29.1972: real time 15.7675
- LOOP: cpu time 31.0749: real time 16.2721
- LOOP: cpu time 30.9988: real time 16.2104
复制代码 先前把8根記憶體都插在CPU1時+全自編譯VASP 6.4.3(沒有使用Spack,過程冗長)計算同一個範例,電子步的時間如下(前10步平均37.251),可以看到硬體架構配置(主要是資源分配)會影響計算速度:
- LOOP: cpu time 87.8196: real time 43.9419
- LOOP: cpu time 79.7427: real time 39.8904
- LOOP: cpu time 82.9829: real time 41.7473
- LOOP: cpu time 97.4278: real time 48.8626
- LOOP: cpu time 90.7791: real time 45.5097
- LOOP: cpu time 59.5127: real time 30.3201
- LOOP: cpu time 60.1066: real time 30.5536
- LOOP: cpu time 59.5769: real time 30.2909
- LOOP: cpu time 60.3508: real time 30.7876
- LOOP: cpu time 60.2076: real time 30.6101
复制代码 後來重新研究7002 EPYC的架構並參考AMD對於VASP計算腳本的建議(以下是原文,本篇不會用到):
- #!/bin/bash
- # Loading vasp build with AOCC
- spack load vasp %aocc
- # Si256 dataset is available with VASP source at testsuite/tests/Si256_VJT_HSE06
- VASP_SOURCE=<Path to the VASP source file>
- cd ${VASP_SOURCE}/testsuite/tests/Si256_VJT_HSE06
- # Steps to setup the input files for run
- cp INCAR.1.STD INCAR
- cp ${VASP_SOURCE}/testsuite/POTCARS/POTCAR.Si256_VJT_HSE06 POTCAR
- # Mapping of process to hardware resources
- # For AMD EPYC processors it is recommended to use a single rank per L3 cache
- # and set OMP_NUM_THREADS to the number of cores per L3 cache. Below is the example
- # for processors with 8 cores per L3 cache, hence using OMP_NUM_THREADS=8
- CORES_PER_L3CACHE=8
- NUM_CORES=$(nproc)
- export OMP_NUM_THREADS=${CORES_PER_L3CACHE} # 8 threads per MPI rank. Recommended OMP_NUM_THREADS= #cores per L3 cache
- MPI_RANKS=$(( $NUM_CORES / $OMP_NUM_THREADS ))
- RANKS_PER_L3CACHE=$(( $CORES_PER_L3CACHE / $OMP_NUM_THREADS ))
- MPI_OPTS=”-np $MPI_RANKS --map-by ppr:$RANKS_PER_L3CACHE:l3cache:pe=$OMP_NUM_THREADS”
- # Running VASP
- mpirun $MPI_OPTS vasp_std
复制代码 這個腳本對於VASP的計算有對應的L3 Cache資源Mapping,讓資源可以限定在CCX與其對應的L3 Cache中,大幅降低跨CCX與CCD間的資料傳輸延遲,但需要先知道處理器的L3 Cache數量與每個L3 Cache所對應的核心數量,對於L3 Cache數量可以以下列指令知道:
輸出如下:
- christopher@chris-vasp-testserver:~/vasp/test/PtFeCoNiAg$ lscpu | grep "L3 cache"
- 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定義成:
- MPI_OPTS="-np 24 --map-by ppr:1:l3cache:pe=4"
复制代码 這樣新的計算命令就會變成:
- export OMP_NUM_THREADS=4
- mpirun -np 24 --map-by ppr:1:l3cache:pe=4 vasp_std
复制代码 如此一來計算的前10個電子步平均變成10.332:
- LOOP: cpu time 95.0959: real time 12.1113
- LOOP: cpu time 85.7824: real time 10.7397
- LOOP: cpu time 90.5418: real time 11.4379
- LOOP: cpu time 101.3257: real time 12.7872
- LOOP: cpu time 104.9692: real time 13.1437
- LOOP: cpu time 66.7829: real time 8.7147
- LOOP: cpu time 66.8999: real time 8.4833
- LOOP: cpu time 67.2637: real time 8.5999
- LOOP: cpu time 68.1013: real time 8.9209
- LOOP: cpu time 66.3250: real time 8.3886
复制代码 這個提升可以說是非常大了,相較於原本的速度提升接近3倍(記憶體全插CPU1,超微主版這樣建議的...),在調整L3 Cache資源Mapping後計算效率有所提升。等記憶體到貨之後充分利用CPU記憶體通道後再來做實測看看完整的通道利用計算效率的差異。如此一來在冷/熱啟動後開始VASP計算只需要三條命令:
- spack load vasp %aocc
- export OMP_NUM_THREADS=4
- mpirun -np 24 --map-by ppr:1:l3cache:pe=4 vasp_std
复制代码
7. 計算前EPYC HPC提升性能的Tips
關閉SWAP (可用free -g確認SWAP分區是否開啟)
關閉NUMA Balancing
- echo 0 | sudo tee /proc/sys/kernel/numa_balancing
复制代码 關閉ALSR
- echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
复制代码 關閉THR
- echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
- echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
复制代码 設定CPU為性能模式
- sudo cpupower frequency-set -g performance
复制代码 關閉CPU節能C2
- sudo cpupower -c 0-95 idle-set -d 2
复制代码
8. 總結
等年後新訂的8根記憶體到了再來看看記憶體帶寬增加對於計算速度的影響,但不得不說AMD官方提供的VASP安裝文檔給我很大的方便,少走很多彎路。也不得不佩服Spack所帶來的方便性,讓安裝VASP的過程沒有這麼痛苦,但缺點是要等Spack更新針對新版VASP的索引支援,自己添加所以可能需要解決非常多的依賴問題,畢竟VASP 6.5.0是一個大版本更新,也增加了許多新的特性。
在此感謝社長與廣大社友們在計算化學公社中熱烈討論所帶來的貢獻,讓計算小白的我在遇到問題時可以有地方找到解決方案,也預祝大家科研順利、年年高升與新年快樂!!!
如果對細節有任何問題與建議也歡迎各位踴躍提出討論
|
评分 Rate
-
查看全部评分 View all ratings
|