moku-moku

Pueue

はじめに

Pueueはコマンド実行を管理するツールです。

近年は、マテリアルズインフォマティクス考え方が浸透し、シミュレーション網羅実行によるデータ生成が身近になりました。 膨大なデータをシミュレーションで生み出すには、計算実行の自動化が不可欠です。 よく似た内容の計算で各計算の実行時間が均一であれば、無駄なく順番に実行することは難しくありませんが、実行時間が不均一な場合、終了した分だけ新たに実行する仕組みが望まれます。 なお、計算の入力ファイル生成の自動化は個別課題に依存するため、一般化は難しく、ここでは取り上げません。

材料シミュレーションを実行する中規模以上の計算機では、ジョブ管理システム(Slurm, PBE, LSF等)が導入されていることが一般的です。 ジョブ管理システムは、複数人で計算機を共用する際には必要ですが、網羅計算の自動実行制御には適さない場合があります。

前二者は、用途別に「専用キュー」を用意して使い分けることで原理的には解決しますが、キューの作成には管理者権限が必要です。 一般的なユーザーの思い通りに設定できるとは限りません。

Pueueを利用することで、少なくとも上記問題の一部を解決します。

ジョブとタスク

Pueueが実行する一つ一つの処理を「タスク」と呼びます。 一方、ジョブ管理システムが実行する一つ一つの処理は「ジョブ」と呼び区別します。

典型的な利用方法は、以下のいずれかです。

インストール

macOSでは、Homebrewでインストールします。

brew install pueue

使い方(pueueコマンド)

材料シミュレーション(HPC)と無関係な一般的な説明はこちらも参考にしてください。

https://zenn.dev/gosarami/articles/b777836712294dc22bd4

上記執筆時のPueueのバージョンは0.11.1、現在のバージョンは3.3.3と大きく異なりますが、利用方法はそれほど変わっていないようです。

全体の流れ

#!/bin/bash
pueued -d
#sleep 2  # parallelを確実に設定するために、少し待つことが有益、な気がします。
pueue parallel 4

for i in ...
do
  pueue add TASK[i]  # タスク登録
done

pueue wait
pueue shutdown

以下、各コマンドを説明します。

デーモン起動

pueued -d

-dオプションにより、バックグラウンドで実行されます。

並列実行数指定

同時に実行できるタスク数を指定します。 下記実行例では、最大4タスク同時に実行します。 指定しなければ、タスクを一つずつ実行します。

pueue parallel 4

タスク登録

タスクを登録します。

コマンドを直接指定します。

pueue add -- 'ls'

シェルスクリプト等、実行形式ファイルを指定することもできます。

pueue add ./task.sh

PATHが通っていないファイルを渡すときは、パスを含めて指定します。 カレントディレクトリにあるファイルも、./が必要です。

タスク終了待ち

全てのタスクを登録したのち、それらの終了を待ちます。

pueue wait

デーモン終了

最後にデーモンを終了させます。

pueue shutdown

タスク登録処理

計算ディレクトリは事前に準備されていることを仮定して、その全てで計算を実行する処理を考えます。

DIRS=(`ls -d calc*`)

for i in ${DIRS[*]}
do
        pueue add -- "cd $i; mpiexec -n 2 phase"
done

計算ディレクトリをDIRSに格納し、そのそれぞれについて、計算実行コマンドをタスクとして登録します。

ここでは、ディレクトリ名がcalcで始まるものを計算対象として、phaseの計算をMPI 2並列で実行するタスクを登録します。

利用例1:グラファイト面間距離

PHASE/0付属のサンプルsamples/vdw_correction/dft-d3/graphiteは、グラファイト結晶のc軸長さを変化させた一連の計算を実行するシェルスクリプトとともに提供されています。 全50個の計算を一つずつ順番に実行します。 これをPueueを用いて、数個(例えば4個)ずつ実行する例題に改変しました。 スクリプトを上記サンプルのディレクトリにコピーして、実行してください。

bash exec.sh

オリジナルのrun.shでは、ループは一つだけで、入力ファイル準備、計算実行、結果回収を実行しました。 Pueueを使ったexec.shでは、入力ファイル作成、計算実行、結果回収をそれぞれ別のループで実行するため、少々複雑になったように見えます。 また全計算結果を集約したnfefn.dataのデータ順がオリジナルと一致しません。 ディレクトリ名を工夫するなどすれば順番を一致させることができますので、必要に応じてお試しください。

利用例2:Berry位相計算

ボルン有効電荷等の計算に用いられるBerry位相の計算では、よく似た計算を多数実行します。 PHASE/0には、それらを順次実行するスクリプトが用意されていますが、これもPueueで置き換えてみましょう。 付属サンプルsamples/dielectric/lattice/AlN/berryの計算実行を、Pueueで実施します。

サンプルには、入力ファイルテンプレートと、それをコントロールするcontrolファイルが用意されています。 スクリプトberry.plを実行すると、これらから計算実行用のディレクトリが生成されます。

../../../../../bin/berry.pl control

SCF計算のディレクトリが7個、電荷密度固定計算のディレクトリが21個です。 これらを順次実行するスクリプトを作成します。

電荷密度固定計算では実行時にSCF計算結果の電荷密度を参照します。 Pueueで依存関係を処理しても良いのですが、ここでは単純に、

という手順を採用しました。

bash execberry.sh

結果の回収は次のコマンドです。 各ディレクトリにあるberry.dataを繋げて一つのファイルにします。

cat */berry.data > berry.data

依存関係をPueueに委ねる場合は、計算実行用のディレクトリを作成するのと同時に、依存関係含めてタスク登録するのが好ましいと思います。 (一度ディレクトリを作成してから、ディレクトリ名を参考に依存関係を読み解いてタスク登録するのは無駄が多いと感じます。)

複数ノード利用する計算の管理

タスクで計算ノードを跨ぐことは、厄介ですので取り上げません。

フロントエンドでデーモンを動かして、ジョブ管理システムへの投入をPueueで管理することで、複数ノードを利用する自動計算実行を実現できます。 そのような利用が許されることを、事前に計算機管理者に確認してください。

ジョブ投入(submit)コマンドは、ジョブ管理システムにジョブを登録することを目的とします。 すなわちジョブがキューに登録されると、そのコマンドは直ちに終了します。 ところで、多くのジョブ管理システムでは、ジョブ投入コマンドに、ジョブの実行が終了するまで待って終了するオプションが用意されています。 例えばSlurmでは、-W (--wait)オプションです。

sbatch -W job.sh

とすると、job.sh内部の処理が終了するまで、sbatchコマンドは終了しません。 このsbatch -Wコマンドをタスクとすると、Pueueで管理できます。