Windows 11でwslcを使い、Quantum ESPRESSO(QE)7.6のCPU版コンテナーをビルドしてSiのSCF計算を実行します。Docker Desktopは使いません。PowerShellで入力ファイル、擬ポテンシャル、計算結果をWindows側のフォルダに置きます。
以下はwslc 3.0.3.0で確認した手順です。パス中のhogeは説明用のWindowsユーザー名なので、自分の環境に合わせて変更してください。実行例はCPU 2個・MPI 2プロセス・OpenMP 1スレッドの小規模な動作確認です。計算条件の精度収束試験や性能評価はしていません。
Dockerfileからイメージを作る
以下の記事に掲載しているmake all版のDockerfileをC:\Users\hoge\qe\Dockerfileに保存します。
PowerShellで次を実行します。
Set-Location 'C:\Users\hoge\qe'
wslc build --progress plain -t qe-cpu:7.6-all .
実機ではmake all版のビルドが成功し、マルチステージ構成のイメージサイズは1,544,562,220 bytes(約1.54 GB)でした。
wslc imagesで生成したイメージを確認できます。ビルド中はQEのソースと開発用パッケージを使いますが、完成した実行用イメージにはそれらをコピーしません。ビルドキャッシュには残ることがあります。
入力と擬ポテンシャルを用意する
作業フォルダと、計算間で共有する擬ポテンシャルフォルダを作ります。
$base = 'C:\Users\hoge\qe'
$run = Join-Path $base 'calculations\si-scf'
$pseudo = Join-Path $base 'pseudo'
New-Item -ItemType Directory -Path $run, $pseudo -Force | Out-Null
Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/QEF/q-e/qe-7.6/pseudo/Si_r.upf' -OutFile (Join-Path $pseudo 'Si_r.upf')
$run\scf.inに以下をUTF-8 BOMなし、またはASCIIで保存します。擬ポテンシャルの場所は入力ファイルに書かず、実行時に環境変数ESPRESSO_PSEUDOで指定します。
&CONTROL calculation = 'scf' restart_mode = 'from_scratch' prefix = 'si' outdir = './tmp' disk_io = 'low' verbosity = 'high' / &SYSTEM ibrav = 2 celldm(1) = 10.26 nat = 2 ntyp = 1 ecutwfc = 40.0 ecutrho = 160.0 occupations = 'fixed' / &ELECTRONS conv_thr = 1.0d-8 mixing_beta = 0.5 electron_maxstep = 100 / ATOMIC_SPECIES Si 28.0855 Si_r.upf ATOMIC_POSITIONS alat Si 0.00 0.00 0.00 Si 0.25 0.25 0.25 K_POINTS automatic 2 2 2 0 0 0
Si_r.upfの取得元はQE 7.6の公式リポジトリです。ATOMIC_SPECIESにはファイル名を指定し、擬ポテンシャル本体は共通フォルダで管理します。別の材料を計算する際は、その材料・汎関数・計算条件に合う擬ポテンシャルを選び直してください。
PowerShellからSCF計算を実行する
次のコマンドは、計算フォルダと共通擬ポテンシャルフォルダを別々にマウントし、ESPRESSO_PSEUDO=/pseudoをコンテナーへ渡してMPI 2プロセスで計算します。/pseudo:roのroは読み取り専用です。Windows側の$pseudoをコンテナー内の/pseudoへマウントするので、計算ごとにUPFをコピーする必要はありません。
$base = 'C:\Users\hoge\qe'
$run = Join-Path $base 'calculations\si-scf'
$pseudo = Join-Path $base 'pseudo'
Set-Location $run
wslc run --rm --user 1000:1000 --cpus 2 --memory 2G `
--env OMP_NUM_THREADS=1 --env OPENBLAS_NUM_THREADS=1 `
--volume "${run}:/work" --workdir /work `
--volume "${pseudo}:/pseudo:ro" --env ESPRESSO_PSEUDO=/pseudo `
qe-cpu:7.6-all sh -c 'mpiexec -n 2 pw.x -in scf.in > scf.out 2> scf.err'
pw.xの標準出力と標準エラーはコンテナー内のシェルでscf.out、scf.errへリダイレクトします。両ファイルは/workに対応するWindowsフォルダへ保存されます。PowerShell 5.1の出力リダイレクトでUTF-16ファイルを作る問題も避けられます。
mpiexec -n 2でpw.xを2プロセス起動し、--cpus 2でコンテナーに割り当てるCPU数も2としています。OMP_NUM_THREADS=1とOPENBLAS_NUM_THREADS=1は各プロセスのスレッド数を抑える設定です。--user 1000:1000でroot以外のユーザーとして起動するため、Open MPIの--allow-run-as-rootは不要です。Windows側の計算フォルダに、このユーザーが書き込めることを確認してください。
--rmは計算終了後にコンテナーを削除しますが、イメージとWindowsフォルダへ保存した結果は残ります。--memory 2Gはこの小さな例の上限です。実際の系では必要メモリを見積もって変更してください。
一時ファイルとメモリの注意
この例のoutdir = './tmp'は/work/tmpを指し、Windows側へバインドマウントしたフォルダに波動関数などの一時データも書き込みます。小さなSCFの再現手順としては単純ですが、大きな計算でのI/O性能は測定していません。wslcでWindows領域とLinux側領域のどちらがどれだけ速いかは調査していません。
wslcのセッションVM全体のメモリ上限と、--memoryによるコンテナー上限は別です。実機では物理RAM約32 GBに対し、標準設定のセッションRAMは約15 GiB、--memory 2G時のcgroup上限は2 GiBでした。free -hにはVM側の容量が表示されるため、コンテナーの2 GiB上限を確認するには/sys/fs/cgroup/memory.maxを見ます。メモリを増やす必要がある場合は、まずコンテナー上限とセッション上限のどちらが不足しているか確認してください。

コメント