12. HPC에서 돌리기
이 튜토리얼의 1D chain 예제는 노트북에서 돌지만, 실제 연구 시스템(수백 원자 device, 여러 bias, 길이 시리즈)은 클러스터가 필요하다. 이 장에서는 SIESTA/TranSIESTA/TBtrans 계산의 병렬 구조를 이해하고, 잡 스크립트 작성과 제출 직후 검증 습관까지 워크플로우로 정리한다. 파티션·모듈·코어 수는 시스템마다 다르므로 전부 자리표시자로 쓴다 — 소속 클러스터의 문서로 치환하면 된다.
학습 목표
- 워크플로우 단계별 계산 비용의 구조와 병렬화 축을 파악한다.
- SLURM/PBS 잡 스크립트를 작성하고 독립 계산을 fan-out한다.
- 제출 직후 1–2분 실측 검증과 조기 종료 감지를 습관화한다.
- DM/TSDE 재시작 자산을 재사용해 SCF 반복 비용을 줄인다.
어디가 비싼가
| 단계 | 비용 | 병렬화 축 | 비고 |
|---|---|---|---|
| 전극 SCF (5장) | 낮음 | k-point, 대각화 | 한 번 계산해 모든 device가 공유 |
| device 0 V TranSIESTA (6장) | 높음 | 대각화/역행렬, (있다면) k | contour 적분마다 Green 함수 역행렬 |
| finite-bias TranSIESTA (9장) | 높음 × bias 수 | 위와 동일 | bias chain은 순차 의존 |
| TBtrans (7장) | 중간 | 에너지점 | 병렬 확장성이 가장 좋음 |
| sisl 후처리 (10장) | 낮음 | — | 로컬에서 충분 |
행렬 연산이 지배하는 TranSIESTA는 orbital 수 에 대해 으로 커진다. 반면 TBtrans는 에너지 grid의 각 점이 완전히 독립이라 — 우리 예제만 해도 eV에 delta 0.001 eV로 6001개 점 — MPI rank에 점을 나눠주면 거의 이상적으로 스케일한다.
SIESTA/TranSIESTA의 MPI 병렬
- 대각화 병렬 — SIESTA의 SCF 대각화는 ScaLAPACK 계열로 분산되며, 빌드에 따라 ELPA 같은 고성능 solver를 쓸 수 있다(
Diag.Algorithm— 사용 가능 여부는 빌드/매뉴얼 확인). rank 수를 늘리면 행렬 블록이 잘게 쪼개져 통신 비용이 늘어나므로, 작은 시스템에 rank를 쏟아붓는 것은 오히려 느리다. 분산 대각화 라이브러리는 processor grid 모양에 민감해, rank 수에 따라 수치 거동이 달라지는 경우도 있다 — 한 프로젝트 안에서는 rank 수를 고정하는 것이 재현성에 좋다. - k-point 병렬 — k-point가 여러 개면 k끼리는 통신이 거의 없어 효율이 좋다. 단 1D transport 계산의 device 단계는 k가 적어(transverse는 vacuum, transport 방향은 반무한 처리) 이 축의 이득이 제한적이다. 전극 SCF는 transport 방향 dense k라 k 병렬 이득이 크다.
- 경험 법칙 — production 크기의 대표 케이스 하나로 rank 수를 2배씩 바꾸는 작은 스케일링 테스트를 먼저 돌리고, wall-clock이 아닌 자원량 대비 처리량(예: SCF step당 core-hour)이 최적인 지점을 고른다.
독립 잡 fan-out
의존 관계를 먼저 그린다:
- 순차 의존: 전극 → device 0 V → bias chain (각 bias는 직전 bias의 수렴 결과에서 재시작, 9장).
- 서로 독립: chain과 chain (둘 다 0 V에서 분기), device 길이 시리즈, 파라미터 스캔, 서로 다른 구조 케이스.
독립 계산 개는 큰 노드 하나에서 순차로 돌리기보다 잡 개(또는 job array)로 병렬 제출하는 쪽이 wall-clock에서 압도적으로 유리하다. 큰 할당 하나에 케이스 하나만 돌리는 것은 자원 낭비의 전형이다.
잡 스크립트
SLURM 예시
run.slurm
#!/bin/bash
#SBATCH --job-name=c19n-0bias
#SBATCH --partition=<partition> # 시스템별 파티션 이름으로 교체
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=<ncores> # 노드당 물리 코어 수에 맞춤
#SBATCH --time=06:00:00
#SBATCH --mail-type=BEGIN,END,FAIL # 시작/종료/실패 메일 알림
#SBATCH --mail-user=<your-email>
module load <siesta-module> # 시스템별 모듈 이름으로 교체
srun siesta input.fdf > siesta.stdout && touch NORMAL_EXIT
PBS 예시
run.pbs
#!/bin/bash
#PBS -N c19n-0bias
#PBS -q <queue>
#PBS -l select=1:ncpus=<ncores>:mpiprocs=<ncores>
#PBS -l walltime=06:00:00
#PBS -M <your-email>
#PBS -m abe
cd $PBS_O_WORKDIR
module load <siesta-module>
mpirun -np <ntasks> siesta input.fdf > siesta.stdout && touch NORMAL_EXIT
메일 알림 옵션(--mail-type / -m abe)은 습관으로 넣는다 — 긴 잡의 실패를 몇 시간 뒤에야 알아채는 일을 막아 준다. 마지막 줄의 NORMAL_EXIT 마커는 배치 파이프라인에서 "정상 종료한 잡"을 기계적으로 걸러내는 관례다. 단 마커 존재 자체가 수렴을 뜻하지는 않는다 — 판정은 항상 stdout 마지막 부분의 수렴/정상 종료 메시지로 한다.