CC56

CC56: 567収束までに達成したい56リスト

MakefileでDocker+Jupyter Notebookなどの機械学習環境をスマートに扱う

f:id:hyper-pigeon:20210214134341p:plain

先日機械学習界隈の方とDockerの話をした際、Makefileを使って機械学習環境の整備をしている人は実は少数派なんじゃないかと感じました。

機械学習で使うコマンドは引数が長く、とても覚えられるものじゃありません。暗記できていてもミスタイプしたり、tmux内とかだと折り返されて何書いてるかよくわからなくなりがち 。Ctrl+Rとかで検索かけようとしても大体はdocker...から始まるのでタイプ数多くなりがち。

Makefile は、Docker のコマンドをいい感じにまとめやすく、jupyter notebook に使う長ったらしいコマンド jupyter notebook --port 8888 --ip="0.0.0.0" --allow-root なども簡略化できます。そういうわけで、全体的な生産性の向上に繋がると信じています。

今回紹介する Makefile は Docker + Jupyter Notebook まわりを簡単に扱えるようにしたものです。

使い方

Makefileという名前のファイルをカレントディレクトリに置くことで、make コマンドが使えるようになります。 基本的にREADME.mdと同じルートに置いて運用します。

(Makefile のコードは次の見出しでコピペできるように置いておきます)

頻繁に使うコマンドは以下になります。

  • make br: build&run を一気に行う
    • make b: Docker イメージをビルド(docker build)
    • make r: コンテナを立ち上げ (docker run)
  • make c: コンテナに再接続。tmuxとかが切れたとき用
  • make clean: dockerの「Noneイメージ」と「稼働中のプロセス」を停止&削除
  • make jn: jupyter notebook立ち上げ
  • make tensorflow-GPU-test: tensorflowが動くかチェックする
  • make help: コマンドの確認

使い方は、make {コマンド} のように、各コマンドを make で実行するだけです。

helpは、以下の画像のようにコメントを表示してくれるので、どのコマンドが何をするのか忘れても安心できます。

f:id:hyper-pigeon:20210214130637p:plain

Makefileのコード

解説

基本的に、

コマンド:
  そのコマンドの実行内容

というのが繰り返されているだけです。

  • export は、変数の定義など
  • コマンドの後の「##」がhelpで出るコメントになる
  • コマンド先頭の「@」は、複数行の実行 (2021/06/23 修正)
    • ↑「@」をつけた行は標準出力を出しません
  • 「-@」はエラーが途中で出ても中断せず実行 (2021/06/23 修正)
    • 「-」をつけた行はエラーが出ても中断せずに次の行に移行します

くらいで、覚えれば使うのは簡単です。

Makefileの利点

  • どの環境でも安定して動く
  • メンテナンス性が高い
  • シェル的に書くことができ拡張性が高い。Makefile側から.shを叩くこともできる
  • コマンド入力時のタイプミスを減らせる
  • コマンドを忘れて検索する、ということが無くなるので時間効率が改善する
  • docker-composeを無理に使わなくても良くなる

補足

  • Jupyter Notebook しか使わないのであれば、Dockerfile の最終行を ENTRYPOINT ["jupyter", "notebook", "--port", "8888", "--ip=0.0.0.0", "--allow-root"] にしてしまっていいと思います
  • コマンドを調整すれば、Jupyter Labとかでももちろん使えます

流派(?)

これは自分で思いついた方法とかではなく、元はインターン先で takahi_i 先生から教えて頂きました(ありがとうございます)。 cookiecutter-docker-science を参考に自分用にコンパクトなMakefileを作った感じです。


(2021/06/23) Makefileの記法に勘違いがあったので、一部修正しました。すみませんでした。