多くの人は環境構築や、ライブラリの依存状況などでバグが発生したり、動作しなかったりという問題を抱えています。

Dockerを使うとOSや必要なライブラリ環境ごと差分とともに管理し、チームでも同様の環境で動作させることができるので開発者の間では便利に使われるようになりました。

本記事では、TensorFlowをDockerコンテナで構築する方法をチュートリアル形式で解説しながら、

  • Dockerのメリット
  • DockerでGPUを動作させる方法

を紹介します。

Dockerとは

Dockerとは、オープンソースで開発されている仮想化技術です。サーバや開発環境のセットアップでは、以下のような問題点がありました。

  • 様々なパッケージやライブラリが依存し合うため、チームで同様の環境を構築することが困難
  • セットアップに失敗したときに元に戻しにくい
  • ローカルの開発環境ではテストしにくい
  • 時間が経つと、バージョン関係の問題が発生して環境構築できなくなる

Dockerは、Immutable Infrastructureという考え方で、インフラ環境は不変のものとして扱います。上手く使えれば、サーバの管理コストや、開発にかかる時間コストなどを大幅に削減することができます。

また、一度ローカル環境でコンテナを構築してしまえば、起動が高速なので、独立したUNIXプロセスのように利用することもできます。

各環境向けのセットアップ

GPUに対応したDockerコンテナを構築したい方は、事前にNVIDIA Driverをインストールする必要があります。既にインストール済みの方やCPU版を利用する方はこのステップを飛ばしてください。以下のリンクをクリックしてください。

ドライバ - NVIDIAドライバダウンロード

すると、以下の画像のようにOSやGPUの製品番号の選択ボックスが出てくるので、お使いの環境に合わせて選択します。選択したら、検索ボタンをクリックします。

NVIDIA Driver選択

このような画面が出てくるので、ダウンロードボタンをクリックします。

NVIDIA Driverダウンロード

最後に、ユーザーライセンスに同意して、ボタンを押すとダウンロードされます。

NVIDIA Driverダウンロード

Ubuntuであれば、以下のコマンドでNVIDIA-Driverのインストーラーを実行します。

$ sudo service lightdm stop 
$ sudo ./NVIDIA-Linux-x86_64-.run
$ sudo reboot

正常に再起動できれば、以下のコマンドで正しくGPUが認識されていることを確認してください。

$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.57 Driver Version: 367.57                                    |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M        | Bus-Id Disp.A        | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap   | Memory-Usage         | GPU-Util Compute M.  |
|===============================+======================+======================|
| 0 GeForce GTX 1080 Off        | 0000:01:00.0 Off     | N/A                  |
| 35% 56C P2 61W / 198W         | 0MiB / 8111MiB       | 0% Default           |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 960 Off         | 0000:02:00.0 Off     | N/A                  |
| 35% 57C P2 47W / 130W         | 0MiB / 4037MiB       | 0% Default           |
+-------------------------------+----------------------+----------------------+

Dockerのインストール

Dockerをインストールします。各環境向けにインストール方法を説明します。以下の該当するプラットフォームのインストラクションに従ってインストールしてください。

Mac

まずは、以下のリンクをクリックしてください。

Get started with Docker for Mac

Download Docker for Macという節に、下の画像のような場所があるはずです。左側の安定版をクリックしてダウンロードします。

Dockerダウンロード

ダウンロードが終わったら、クリックしてインストーラーを開き、クジラのようなDockerのアイコンをApplicationフォルダにドラッグ・アンド・ドロップします。

Dockerドラッグ・アンド・ドロップ

ドラッグ・アンド・ドロップすると、アプリケーション一覧にDockerアイコンが表示されているはずです。こちらを開きます。

Dockerアプリケーション

色々とダイアログが出てくるので、内容を確認して許可します。最後に、以下の画像のようなウィジェットが出てくればインストール成功です。

Dockerのポップアップ

Ubuntu

UbuntuはオフィシャルではDockerのレポジトリを使ってインストールすることが推奨されています。

