TensorFlowをDockerで動かす(Jupyter notebook編)

以前に,TensorFlowをDockerで動かす方法(CPUとGPU編)について書きました.

前回の記事では,触れませんでしたがTensorFlowはJupyter notebookと組み合わせて使用されることが多いです.

Jupyter notebookは統合開発環境のようなウェブアプリケーションです.Jupyter notebookを使用すると,これまでに入力したコマンドやその結果が保存されます.

一方で,CLIではコマンド一つ一つが実行されて保存されないため,学習結果の考察やそのデータ共有が難しくなります.

今回の記事では,前回の記事の発展として,Dockerを利用してTensorFlowJupyter notebookを組み合わせて動かす方法を記載します.

この記事では,

記事の内容
  • CPUのみを使用するDocker版TensorFlow+Jupyter notebookのインストールと実行
  • GPUをサポートするDocker版TensorFlow+Jupyter notebookのインストールと実行

について記載しています.

目次

Jupyter notebookとは

Jupyter notebookはブラウザ上で動作する対話的な開発環境です.最大の特徴は,実行コマンドとその実行結果がノートブックドキュメントに保存されます.通常のPythonなどのコードでは,コードは保存できますが実行結果は保存しません.他の人に共有する際に,ノートブックドキュメントを渡すだけで計算手順や結果をそのまま共有することが出来ます

このような特徴から,データ分析などに適しているためTensorFlowのユーザによく利用されています.

また,Pythonだけでなく,RustやR,Goなど40種類以上の言語をサポートしているようです.

あわせて読みたい
Project Jupyter The Jupyter Notebook is a web-based interactive computing platform. The notebook combines live code, equations, narrative text, visualizations, interactive dash...

>> Pythonユーザのための Jupyter[実践]入門

Dockerのインストール

この記事では,Dockerを一般ユーザ(Rootlessモード)で実行することを前提とします.Dockerのインストール方法は下記の記事を参考にしてください.

TensorFlow+Jupyter notebook (CPU)の導入と実行

Dockerコンテナの導入とJupyter notebookの起動

最新の安定版のDockerイメージを以下のコマンドでダウンロードします.TensorFlowのDockerイメージはDocker Hubにあります.


docker pull tensorflow/tensorflow:latest-jupyter  

下記コマンドで,Dockerを起動します.


docker run -it -d -p 8888:8888 tensorflow/tensorflow:latest-jupyter

9735fe9e58c6ba64ba694bc18a8d8ca5cb7deccbd36d50e97c288c84fc82b3ef

ブラウザのアドレスバーにlocalhost:8888と入力し,Jupyter notebookにアクセスします.

初回は下記のようなログイン画面が表示されます.パスワード等を設定する必要があります.

Tokenの取得

起動してたコンテナIDを確認します.


docker ps
CONTAINER ID   IMAGE                                  COMMAND                  CREATED          STATUS          PORTS                    NAMES
9735fe9e58c6   tensorflow/tensorflow:latest-jupyter   "bash -c 'source /et…"   19 seconds ago   Up 18 seconds   0.0.0.0:8888->8888/tcp   suspicious_mirzakhani

この場合,コンテナIDは9735fe9e58c6です.続いて下記コマンドでTokenを確認します.


docker exec 9735fe9e58c6 jupyter notebook list

Currently running servers:
http://0.0.0.0:8888/?token=ddfb6b3b7fb8fd30de720523cbb02778d772d4887ad3c0c2 :: /tf

ここのtoken=...の文字列がTokenになります.この場合,ddfb6b3b7fb8fd30de720523cbb02778d772d4887ad3c0c2がTokenとなります.

今回は使い捨ての環境で設定しているのでTokenを表示していますが,セキュリティ上危険なため,Tokenは他人に知られないようにしましょう.

「Setup a Password」のTokenに入力し,パスワードも適宜設定します.

ログインに成功すると下記のような画面が表示されます.

動作確認のためにチュートリアルを実行

チュートリアル(clssification.ipynb)が用意されているため,これを利用して動作確認を行ってみます.

