DockerでTensorflowのGPU動作環境を用意する方法

Dockerを利用してTensorflowのGPU動作環境を用意する方法について解説します。
目次
Dockerを用いてTensorflowのGPU動作環境を用意する
Dockerはコンテナ型仮想環境を用意することができるプラットフォームです。また、Tensorflowは、Googleが開発したディープラーニングのライブラリです。
本記事では、Dockerを用いてTensorflowのGPU動作環境(具体的にはJupyter Notebook環境)を用意する方法について紹介します。
GPU(Graphics Processing Unit)はゲームなどのリアルタイム画像処理などに特化したプロセッサユニットで、CPUに比べてクロック数が低いものの並列演算に優れています。その特性を活かしてディープラーニングの計算などでGPUが利用されています。
NVIDIAのGPUで汎用的な計算を使う場合にはCUDA(compute unified device architecture: クーダ)と呼ばれるライブラリが使用されます。ディープラーニングで有名な「Tensorflow」や「PyTorch」といったフレームワークもGPUの計算処理はCUDAを利用する設計になっています。
NVIDIAのグラフィックボードを搭載してGPUを使えるPCがあったとしても、上記のCUDAの設定などGPUを使うときには環境設定が少し大変です。
今回紹介するのはDockerを用いてGPUが利用可能なTensorflowが使えるJupyter Notebook環境準備方法です。Dockerを用いることで面倒な環境構築を省くことができます。
Dockerを使用する際には、Docker Desktopのインストールが必要です。インストールされていない方は、以降の説明の手順を実行する前にDocker Desktopのインストールをしてください。
Dockerイメージの取得
Dockerでは、Docker Hubで様々なイメージが公開されています。今回はhttps://hub.docker.com/r/tensorflow/tensorflowから「tensorflow/tensorflow:2.9.1-gpu-jupyter」を取得してみます。
コマンドプロンプトで以下を実行することで、Dockerイメージを取得することができます。
docker pull tensorflow/tensorflow:2.9.1-gpu-jupyter
Dockerイメージの取得が完了すると以下のような感じになります。
>docker pull tensorflow/tensorflow:2.9.1-gpu-jupyter 2.9.1-gpu-jupyter: Pulling from tensorflow/tensorflow d5fd17ec1767: Pull complete 50b37fabf1b7: Pull complete 269c6117408b: Pull complete (=====途中省略=====) 0e6c59c4ca3a: Pull complete bdadb13361a8: Pull complete 8c0bbe097530: Pull complete Digest: sha256:6345c1f2eaaf7b8efc9b8ec7f62869e6490db80e07ae5b856d5c16b48146daae Status: Downloaded newer image for tensorflow/tensorflow:2.9.1-gpu-jupyter docker.io/tensorflow/tensorflow:2.9.1-gpu-jupyter
取得済みのDockerイメージ一覧は、「docker images」で確認ができます。
>docker images REPOSITORY TAG IMAGE ID CREATED SIZE tensorflow/tensorflow 2.9.1-gpu-jupyter 5f9e07bacf1d 6 weeks ago 6.07GB
上記のように表示されれば、Dockerイメージの取得は完了です。
コンテナの作成と実行
tensorflow-gpu-jupyterの起動
Dockerのイメージの取得が完了したら、コンテナを起動します。以下のようなコマンドを実行してください。「D:\docker\jupyter_notebbok_tensorflow_gpu」の部分はお使いの環境の任意のフォルダを指定してください。コマンドの意味については後述しますので、まずは起動して使い始める方法として読み進めてください。
docker run --rm -it -p 8888:8888 -v D:\docker\jupyter_notebbok_tensorflow_gpu:/tf/work tensorflow/tensorflow:2.9.1-gpu-jupyter
上記のように実行すると、Jupyterが起動します。コマンドプロンプトを見てもらうと「http://127.0.0.1:8888/?token=xxxxxxxxxx」というような記載の文字列の場所があるかと思います。
xxxxxxxxの部分は接続のためのトークンで起動ごとに異なります。このURLをブラウザに入力して実行してください。以下のようなJupyter Notebookの画面が起動します。

workをクリックするとworkフォルダへ移動できます。後述しますが、workフォルダとローカルフォルダをマウントする設定で起動しているため、ローカルにファイルを保存したい場合は、workフォルダ内にファイルを作成してください。
後の使い方は通常のJupyter Notebookと同じです。
起動コマンドの補足説明
以降でDockerコンテナ起動時に実行した以下コマンドについて補足説明します。
docker run --rm -it -p 8888:8888 -v D:\docker\jupyter_notebbok_tensorflow_gpu:/tf/work tensorflow/tensorflow:2.9.1-gpu-jupyter
ポートの接続
Dockerでは、コンテナ側のポートとホストマシン(実行しているPC)のポートを結びつけることができます。その際には「-p」オプションで指定します。
Jupyter Notebookは標準で8888番ポートで運用されます。「8888:8888」の部分は、ホスト側の8888番ポートとコンテナ側の8888番ポートを接続するという意味になります。
フォルダのマウント
Dockerでは、コンテナを削除してしまうとデータが消えてしまいます。そのため、「-v」オプションで、ホスト側のフォルダとコンテナ側のディレクトリをマウントします。
今回の例ではホスト側の「D:\docker\jupyter_notebbok_tensorflow_gpu」とコンテナの「/tf/work」をマウントしています。このようにしておくことで、workフォルダ内に作成したファイルなどは「D:\docker\jupyter_notebbok_tensorflow_gpu」配下に保存されます。ホスト側のパスについては、お使いの環境の任意のパスを指定してください。
これによりコンテナを削除してもファイルは残り続けます。また、他のDockerコンテナと共有して使うこともできるようになります。
まとめ
Dockerを用いてTensorflowのGPU動作環境(具体的にはJupyter Notebook環境)を用意する方法について紹介しました。
GPUを使うためにはCUDAの設定など環境構築が必要です。私もNVIDIAのグラフィックボードを搭載しているPCにCUDAを入れてみて動かしてみようとしてなかなかうまく動かない状況に直面したことがあります。こういった時にDockerで簡単に環境構築できるのはとても便利です。
これからTensorflowを使ったディープラーニングを学ぼうという人で、NVIDIAのグラフィックボードを搭載しているPCをお持ちの方は今回紹介したようにDocker環境を作って使ってみると良いかと思います。





