コマンドラインによる効率的なgrid search
複数条件の組み合わせのバッチ処理が多重に存在するときに、この2つを組み合わせることで効率的に走査することができる。
- GNU Parallel - GNU Project - Free Software Foundation
- Nukesor/pueue: :stars: Manage your shell commands.
Arch Linuxなら
$ sudo pacman -Sy parallel pueue
で簡単にインストールできる。
具体例
条件 | パラメータ |
---|---|
x |
X0 , X1 , X2 |
y |
1 , 2 … 5 |
というものがあったとする。クロスバリデーションの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
にしながら、ハイパラのグリッドサーチを一気に実行できるようになるわけだ。これは便利だ(確信)。
結語
ちょっとした日頃の操作にも便利なので、基本的な使い方を抑えておくといいでしょう。