설치
가장 간단한 방법은 conda-forge다. 관리자 권한 없이 홈 디렉터리에 설치되므로 클러스터에서도 그대로 쓸 수 있다.
# miniforge가 없다면 먼저 설치
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
bash Miniforge3-Linux-x86_64.sh -b -p $HOME/miniforge3
source $HOME/miniforge3/etc/profile.d/conda.sh
# xtb와 crest를 한 환경에
conda create -n xtb -c conda-forge xtb crest
conda activate xtb
xtb --version
crest --version
GitHub 릴리스(grimme-lab/xtb,
crest-lab/crest)에서 정적 링크된 실행 파일을 받아
PATH에 넣어도 된다. ORCA가 부르는 otool_xtb도 이 실행 파일이다.
ORCA 안에서 쓰기 위한 준비는 ORCA 가이드 16장에 있다.
첫 계산
입력은 xyz 파일 하나면 된다. 옵션 없이 부르면 GFN2-xTB 단일점 에너지를 계산한다.
xtb ala.xyz > sp.out
출력 끝부분에 요약 상자가 나온다. 아래는 이 가이드의 알라닌 다이펩타이드 출발 구조에서 나온 실제 출력이다.
:::::::::::::::::::::::::::::::::::::::::::::::::::::
:: SUMMARY ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::
:: total energy -32.968780800655 Eh ::
:: gradient norm 0.060736909638 Eh/a0 ::
:: HOMO-LUMO gap 4.201966619930 eV ::
::.................................................::
:: SCC energy -33.334018569053 Eh ::
:: -> isotropic ES 0.076928930387 Eh ::
:: -> anisotropic ES 0.004824182260 Eh ::
:: -> anisotropic XC 0.011329018690 Eh ::
:: -> dispersion -0.015484427685 Eh ::
:: repulsion energy 0.365237768398 Eh ::
:: add. restraining 0.000000000000 Eh ::
:: total charge -0.000000000000 e ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::
--opt를 붙이면 이 상자가 두 번 나온다. 처음 것은 출발 구조의 단일점이고, 마지막 것이 최적화된 구조의 값이다.
같은 구조를 --opt tight로 최적화하면 전체 에너지는 −32.975847892266 Eh, 기울기 노름은 0.00016 Eh/a0로 내려간다.
xtb는 결과 파일을 현재 디렉터리에 고정된 이름으로 쓴다. 계산마다 디렉터리를 따로 만들지 않으면 다음 계산이 앞의 결과를 덮어쓴다.
출력 파일
| 파일 | 내용 |
|---|---|
xtbopt.xyz | 최적화된 구조 (--opt) |
xtbopt.log | 최적화 경로. 여러 프레임 xyz라 시각화 프로그램으로 바로 연다. |
charges, wbo | 원자 부분 전하, Wiberg 결합 차수 |
vibspectrum, hessian, g98.out | 진동수 결과 (--hess, --ohess). g98.out은 진동 모드 애니메이션용 |
xtb.trj | MD 궤적 (--md) |
xtbrestart | 다음 계산의 초기 추정으로 읽히는 파동함수. 다른 분자를 계산할 때는 지운다. |
같은 디렉터리에 다른 분자의 xtbrestart가 남아 있으면 xtb가 그것을 읽으려 한다.
원자 수가 달라 무시되는 경우가 대부분이지만, 계산마다 디렉터리를 나누면 이런 일을 신경 쓸 필요가 없다.
병렬 설정
xtb는 OpenMP로 병렬화된다. 코어 수와 스택 크기를 환경 변수로 준다.
export OMP_NUM_THREADS=8,1
export OMP_STACKSIZE=4G
export OPENBLAS_NUM_THREADS=1
ulimit -s unlimited
xtb ala.xyz --opt -P 8 > opt.out
스택 크기가 작으면 큰 분자에서 이유 없이 segfault가 난다. 수십 원자짜리 분자는 코어를 많이 줘도 빨라지지 않으니, 여러 계산을 동시에 돌릴 때는 계산당 코어를 적게 잡는 편이 전체 처리량이 높다.
conda-forge의 xtb는 OpenBLAS에 링크돼 있다. OpenBLAS는 MKL_NUM_THREADS를 무시하고 OpenMP 스레드마다
자기 스레드를 따로 띄우기 때문에, 이 변수를 두지 않으면 할당받은 코어보다 훨씬 많은 스레드가 서로 코어를 다툰다.
이 가이드의 예제를 NUS HPC 계산 노드(8코어)에서 처음 돌렸을 때 기체상 최적화가 20.2초(CPU 시간 159.6초) 걸렸고,
100 ps MD는 4시간 제한 안에 끝나지 않을 속도였다. OPENBLAS_NUM_THREADS=1을 넣고 다시 돌리자 같은 최적화가 0.52초로 줄었다.
결과가 틀리게 나오지는 않고 느려지기만 하므로, 알아채기 어렵다.
클러스터 작업 스크립트
이 가이드의 예제는 NUS HPC의 Vanda 클러스터(PBS Pro)에서 xtb 6.7.1과 CREST 3.0.2(conda-forge)로 돌렸다. 아래는 그때 쓴 스크립트의 뼈대다.
#!/bin/bash
#PBS -N xtb-opt
#PBS -l select=1:ncpus=8:mem=16gb
#PBS -l walltime=04:00:00
#PBS -j oe
#PBS -q auto_free
cd $PBS_O_WORKDIR
source $HOME/miniforge3/etc/profile.d/conda.sh
conda activate xtb
export OMP_NUM_THREADS=$NCPUS,1 OMP_STACKSIZE=4G
export OPENBLAS_NUM_THREADS=1
ulimit -s unlimited
mkdir -p opt && cd opt
xtb ../ala.xyz --opt tight > opt.out
#PBS -q 줄은 클러스터마다 다르다. Vanda에서는 실행 큐에 직접 제출할 수 없고 라우팅 큐를 거쳐야 해서,
-q cpu_parallel처럼 쓰면 Access to queue is denied로 거절된다. 여기서는 auto_free에 넣었고,
8코어 요청이라 cpu_parallel로 넘어가 바로 시작됐다. 다른 클러스터는 qstat -Q와 사이트 문서에서 큐 이름을 확인한다.
기본 큐가 있는 곳이면 이 줄을 빼도 된다.