バッチ処理を手軽に並列実行するためのプログラムを作りました。
バッチ処理を並列実行するときにどうしますか? 2並列にするときはタスクリストを2分割、3並列にするときは3分割、などとしていませんか? 途中でCPUが空いたので、「やっぱり10並列にしたい!」というときはどうしますか? こういった問題を解決するのが添付のスクリプトです。
使い方は、並列実行したい分だけ batch_exec.pl を実行すればOKです。 例えば、マシンAで2並列、マシンBで3並列実行したいなら、マシンAで2プロセス、マシンBで3プロセス実行します。
これを実現している仕組みは簡単で、タスクリストの各タスクに対して以下を繰り返します。
-
出力ファイルが存在していればタスクが既に終了しているので次のタスクへ
-
ロックファイルがあれば既に実行中なので次のタスクへ
-
出力ファイルもロックファイルもなければロックファイルを作成してタスクを実行
物は試しで、
python batch_exec.py task_list.txt 3
を何プロセスか同時に実行してみてください。 50個のタスクが重複なしで順番に実行されます。 別のターミナルで実行する方が挙動がわかりやすいです。
ただし、実際に使用する際には、&をつけて、
python batch_exec.py task_list.txt 3 &
を1つのターミナルで何度も実行するのがお薦めです。
元々はperlで書いたプログラムなのですが、ChatGPTに力を借りてpython版を用意しました。 さらに、GPU対応版です(pytorch使用)も用意しました。
詳しい説明は各ディレクトリのREADMEを見てください。