【研究ノート Ep.2】LLZO–Li 界面の幾何最適化を GPU 版 Quantum ESPRESSO で安定・高速化
- November 07, 2025
23
Ep.2|LLZO–Li 界面を Quantum ESPRESSO + GPU で幾何最適化する
シリーズ:固体電解質 LLZO と Li 金属界面の第一原理計算 → データ拡張 → DeePMD 学習 → 大規模MD
TL;DR(本編のゴール)
- 目的: 界面モデルの 安定構造 をつくる(以降の 電荷再分布・DOS/PDOS(Ep.3)、AIMD/DeePMD 学習(Ep.4)の土台)。
- 完了条件: 幾何最適化(
relax/ 必要ならvc-relax)でmax|F| < 1e-3 Ry/Bohr、残留圧力< 0.5 kbarを達成。 - いまの進捗: まず SCF ベースラインを 4×A100 で取得済(42イテレーションで収束、詳細は下の「ベースライン結果」)。この状態から 幾何最適化へ進めます。
- この記事でできること: ブログの内容をコピペするだけで 同条件で再現できます(擬ポテMD5、k点、KS数、壁時計時間などの 再現性メタデータ付き)。
計算環境(GPU)
| QE | Quantum ESPRESSO 7.4.1(GPUビルド) |
|---|---|
| GPU/CPU | NVIDIA A100 80GB × 4(単一ノード) / MPI 4 ranks, OpenMP 1 thread |
| ツールチェイン | NVHPC 25.7(CUDA 12.9, HPC-X Open MPI 2.22.1) |
| 実行スクリプト | run_qe_4gpu_auto.sh(npool自動、GPU静音化のヒントつき) |
| 作業ディレクトリ | ~/li_llzo_if_demo/qe/llzo_if |
すぐ試せる:コピー&ペースト手順(4GPU)
0) 擬ポテンシャル(短名に統一 / symlink)
mkdir -p ./pseudos_min
ln -sf /home/dl/li_llzo_if_demo/qe/llzo_if/pseudos/Li.pbe-s-van_ak.UPF ./pseudos_min/Li.UPF
ln -sf /home/dl/li_llzo_if_demo/qe/llzo_if/pseudos/O.pbe-rrkjus.UPF ./pseudos_min/O.UPF
ln -sf /home/dl/llzo_qe_md_v2/results/llzo_T1000_S1/tmp_1000K_S1/llzo.save/La.pbe-spfn-rrkjus_psl.1.0.0.UPF ./pseudos_min/La.UPF
ln -sf /home/dl/llzo_qe_md_v2/results/llzo_T1000_S1/tmp_1000K_S1/llzo.save/Zr.pbe-spn-rrkjus_psl.1.0.0.UPF ./pseudos_min/Zr.UPF
ls -l ./pseudos_min/*.UPF # リンク確認
1) 入力ファイルから SCF を自動生成(必要に応じて)
※ relax_k222_abs.in を基準に、SCF入力を整えます(Li 置換ミスマッチ時はホストLiを採用)。
./mk_scf_from_abs_auto.sh relax_k222_abs.in scf_ppcg_222.clean.in relax_k222.out '' ppcg
2) SCF(ベースライン)を 4GPU で実行
※ GPUで安定・簡単な ppcg 版か、馴染みのある david 版のどちらかで。
# 推奨(GPU向き):
./run_qe_4gpu_auto.sh scf_ppcg_222.clean.in
# 互換性重視(Davidson):
cp scf_ppcg_222.clean.in scf_david_222.clean.in
sed -i "s/diagonalization='ppcg'/diagonalization='david'/" scf_david_222.clean.in
./run_qe_4gpu_auto.sh scf_david_222.clean.in
3) 幾何最適化(本編)
※ ファイル名は アンダーバーで統一:relax_k222_abs.in。pseudo_dir='./pseudos_min' を使用。
./run_qe_4gpu_auto.sh relax_k222_abs.in
# 収束判定: ログの max|F| < 1e-3 Ry/Bohr、圧力 < 0.5 kbar を確認
(任意)実行ログの冗長メッセージを減らす
OpenACC/NVHPC 通知や MPI のバインド表示を抑制します。
sed -i \
-e 's/^export NVCOMPILER_ACC_NOTIFY=.*/# export NVCOMPILER_ACC_NOTIFY=0/' \
-e 's/^export NV_ACC_TIME=.*/# export NV_ACC_TIME=0/' \
-e 's/--report-bindings //' \
-e 's/ -x NV_ACC_TIME//' run_qe_4gpu_auto.sh
ベースライン結果(SCF, 4×A100, np=4, npool=4)
| 系 | LLZO–Li 界面、nat=108, ntyp=4 |
|---|---|
| カットオフ | ecutwfc=50 Ry, ecutrho=400 Ry |
| k 点 | 2 × 2 × 2(自動)→ 有効 k 点 = 8 |
| KS状態数 | 382 |
| 収束 | 42 iteration で収束(Davidson例) |
| Fermi energy | 1.2140 eV |
| 全エネルギー | -4433.20302581 Ry(smearing項・内部エネルギーはログ参照) |
| メモリ見積 | Max動的RAM/プロセス ≳ 14.02 GB(総計 ≳ 53.84 GB) |
| Wall時間 | 約 3m45s(ログ例:PWSCF: 3m45.35s WALL) |
| 出力 | ./tmp/llzo_if.save/ に密度・波動関数・擬ポテを保存 |
※ ログ末尾の ieee_* 警告は数値演算の一般的な通知で、計算は正常終了(JOB DONE)。
落とし穴と対処
- 擬ポテの取り違え:
pseudo_dirに「ディレクトリ」を渡しただけでファイル名が解決できないと、FIO-F-/formatted read/unit=-13。短名 + 明示的パスにする(./pseudos_min/Li.UPFなど)。 - GPU oversubscription 警告:
Message from routine print_cuda_info: High GPU oversubscription ...が出る場合あり。CVD=1枚/ランクでも表示されることがあり、実害なし。 - NVHPC の通知が多い:上の sed ワンライナーで
NVCOMPILER_ACC_NOTIFY/NV_ACC_TIMEと--report-bindingsを無効化し、静かに。 - OpenMP/LLVM の混在:
OMP_TARGET_OFFLOAD=DISABLED,LIBOMPTARGET_PLUGIN=NONEを実行環境で明示して干渉を避ける。
この先にやること(Ep.2 → Ep.3/4)
- 幾何最適化(本編):
relax(必要ならvc-relax)でmax|F| < 1e-3 Ry/Bohr、圧力< 0.5 kbarを満たすまで収束。 - 最終構造で SCF:安定な電荷密度を確定。
- NSCF + DOS/PDOS:
dos.x/projwfc.xでギャップと軌道寄与を評価。 - 電荷密度差:
pp.xでΔρ = ρ(LLZO|Li) - ρ(LLZO) - ρ(Li)を出力、等値面や断面で可視化(Ep.3)。 - AIMD & データ整備:300/500/800 K、欠陥(VO、Li Frenkel)、界面電場、応力±1–2%などをサンプリング → DeePMD データセット化 → 学習 → LAMMPS で拡散・樹枝化の前兆を探索(Ep.4)。
(補助)最終構造から SCF 入力をつくるシェル断片
Relax のログ(または .save)から CELL_PARAMETERS と最終 ATOMIC_POSITIONS を抜き出して SCF 入力を生成:
# 例: relax の出力ログ relax_k222_abs.out から最終構造を抽出(粗い例)
awk '/Begin final coordinates/{flag=1}
/End final coordinates/{flag=0}
flag' relax_k222_abs.out > final_coords.txt
# 必要に応じて SCF 雛形(&control/&system/&electrons/ATOMIC_SPECIES/K_POINTS)は手元の clean.in から流用
# CELL_PARAMETERS / ATOMIC_POSITIONS を final_coords.txt で置換して scf_opt_222.in を作成
再現性メタデータ(今回のログより)
| 擬ポテンシャル(MD5) |
Li: c85dc41f681efce1cc804fd957bc97e8La: e3bc141c2ecb461b8d0a035ce9ac970eZr: 3d17ee99aa1707c2ccb6b09ed65e51a1O : fadcf19ee70a498d3030e2e79cf929a4
|
|---|---|
| 入力の代表値 | ibrav=0, occupations='smearing', smearing='mv', degauss=0.02 |
| k点設定 | K_POINTS automatic 2 2 2 0 0 0 |
| 実行条件 | MPI 4 ranks, npool=4, GPU 1枚/ランク(CUDA_VISIBLE_DEVICES で固定) |
| 出力先 | ./tmp/llzo_if.save/ |
| 実行時間の内訳(例) | electrons: ~208s, c_bands: ~129s, sum_band: ~40s ほか |
この記事での主な変更点(初版→今回)
- ファイル名の統一:
relax_k222_abs.in(下線)。表記ゆれ(relax_k222.abs.in)を解消。 - コピペ手順を明示: 擬ポテの短名リンク、SCF/relax 実行、GPU静音化(sed ワンライナー)を追加。
- 再現性メタデータ追加: 擬ポテ MD5、k点、KS数、Wall時間、出力先を明記。
- 次にやることの具体化: Ep.2 → Ep.3/4 の作業単位(Δρ、DOS/PDOS、AIMD/欠陥/応力/電場)を列挙。