以前に,TensorFlowをDockerで動かす方法(CPUとGPU編)について書きました.
前回の記事では,触れませんでしたがTensorFlowはJupyter notebookと組み合わせて使用されることが多いです.
Jupyter notebookは統合開発環境のようなウェブアプリケーションです.Jupyter notebookを使用すると,これまでに入力したコマンドやその結果が保存されます.
一方で,CLIではコマンド一つ一つが実行されて保存されないため,学習結果の考察やそのデータ共有が難しくなります.
今回の記事では,前回の記事の発展として,Dockerを利用してTensorFlowとJupyter notebookを組み合わせて動かす方法を記載します.
この記事では,
- CPUのみを使用するDocker版TensorFlow+Jupyter notebookのインストールと実行
- GPUをサポートするDocker版TensorFlow+Jupyter notebookのインストールと実行
について記載しています.
Jupyter notebookとは
Jupyter notebookはブラウザ上で動作する対話的な開発環境です.最大の特徴は,実行コマンドとその実行結果がノートブックドキュメントに保存されます.通常のPythonなどのコードでは,コードは保存できますが実行結果は保存しません.他の人に共有する際に,ノートブックドキュメントを渡すだけで計算手順や結果をそのまま共有することが出来ます.
このような特徴から,データ分析などに適しているためTensorFlowのユーザによく利用されています.
また,Pythonだけでなく,RustやR,Goなど40種類以上の言語をサポートしているようです.
>> 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となります.
「Setup a Password」のTokenに入力し,パスワードも適宜設定します.
ログインに成功すると下記のような画面が表示されます.
動作確認のためにチュートリアルを実行
チュートリアル(clssification.ipynb
)が用意されているため,これを利用して動作確認を行ってみます.
このチュートリアルは,Fashion MNISTの画像分類をするものです.
Fashion MNISTを使用した画像分類
使用するチュートリアルは,Fashion MNIST(ファッション商品関連の画像群)を分類するAIを作成するものです.
画像群は下記のようなものです.
与えられた画像が下記の10種類のうちのどれに分類されるかを判別するAIを作成します.
Label | Class |
---|---|
0 | T-shirt/top |
1 | Trouser |
2 | Pullover |
3 | Dress |
4 | Coat |
5 | Sandal |
6 | Shirt |
7 | Sneaker |
8 | Bag |
9 | Ankle 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で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を使用すると非常に開発が容易になるため,
導入をおすすめします.