TL;DR
- 機械学習の研究をするときに
make
を使うと再現性が担保出来て便利 -
make
は各ファイル依存関係との作り方を指定すると自動で欲しいファイルを作ってくれるので、「このファイルどうやって作ったんだっけ?」ってならない -
make
に詳しい人のアドバイスがほしいです!
背景
機械学習を使った研究では、元データ(公開されてるデータセットなど)、前処理したデータ、生成物など様々なファイルを扱います。そして、研究が進むにつれ、不必要なファイルや、生成方法が変わったファイルなどが生まれてきます。これらのファイルが、いつどの様に生成されたものかを管理しないと、実験の再現性がなくなり、論文を執筆する際に非常に困ります(数回やりました)。
そこで最近、make
を使って実験を行うことで最大限の再現性を確保する様にしてます。今回は、研究にmake
を使う際の注意点やコツなどをまとめていきます。
同時に、普段make
を使っている方々からアドバイスがほしいです!
Makeの仕組み
make
を使うにはそのディレクトリにMakefile
という名前のファイルがおいておきます。その中には生成したいファイル(target
)、依存ファイル(prereq
)と、その生成方法をまとめて書きます。すると、欲しいファイルを指定すると自動的にその依存関係を解消し指定したファイルを作成してくれます。
シンプルな例
fogefoge.txt:
echo "Hello World" > $@
hugahuga.txt: fogefoge.txt
cat $< | tr '[A-Z]' '[a-z]' > $@
ここで、fogefoge.txt
はhugahuga.txt
(target
)のprereq
になっています($@
と$<
はそれぞれtarget
とprereq
に置換されます)。
おなじdirectory内で
$ make fugafuga.txt
とすれば、自動的にhugahuga.txt
が作成されます。
自然言語処理の例
生コーパスをtokenizeして全てlower caseにしたあと、そのコーパス上でfasttextを学習する場合を考えます。
data/input/rawcorpus.txt
に生コーパスが置かれているとします。
Makefile
を
data/output/preprocessed.txt: data/input/rawcorpus.txt
mkdir -p $$(dirname $@)
cat $<| mecab -Owakati| tr '[A-Z]' '[a-z]' > $@
data/output/fasttext.bin: data/output/preprocessed.txt
fasttext skipgram -input $< -output $@
とすれば
$ make data/output/fasttext.bin
と実行するだけで、データの前処理から分散表現の学習まで自動でやってくれます。
後で、前処理ってどうやってたっけ?と思ってもMakefile
を見返せば明白です。
実際の研究ではさらに様々なファイルを扱うので、それら全ての生成方法を覚えておくのはほぼ不可能になると思います。そういったときに強力なツールです。
良かった点
各ファイルの意味を覚えておく必要がなくなった
2日前に書いたコードは他人が書いたコードと同じくらい読めなくなる記憶力の持ち主なので、研究が進むに連れて膨大に増えていくファイルの生成経緯を覚えておく必要がなくなったのは大きかったです。
この実験再現するのかな?と不安にならずに実験できる(精神的な安定)
これまでに実験が再現せず困ったことがあるので、これはすごく大きかったです。ただし、make
を使っておけば再現性が完全に確保されるわけではなく、環境(バージョン)やランダム初期値の差なども考慮する必要があります。
Linuxのコマンドに慣れた
make
ではlinuxのコマンドでのファイルの生成方法を記述するので、自然とlinuxコマンドを書く機会が増えました。これまではpythonのスクリプトを書いていた処理も、linuxコマンドに置換され、全体的に見やすくなりました。
悪かった(不満な)点
Makefile
のシンタックスが気持ち悪すぎる
ゾットするくらい気持ち悪いので、make
と似た機能のシンタックスがまともなツールがあったら教えてほしいです(懇願)。
複数のワイルドカードが使えない
少しずつ設定を変えて実験を行うときに、make
のtarget
とprereq
の記述にワイルドカードが使えると便利です。しかし、make
では複数のワイルドカードが許されないのでループなどを使って書いています。
まだどうしたらいいかわからない点
どこまでmakeで書くか?
研究をすすめる上で、どこまでの処理をmake
で管理するかが悩みです。論文に挿入するtexのテーブル生成までMakefile
内に書く人もいるようですが、表の形は論文全体の体裁を整えるために提出直前まで変更することが多いので、Makefile
を書き換えている暇はない気もします。(計画的に論文執筆ができれば大丈夫?)
まとめ
「研究にmake
を使うと良いよ」という記事を書こうと思ったら、「make
の使い方教えて下さい!」という記事になってしまいました。
make
の使い方教えて下さい。