パッケージのインストール

まずは以下のコマンドで、必要なパッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install -y --no-install-recommends \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual
$ sudo apt-get -y --no-install-recommends install curl \
    apt-transport-https \
    ca-certificates \
    software-properties-common

レポジトリのセットアップ

次に、レポジトリをセットアップしていきます。まずはDockerのオフィシャルGPG keyを追加します。

$ curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -
OK

OKと表示されていれば、正常に追加されています。

Key IDの検証をします。以下のコマンドを実行します。

$ apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D
pub 4096R/2C52609D 2015-07-14
フィンガー・プリント = 5811 8E89 F3A9 1289 7C07 0ADB F762 2157 2C52 609D
uid Docker Release Tool (releasedocker) docker@docker.com

安定版のレポジトリをセットアップします。

$ sudo add-apt-repository \
       "deb https://apt.dockerproject.org/repo/ \
       ubuntu-$(lsb_release -cs) \
       main"

Dockerのインストール

これで、Dockerをインストールする準備が出来ました。aptパッケージをアップデートして、Dockerをインストールします。

$ sudo apt-get update
$ sudo apt-get -y install docker-engine

NVIDIA Docker (GPU対応)

GPUに対応したTensorFlowを動作させたい場合は、NVIDIA Dockerを別途インストールします。NVIDIA Dockerは、NVIDIAのGPUが搭載されているマシンでDockerコンテナを実行する際に、GPUで高速化されたプログラムを実行できるようにするツールです。

nvidia-gpu-docker NVIDIA Docker

Ubuntuでインストールする場合は、以下のコマンドを実行します。

$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0/nvidia-docker_1.0.0-1_amd64.deb
$ sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

これでインストールは完了です。正常にインストールできているかテストするために、次のコマンドを実行してみてください。

$ nvidia-docker run --rm nvidia/cuda nvidia-smi

コンテナがダウンロードされて、nvidia-smiコマンドが実行されるはずです。

TensorFlowのコンテナを実行する

TensorFlowのDockerイメージは4つあります。

Dockerイメージ 説明
gcr.io/tensorflow/tensorflow CPU安定版Dockerイメージ
gcr.io/tensorflow/tensorflow:latest-devel CPU開発中のDockerイメージ
gcr.io/tensorflow/tensorflow:latest-gpu GPU安定版Dockerイメージ
gcr.io/tensorflow/tensorflow:latest-devel-gpu GPU開発中のDockerイメージ

お使いの環境に合わせて、選択してください。

まずは、tensorflow/tensorflowのDockerイメージを実行してみます。

$ docker run -it -p 8888:8888 tensorflow/tensorflow

すると、tensorflow/tensorflowイメージがダウンロードされて、Jupyter Notebookが起動されました。ターミナルの出力の最後にURLが表示されていると思うので、ブラウザからアクセスしてみます。

Docker run

Jupyter Notebook

MNISTや簡単なチュートリアルの解説付きのJupyter Notebookが表示されているはずです。

TensorFlowのサンプルを実行してみる

以下のコードをsample.pyというファイル名で保存してください。

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a+b))

Dockerfileを書きます。同じディレクトリにDockerfileという名前で以下のコードを保存します。

FROM gcr.io/tensorflow/tensorflow

COPY ./sample.py /tmp/sample.py

Dockerイメージをビルドしてみます。-tオプションで、タグ名を付けることができます。

$ docker build -t docker:sample .

これで、実行してみます。

$ docker run --rm -it docker:sample python /tmp/sample.py
Hello, TensorFlow!
42

Hello, TensorFlow!と、42が出力されるはずです。

まとめ

TensorFlowをDockerコンテナに入れて使う方法を解説してみました。

Dockerを使うことで、インフラ環境やライブラリを共有しながら開発することができます。

また、GPUに対応したTensorFlowが動作するDockerコンテナも簡単につくることができます。

チーム開発やサーバ構築で使うと便利なので使ってみてください。

参考