endaaman.com

2024-10-18

Tips

GNU Parallelのススメ

GNU parallelとpueueを使って多重化した実験条件を効率的にバッチ処理する事例を紹介

複数条件の組み合わせのバッチ処理が多重に存在するときに、この2つを組み合わせることで効率的に走査することができる。

Arch Linuxなら

$ sudo pacman -Sy parallel pueue

で簡単にインストールできる。

具体例

条件 パラメータ
x X0, X1, X2
y 1, 25

というものがあったとする。クロスバリデーションのfoldであったり、各種ハイパーパラメータを考えてくれたらいい。

これらをすべての組み合わせで実行し、なおかつその実行時の並列数は環境ごとに変えたい(VRAMなどの制限によって)とするとどのようにするべきだろうか?

安直にはPythonでforを重ねて書いて世の中に無数に存在するタスクランナーで実行するだろうか?

実行時の並列数の制御が難しかったりする。また、タスクの成功の可否をタスクごとに確認したり「X1だけ再実行」みたいなケースに答えるのは難しかったりする。

GNU Parallel

GNU Parallelはシェルを拡張する。具体的には以下のように書ける。

$ parallel python batch.py --x {1} --y {2} ::: X0 X1 X2 ::: {1..5}

を実行すると、

python batch.py --x X0 --y 1
python batch.py --x X0 --y 2
python batch.py --x X0 --y 3
python batch.py --x X0 --y 4
python batch.py --x X0 --y 5
python batch.py --x X1 --y 1
python batch.py --x X1 --y 2
python batch.py --x X1 --y 3
python batch.py --x X1 --y 4
python batch.py --x X1 --y 5
python batch.py --x X2 --y 1
python batch.py --x X2 --y 2
python batch.py --x X2 --y 3
python batch.py --x X2 --y 4
python batch.py --x X2 --y 5

が上から順に実行される。

parallel に実行したいコマンドをつなげ、後ろに ::: で条件をつけるだけ。非常にシンプルだ。

複数データはスペース区切り、連番なら {1..5} のようにspreadできる。

タスクランナー

これにタスクランナーを組み合わせることで魔法のような機能を発揮する。今回は先述の pueueを使う。

これまではTask Spooler - batch is back!というものを使っていたが、こちらよりもおそらく高機能だ。

使い方はこちらも簡単で、

$ pueue add sleep 10
$ pueue add echo done

というのを並列数1で実行すると、10秒後にdoneがechoされる。並列数を2

$ pueue parallel 2
$ pueue add sleep 10
$ pueue add echo done

とすれば即座に done がechoされる。基本はこれだけだ。他にはタスクのグループ化や、最近では登録済みのタスクのpriorityをあとから変更する機能も追加された。

GNU Parallel + pueue = Magic!

あとはここまで来たらわかると思うが、

$ pueue parallel 5
$ parallel pueue add python batch.py --x {1} --y {2} ::: X0 X1 X2 ::: {1..5}

例えば上記のようにすれば、並列数5にしながら、ハイパラのグリッドサーチを一気に実行できるようになるわけだ。これは便利だ(確信)。

結語

ちょっとした日頃の操作にも便利なので、基本的な使い方を抑えておくといいでしょう。


©2024 endaaman.com