このチュートリアルは,Fashion MNISTの画像分類をするものです.

Fashion MNISTを使用した画像分類

使用するチュートリアルは,Fashion MNIST(ファッション商品関連の画像群)を分類するAIを作成するものです.

画像群は下記のようなものです.

fashion-mnist-sprite.png
引用元:https://github.com/zalandoresearch/fashion-mnist

与えられた画像が下記の10種類のうちのどれに分類されるかを判別するAIを作成します.

LabelClass
0T-shirt/top
1Trouser
2Pullover
3Dress
4Coat
5Sandal
6Shirt
7Sneaker
8Bag
9Ankle boot

実際に実行してみる

clssification.ipynbをクリックし,開きます.

下記のように新しいタブが開きます.

このチュートリアルを自分で実行してみましょう.

「Restart & Run All」をクリックすると右のような警告が出ますが,「Restart and Run All Cells」をクリックし,実行します.

実行すると,下記のような結果が得られると思います(全く同じ結果となるわけではありません).

上の画像で結果では,画像がAnkle bootである確率が100%という意味です.下の画像の結果は,Sandalである確率が90%と示していますが,実際はSneakerであり,間違った予測であることがわかります.

ここでは,あくまで実行確認のため,より高精度にするためのチューニングは行いません.

>> 現場で使える! TensorFlow開発入門 Kerasによる深層学習モデル構築手法

TensorFlow+Jupyter notebook (GPU)の導入と実行

DockerでGPUを動かすために必要なドライバやパッケージをインストールします.

NVIDIA GPUドライバのインストール

NVIDIA GPUのドライバをこちらからダウンロード,インストールします.


sh NVIDIA-Linux-x86_64-$DRIVER_VERSION.run
あわせて読みたい

NVIDIA Container Toolkitのインストール

安定版のリポジトリとGPGキーを設定します.


distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list

リポジトリのアップデートした後,インストールします.


apt-get update
apt-get install -y nvidia-docker2

Dockerデーモンを再起動します.

systemctl restart docker

下記コマンドでGPUの情報を確認します.

docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

下記のようなメッセージが確認できれば,コンテナがドライバを認識できていることがわかります.


+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.103.01   Driver Version: 470.103.01   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:17:00.0 Off |                  N/A |
| 24%   23C    P8    13W / 260W |      5MiB / 11019MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce ...  Off  | 00000000:65:00.0 N/A |                  N/A |
| 50%   31C    P8    N/A /  N/A |     15MiB /   980MiB |     N/A      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
Rootlessで実行する場合の注意点

RootlessでDockerコンテナを使用する場合,デフォルトのまま使用すると以下のようなエラーが発生します.

docker run --rm --gpus all nvidia/cuda:11.0-base bash
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: Running hook #0:: error running hook: exit status 1, stdout: , stderr: /usr/bin/nvidia-modprobe: unrecognized option: "-s"

このエラーに関しては,下記コマンドで設定を変更する必要があります.

sed -i 's/^#no-cgroups = false/no-cgroups = true/;' /etc/nvidia-container-runtime/config.toml

詳細は下記サイトで説明されています.

あわせて読みたい

GPU用のDockerコンテナとJupyter notebookの導入

GPU用のコンテナイメージをダウンロードします.

docker pull tensorflow/tensorflow:latest-gpu-jupyter

docker run -it -d --gpus all -p 8888:8888 tensorflow/tensorflow:latest-gpu-jupyter

CPUの場合と同様にブラウザのアドレスバーにlocalhost:8888にアクセスします.Tokenも同様の方法で取得し,Jupyter notebookにログインします.

Jupyter notebookが起動すれば,CPU版と全く同じ使用方法ができます.

まとめ

以前に,CPUとGPU版のTensorFlowをDockerを使用して動作する方法を記載しました.

今回は,さらにJupyter notebookを導入し,より開発環境を充実させたDockerコンテナの実行方法を記載しました.

Jupyter notebookを使用すると非常に開発が容易になるため,
導入をおすすめします.

よかったらシェアしてね!
目次