前提
導入対象とするマシンは下記の通り。
- Hardware : CPU = i10900, GPU = GeForce RTX 2080Ti, Mem = 32GB, SSD 1 TB + HDD 2TB
- ベース OS : Windows 10 Pro バージョン 20H2 (ビルド 19042.685)
- 仮想 OS : Ubuntu 20.04 LTS on WSL2
Tensorflow (CPU 版) + Python3 + Jupyter Notebook 導入
Tensorflow には CPU 版と GPU 版があるのだが、2021 年 2 月初旬現在、GPU 版を WSL2 上で動かすには Windows 10 Build 21292 (InsiderPreview) が推奨らしい。そこで Build 21292 がプロダクト・リリースされるまで、CPU 版をインストールして準備しておく。OS のバージョンアップを待ちながらアプリを先行導入するなんて通常は考えられないが、それを気楽にできるのが Docker のよいところ。
インストール手順
インストールは簡単。
# tensorflow + python3 + jupyter のイメージを pull
docker pull tensorflow/tensorflow:latest-py3-jupyter
実行手順
実行方法は何を使うかによって 3 通りある。
# Tensorflow Only docker run -it --rm tensorflow/tensorflow:latest-py3-jupyter bash # Tensorflow + Python3 docker run -it --rm tensorflow/tensorflow:latest-py3-jupyter python # Tensorflow + Python3 + Jupyter Notebook Server docker run -it --rm -v (個人フォルダへのパス):/tf/notebooks -p 8888:8888 tensorflow/tensorflow:latest-py3-jupyter &
注意点がいくつかある。
- イメージにタグをつけないと Python3 + Jupyter Notebook を包含しない latest イメージを新たに pull してきてしまう
- Jupyter Notebook サーバーが port 8888 を要求するため Port Relay (さらに必要に応じて Port Forward と Windows Defender) を設定する
- Jupyter Notebook サーバーが作業フォルダを要求するため個人フォルダへのパス *1 を設定する
- Jupyter Notebook へのログイン時にトークンを要求されるが、これが Docker コンテナを作るたびに変化する一方でトークン/パスワード無効化までしてしまうと危険であるため、固定化する設定をする
docker-compose.yml の編集
Jupyter Notebook 関連の引数指定がちょっとめんどうであるため、(見よう見まねで) docker-compose.yml に記述することにした。
tensorflow: image: 'tensorflow/tensorflow:latest-py3-jupyter' restart: always ports: - '8888:8888' volumes: - '/mnt/... (個人フォルダへのパス) .../JupyterNotebooks:/tf/notebooks' command: /bin/bash -c "source /etc/bash.bashrc && jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.token='(固定化するトークン)'"
docker-compose.yml に書くべき情報は、いったん既定通りに走らせてみて docker inspect {container}
とすれば取得できる。
Jupyter Notebook 実行時に有効になっているトークンは docker exec -it {container} jupyter notebook list
とすれば取得できる。