본문으로 건너뛰기

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장)높음대각화/역행렬, (있다면) kcontour 적분마다 Green 함수 역행렬
finite-bias TranSIESTA (9장)높음 × bias 수위와 동일bias chain은 순차 의존
TBtrans (7장)중간에너지점병렬 확장성이 가장 좋음
sisl 후처리 (10장)낮음로컬에서 충분

행렬 연산이 지배하는 TranSIESTA는 orbital 수 NN에 대해 O(N3)O(N^3)으로 커진다. 반면 TBtrans는 에너지 grid의 각 점이 완전히 독립이라 — 우리 예제만 해도 [3,3][-3, 3] 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장).
  • 서로 독립: +V+V chain과 V-V chain (둘 다 0 V에서 분기), device 길이 시리즈, 파라미터 스캔, 서로 다른 구조 케이스.

독립 계산 NN개는 큰 노드 하나에서 순차로 돌리기보다 NN개(또는 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 마지막 부분의 수렴/정상 종료 메시지로 한다.

제출 직후 검증 — "넣었다"로 끝내지 않는다

제출 후 방치했다가 다음 날 시작 직후 실패한 잡을 발견하는 것이 HPC에서 가장 흔한 시간 손실이다. 다음 3단계를 체크리스트로 고정한다.

시점확인명령 예
제출 직후 1–2분큐 상태가 R인지 (PD면 대기 사유), stdout 파일이 생겼는지, 즉시 중단(abort)되는 에러가 없는지squeue -u $USER 또는 qstat -u $USER, ls -l siesta.stdout, 아래 grep
5–10분SCF iteration이 실제로 진행 중인지grep -c scf siesta.stdout 값이 증가하는지
30–60분첫 케이스 완료 또는 충분한 진행. 멈춰 있으면 원인 분석stdout mtime + step 수

즉시 중단 에러 grep은 한 줄로:

grep -iE "error|abort|segfault|out of memory" siesta.stdout

추가로 두 가지 신호를 플래그로 삼는다:

  • 조기 종료 — 예상 walltime의 수분의 일 만에 끝난 잡은 성공이 아니라 실패 신호일 가능성이 높다(입력 오류, 파일 누락으로 즉시 abort). 출력 검증 전에는 완료로 취급하지 않는다.
  • 멈춘 잡(hang) — 큐 상태가 R이어도 stdout이 오래 갱신되지 않으면(마지막 수정 시각 확인) 실제로는 멈춰 있을 수 있다. 큐 상태 + stdout 갱신 + step 증가의 3중 확인이 확실하다.

fan-out 잡에서는 케이스별 출력 파일 개수를 노드/잡 수와 대조한다 — 일부만 돌고 나머지가 조용히 빠진 경우를 첫 1시간 안에 잡아내기 위해서다.

재시작: 수렴 자산을 버리지 않는다

SCF 수렴에 든 비용은 파일로 남는다. 재계산·연장·이관 시 이 자산을 재사용하는 것이 기본이다.

  • SIESTA density matrixDM.UseSaveDM T를 켜 두면 같은 디렉토리의 *.DM에서 SCF를 warm-start한다. 구조가 조금 바뀐 재계산도 fresh보다 훨씬 빨리 수렴한다.
  • TranSIESTA TSDE — finite-bias chain에서 각 bias는 직전 bias의 *.TSDE(DM+EDM)를 복사받아 시작한다(9장). 이것이 없으면 TranSIESTA가 즉시 에러로 멈춘다. 복사해도 되는 파일과 절대 복사하면 안 되는 파일(bias 의존 캐시)의 구분은 함정 모음에 정리했다.
  • walltime 초과 대비 — 긴 relax/SCF는 walltime 안에 끝나지 않을 수 있다는 전제로, 항상 재시작 가능한 옵션을 켜 두고 잡을 나눠 제출한다.

연습문제

  1. device 0 V 계산을 rank 수를 2배씩 바꿔가며 돌려 SCF step당 wall-clock을 재고, "step당 core-hour"가 최소가 되는 rank 수를 찾아라. wall-clock 최소와 같은가.
  2. ±0.1\pm 0.1, ±0.2\pm 0.2 V 4개 bias 계산의 의존 그래프를 그리고, 최소 wall-clock으로 끝내는 제출 전략(몇 개의 잡, 어떤 순서)을 설계하라.

참고문헌