CC56

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

Day-192 CookieCutter-DockerScienceでTensorFlowの環境構築を爆速で行う

f:id:hyper-pigeon:20201016034529j:plain
クッキーカッター by silviarita

個人でKaggleをやるにあたって、毎回0から環境を構築するのは面倒だなと思っていたので、対策を色々考えていたところ、ちょうど適したものがありました。

CookieCutter とは

github.com

「cookie cutter」は日本語でいうと、クッキーの型のことを指しているんだと思います。

CookieCutterはPythonプロジェクトの雛形を自動生成してくれるパッケージです。

今は名前だけ紹介しますが、派生に以下のものがあり、タスクに応じて使い分けられているようです*1

  • CookieCutter-Django
  • CookieCutter-flask
  • CookieCutter-Pypackage
  • CookieCutter-DataScence

そして、今回目をつけたのはデータサイエンス特化の「CookieCutter-DockerScience」です。

CookieCutter-DockerScience とは

データサイエンス用の雛形を生成するCookiecutterの派生です。

データサイエンスにおいて、開発の序盤は似たようなファイル構成になりがちです。 CookieCutter-DockerScienceでは、共通の部分がひな形になっているため、序盤の開発コストを下げることができます。

デフォルトでdockerやjupyter notebookなどの雛形が完成しているため、スムーズな環境構築を行うことができます。 また、基本的な動作をMakefileで行うため、コードを使いやすくなります。

github.com

環境構築

以下の手順で環境構築を行います。

(1) cookiecutterをインストールし、CookieCutter-DockerScienceを入れる

sudo apt install cookiecutter
cookiecutter git@github.com:docker-science/cookiecutter-docker-science.git

(2) 質問に答えてプロジェクトの作成

公式のREADMEにもある通り、project_name などを回答していきます。空になっている部分はデフォルトで補完されます。

project_name [project_name]: プロジェクト名
project_slug [プロジェクト名]:
jupyter_host_port [8888]:
description [Please Input a short description]: プロジェクトの説明
Select data_source_type:
1 - s3
2 - nfs
3 - url
data_source [Please Input data source]: データソース。決めてない場合 3 にしておけばOK(?)

project_slug というのが最初何を指しているのかわからなかったのですが、プロジェクト名を整えたもののようです。以下のやりとりが分かりやすかったです。

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

今回、特に何かデータがあるわけではなかったので、データソースを聞かれて困りました。 一応、3のURLを選択するとURLを聞かれますが、適当にあしらって問題ないと思います。

(3) Makefileの修正

nvidia-docker用に書かれているので、NVIDIA container Toolkitを使っている場合、書き換えなければなりません。

  • 47行目: nvidia-dockerdocker
    • export DOCKER=docker
  • 96行目: --gpus all を追記
    • $(DOCKER) run -it --gpus all -v $(PWD):/work -p $(JUPYTER_HOST_PORT):$(JUPYTER_CONTAINER_PORT) --name $(CONTAINER_NAME) $(IMAGE_NAME)

場合によって行が前後するかもしれませんが、検索機能から探せば問題ないはずです。

(4) requirements.txtに追記

これだけでOK

tensorflow-gpu==2.3

(5) Makeコマンドでコンテナの作成〜実行

Makefileに色々書かれているので、めんどくさい引数とかを考えなくて済みます。

make init-container #コンテナのbuild等
make create-container #コンテナのrun等

# コンテナ内
python3
> import tensorflow as tf
> print(tf.reduce_sum(tf.random.normal([1000, 1000])))

以上でTensorFlow(GPU)を動かすことができるはずです。

おわりに

本当はKaggle APIまでひっくるめて環境構築したかったのですが、権限周りでモタついてしまったのでまた今度解説します。

(具体的に書くと、~/.kaggle/kaggle.jsonの権限を600にするとコンテナ内で読み込めなくなる。userをsudoにすることで解決できるはずだが、そうするとCookieCutter側で不都合が起きるかもしれず、不明瞭だったので今回はパス。)

これからCookieCutter-DockerScienceを活用してKaggleに挑戦してみようと思います!

環境構築に関する補足

CookieCutter-DockerScienceを動かすには、前提として「Docker」「NVIDIA Container Toolkit」「NVIDIA-driver」 をマシンに入れておく必要があります。

DockerとNVIDIA Container Toolkitのインストール方法に関しては、以前、以下の記事で説明しました。

hyper-pigeon.hatenablog.com

NVIDIA-driverのインストールは以下の方法でいいはずです(418以上のものが入る可能性あり)。

sudo apt -y install nvidia-driver-418

# チェック
sudo reboot
modinfo nvidia | grep version

また、TensorFlowに関しては、GPUアーキテクチャ、CUDA、cuDNNとのバージョン相性があり、決まった組合せ以外は環境構築できないので注意が必要です。

古いバージョン(2.1以前)のTensorFlowと環境の互換性は、以下のページで確認するのが確実です。

www.tensorflow.org