Python
初心者
docker
TensorFlow
nvidia-docker

Pythonによるスクレイピング&機械学習のお勉強その5-1/5-2/5-3 - 深層学習の準備

今回の目標

このシリーズでは教科書(文献1)に沿ってPythonによるスクレイピングと機械学習を学びます。今回は第5章「深層学習に挑戦しよう」から5-1「深層学習とはなにか」、5-2「TensorFlowのインストール」、5-3「Jupyter Notebookのススメ」を学びます。

今回行うこと

5-1「深層学習とはなにか」では深層学習の基本について述べられていますが、この節はプログラムの作成課題はありません。また5-2「TensorFlowのインストール」、5-3「Jupyter Notebookのススメ」ではそれぞれのインストールと確認事項が記載されています。
よって、今回記事では自分の学習環境にこれらのソフトウェアをインストールする作業を記述します。

方法と結果

TensorFlowとJupyterをインストールする環境

私は現在、この学習シリーズでは2つのマシンを使用しています。

  1. MacBook Pro 13inch(2017)
    • CPU: Core i5 3.1GHz(2 core/4 threads)
    • メインメモリ: 16GB
    • GPU: なし
    • Mac OS 10.13.5 HighSierra
  2. デスクトップワークステーション
    • CPU: Intel Xeon E5 3.6GHz(6 core/12 threads)
    • メインメモリ: 128GB
    • GPU: nVIDIA GeForce 1080Ti x 4
    • OS: Ubuntu 17.10.1 日本語Remix

主に使用しているのは前者で、デスクトップマシンは職場に置いているので時間のかかる処理を走らせるときに使っています。今回はMacBook Proにはdocker環境にTensorFlowとJupyterを、ワークステーションはせっかくGPUを積んでいるので、nvidia-dockerをインストールしてGPU対応のTensorFlowとJupyterを入れたいと思います。

CPU onlyマシンへのインストール

その0で作成した学習用docker環境をベースにします。

$ docker run -t -i  pylearn2 /bin/bash

dockerに入ったら、まずTensorFlow(CPU版)をインストールします。

# pip install tensorflow
Collecting tensorflow
  Downloading https://files.pythonhosted.org/packages/22/c6/d08f7c549330c2acc1b18b5c1f0f8d9d2af92f54d56861f331f372731671/tensorflow-1.8.0-cp36-cp36m-manylinux1_x86_64.whl (49.1MB)
    100% |################################| 49.1MB 140kB/s 
Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.6/site-packages (from tensorflow) (1.10.0)
Collecting tensorboard<1.9.0,>=1.8.0 (from tensorflow)
  Downloading https://files.pythonhosted.org/packages/59/a6/0ae6092b7542cfedba6b2a1c9b8dceaf278238c39484f3ba03b03f07803c/tensorboard-1.8.0-py3-none-any.whl (3.1MB)
    100% |################################| 3.1MB 193kB/s 
Collecting grpcio>=1.8.6 (from tensorflow)
  Downloading https://files.pythonhosted.org/packages/1f/ea/664c589ec41b9e9ac6e20cc1fe9016f3913332d0dc5498a5d7771e2835af/grpcio-1.12.1-cp36-cp36m-manylinux1_x86_64.whl (9.0MB)
    100% |################################| 9.0MB 163kB/s 
Collecting astor>=0.6.0 (from tensorflow)
  Downloading https://files.pythonhosted.org/packages/b2/91/cc9805f1ff7b49f620136b3a7ca26f6a1be2ed424606804b0fbcf499f712/astor-0.6.2-py2.py3-none-any.whl
Collecting protobuf>=3.4.0 (from tensorflow)
  Downloading https://files.pythonhosted.org/packages/fc/f0/db040681187496d10ac50ad167a8fd5f953d115b16a7085e19193a6abfd2/protobuf-3.6.0-cp36-cp36m-manylinux1_x86_64.whl (7.1MB)
    100% |################################| 7.1MB 169kB/s 
Collecting absl-py>=0.1.6 (from tensorflow)
  Downloading https://files.pythonhosted.org/packages/57/8d/6664518f9b6ced0aa41cf50b989740909261d4c212557400c48e5cda0804/absl-py-0.2.2.tar.gz (82kB)
    100% |################################| 92kB 166kB/s 
Collecting gast>=0.2.0 (from tensorflow)
  Downloading https://files.pythonhosted.org/packages/5c/78/ff794fcae2ce8aa6323e789d1f8b3b7765f601e7702726f430e814822b96/gast-0.2.0.tar.gz
Requirement already satisfied: numpy>=1.13.3 in /usr/local/lib/python3.6/site-packages (from tensorflow) (1.14.3)
Requirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.6/site-packages (from tensorflow) (0.29.0)
Collecting termcolor>=1.1.0 (from tensorflow)
  Downloading https://files.pythonhosted.org/packages/8a/48/a76be51647d0eb9f10e2a4511bf3ffb8cc1e6b14e9e4fab46173aa79f981/termcolor-1.1.0.tar.gz
Collecting bleach==1.5.0 (from tensorboard<1.9.0,>=1.8.0->tensorflow)
  Downloading https://files.pythonhosted.org/packages/33/70/86c5fec937ea4964184d4d6c4f0b9551564f821e1c3575907639036d9b90/bleach-1.5.0-py2.py3-none-any.whl
Collecting html5lib==0.9999999 (from tensorboard<1.9.0,>=1.8.0->tensorflow)
  Downloading https://files.pythonhosted.org/packages/ae/ae/bcb60402c60932b32dfaf19bb53870b29eda2cd17551ba5639219fb5ebf9/html5lib-0.9999999.tar.gz (889kB)
    100% |################################| 890kB 208kB/s 
Collecting werkzeug>=0.11.10 (from tensorboard<1.9.0,>=1.8.0->tensorflow)
  Downloading https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl (322kB)
    100% |################################| 327kB 181kB/s 
Collecting markdown>=2.6.8 (from tensorboard<1.9.0,>=1.8.0->tensorflow)
  Downloading https://files.pythonhosted.org/packages/6d/7d/488b90f470b96531a3f5788cf12a93332f543dbab13c423a5e7ce96a0493/Markdown-2.6.11-py2.py3-none-any.whl (78kB)
    100% |################################| 81kB 159kB/s 
Requirement already satisfied: setuptools in /usr/local/lib/python3.6/site-packages (from protobuf>=3.4.0->tensorflow) (36.4.0)
Building wheels for collected packages: absl-py, gast, termcolor, html5lib
  Running setup.py bdist_wheel for absl-py ... done
  Stored in directory: /root/.cache/pip/wheels/a0/f8/e9/1933dbb3447ea6ef57062fd5461cb118deb8c2ed074e8344bf
  Running setup.py bdist_wheel for gast ... done
  Stored in directory: /root/.cache/pip/wheels/9a/1f/0e/3cde98113222b853e98fc0a8e9924480a3e25f1b4008cedb4f
  Running setup.py bdist_wheel for termcolor ... done
  Stored in directory: /root/.cache/pip/wheels/7c/06/54/bc84598ba1daf8f970247f550b175aaaee85f68b4b0c5ab2c6
  Running setup.py bdist_wheel for html5lib ... done
  Stored in directory: /root/.cache/pip/wheels/50/ae/f9/d2b189788efcf61d1ee0e36045476735c838898eef1cad6e29
Successfully built absl-py gast termcolor html5lib
Installing collected packages: html5lib, bleach, protobuf, werkzeug, markdown, tensorboard, grpcio, astor, absl-py, gast, termcolor, tensorflow
Successfully installed absl-py-0.2.2 astor-0.6.2 bleach-1.5.0 gast-0.2.0 grpcio-1.12.1 html5lib-0.9999999 markdown-2.6.11 protobuf-3.6.0 tensorboard-1.8.0 tensorflow-1.8.0 termcolor-1.1.0 werkzeug-0.14.1

次にJupyterのインストールです。

# pip install jupyter
Collecting jupyter
  Downloading https://files.pythonhosted.org/packages/83/df/0f5dd132200728a86190397e1ea87cd76244e42d39ec5e88efd25b2abd7e/jupyter-1.0.0-py2.py3-none-any.whl
Collecting ipywidgets (from jupyter)
  Downloading https://files.pythonhosted.org/packages/7d/24/fabc09ad81c6071159a4d12d5bfbddcbea69bd9e3b16c3250ef300c0285f/ipywidgets-7.2.1-py2.py3-none-any.whl (106kB)
    100% |################################| 112kB 83kB/s 
Collecting jupyter-console (from jupyter)
  Downloading https://files.pythonhosted.org/packages/77/82/6469cd7fccf7958cbe5dce2e623f1e3c5e27f1bb1ad36d90519bc2d5d370/jupyter_console-5.2.0-py2.py3-none-any.whl
Collecting qtconsole (from jupyter)
  Downloading https://files.pythonhosted.org/packages/90/ff/047e0dca2627b162866920e7aa93f04523c0ae81e5c67060eec85701992d/qtconsole-4.3.1-py2.py3-none-any.whl (108kB)
    100% |################################| 112kB 58kB/s 
Collecting notebook (from jupyter)
  Downloading https://files.pythonhosted.org/packages/c0/66/cfed59f574d03ca5f1b7c5281485a9cc9a0f21342d24e0f057572316dae5/notebook-5.5.0-py2.py3-none-any.whl (8.4MB)
    100% |################################| 8.4MB 155kB/s 
Collecting nbconvert (from jupyter)
  Downloading https://files.pythonhosted.org/packages/39/ea/280d6c0d92f8e3ca15fd798bbcc2ea141489f9539de7133d8fe10ea4b049/nbconvert-5.3.1-py2.py3-none-any.whl (387kB)
    100% |################################| 389kB 179kB/s 
Collecting ipykernel (from jupyter)
  Downloading https://files.pythonhosted.org/packages/ab/3f/cd624c835aa3336a9110d0a99e15070f343b881b7d651ab1375ef226a3ac/ipykernel-4.8.2-py3-none-any.whl (108kB)
    100% |################################| 112kB 166kB/s 
Collecting ipython>=4.0.0; python_version >= "3.3" (from ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/b1/7f/91d50f28af3e3a24342561983a7857e399ce24093876e6970b986a0b6677/ipython-6.4.0-py3-none-any.whl (750kB)
    100% |################################| 757kB 47kB/s 
Collecting widgetsnbextension~=3.2.0 (from ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/ff/fa/64acc09fc845a6b2dc0724d6f3f81e829b778ed5e9a7559567b4f19a3f4b/widgetsnbextension-3.2.1-py2.py3-none-any.whl (2.2MB)
    100% |################################| 2.2MB 166kB/s 
Collecting traitlets>=4.3.1 (from ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/93/d6/abcb22de61d78e2fc3959c964628a5771e47e7cc60d53e9342e21ed6cc9a/traitlets-4.3.2-py2.py3-none-any.whl (74kB)
    100% |################################| 81kB 162kB/s 
Collecting nbformat>=4.2.0 (from ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/da/27/9a654d2b6cc1eaa517d1c5a4405166c7f6d72f04f6e7eea41855fe808a46/nbformat-4.4.0-py2.py3-none-any.whl (155kB)
    100% |################################| 163kB 168kB/s 
Collecting prompt-toolkit<2.0.0,>=1.0.0 (from jupyter-console->jupyter)
  Downloading https://files.pythonhosted.org/packages/04/d1/c6616dd03701e7e2073f06d5c3b41b012256e42b72561f16a7bd86dd7b43/prompt_toolkit-1.0.15-py3-none-any.whl (247kB)
    100% |################################| 256kB 185kB/s 
Collecting jupyter-client (from jupyter-console->jupyter)
  Downloading https://files.pythonhosted.org/packages/94/dd/fe6c4d683b09eb05342bd2816b7779663f71762b4fa9c2d5203d35d17354/jupyter_client-5.2.3-py2.py3-none-any.whl (89kB)
    100% |################################| 92kB 150kB/s 
Collecting pygments (from jupyter-console->jupyter)
  Downloading https://files.pythonhosted.org/packages/02/ee/b6e02dc6529e82b75bb06823ff7d005b141037cb1416b10c6f00fc419dca/Pygments-2.2.0-py2.py3-none-any.whl (841kB)
    100% |################################| 849kB 185kB/s 
Collecting ipython-genutils (from qtconsole->jupyter)
  Downloading https://files.pythonhosted.org/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl
Collecting jupyter-core (from qtconsole->jupyter)
  Downloading https://files.pythonhosted.org/packages/1d/44/065d2d7bae7bebc06f1dd70d23c36da8c50c0f08b4236716743d706762a8/jupyter_core-4.4.0-py2.py3-none-any.whl (126kB)
    100% |################################| 133kB 163kB/s 
Collecting terminado>=0.8.1 (from notebook->jupyter)
  Downloading https://files.pythonhosted.org/packages/2e/20/a26211a24425923d46e1213b376a6ee60dc30bcdf1b0c345e2c3769deb1c/terminado-0.8.1-py2.py3-none-any.whl
Collecting tornado>=4 (from notebook->jupyter)
  Downloading https://files.pythonhosted.org/packages/cf/d1/3be271ae5eba9fb59df63c9891fdc7d8044b999e8ac145994cdbfd2ae66a/tornado-5.0.2.tar.gz (506kB)
    100% |################################| 512kB 80kB/s 
Collecting jinja2 (from notebook->jupyter)
  Downloading https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl (126kB)
    100% |################################| 133kB 178kB/s 
Collecting pyzmq>=17 (from notebook->jupyter)
  Downloading https://files.pythonhosted.org/packages/58/0e/d40ee65acabb0776ccdade96812adc0438051ef6cff1ddbe4da463604867/pyzmq-17.0.0-cp36-cp36m-manylinux1_x86_64.whl (3.1MB)
    100% |################################| 3.1MB 130kB/s 
Collecting Send2Trash (from notebook->jupyter)
  Downloading https://files.pythonhosted.org/packages/49/46/c3dc27481d1cc57b9385aff41c474ceb7714f7935b1247194adae45db714/Send2Trash-1.5.0-py3-none-any.whl
Collecting testpath (from nbconvert->jupyter)
  Downloading https://files.pythonhosted.org/packages/15/19/d7bc380c479a184e4a5a9ce516e4e2a773165f89b445f7cdced83d94de25/testpath-0.3.1-py2.py3-none-any.whl (161kB)
    100% |################################| 163kB 168kB/s 
Collecting entrypoints>=0.2.2 (from nbconvert->jupyter)
  Downloading https://files.pythonhosted.org/packages/cc/8b/4eefa9b47f1910b3d2081da67726b066e379b04ca897acfe9f92bac56147/entrypoints-0.2.3-py2.py3-none-any.whl
Requirement already satisfied: bleach in /usr/local/lib/python3.6/site-packages (from nbconvert->jupyter) (1.5.0)
Collecting mistune>=0.7.4 (from nbconvert->jupyter)
  Downloading https://files.pythonhosted.org/packages/c8/8c/87f4d359438ba0321a2ae91936030110bfcc62fef752656321a72b8c1af9/mistune-0.8.3-py2.py3-none-any.whl
Collecting pandocfilters>=1.4.1 (from nbconvert->jupyter)
  Downloading https://files.pythonhosted.org/packages/4c/ea/236e2584af67bb6df960832731a6e5325fd4441de001767da328c33368ce/pandocfilters-1.4.2.tar.gz
Collecting pexpect; sys_platform != "win32" (from ipython>=4.0.0; python_version >= "3.3"->ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/89/e6/b5a1de8b0cc4e07ca1b305a4fcc3f9806025c1b651ea302646341222f88b/pexpect-4.6.0-py2.py3-none-any.whl (57kB)
    100% |################################| 61kB 171kB/s 
Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= "3.3"->ipywidgets->jupyter) (36.4.0)
Collecting pickleshare (from ipython>=4.0.0; python_version >= "3.3"->ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/9f/17/daa142fc9be6b76f26f24eeeb9a138940671490b91cb5587393f297c8317/pickleshare-0.7.4-py2.py3-none-any.whl
Collecting backcall (from ipython>=4.0.0; python_version >= "3.3"->ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/84/71/c8ca4f5bb1e08401b916c68003acf0a0655df935d74d93bf3f3364b310e0/backcall-0.1.0.tar.gz
Requirement already satisfied: decorator in /usr/local/lib/python3.6/site-packages (from ipython>=4.0.0; python_version >= "3.3"->ipywidgets->jupyter) (4.3.0)
Collecting jedi>=0.10 (from ipython>=4.0.0; python_version >= "3.3"->ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/e7/42/074192a165622e645ed4aeade63e76e56b3496a044569b3c6cae3a918352/jedi-0.12.0-py2.py3-none-any.whl (172kB)
    100% |################################| 174kB 158kB/s 
Collecting simplegeneric>0.8 (from ipython>=4.0.0; python_version >= "3.3"->ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/3d/57/4d9c9e3ae9a255cd4e1106bb57e24056d3d0709fc01b2e3e345898e49d5b/simplegeneric-0.8.1.zip
Requirement already satisfied: six in /usr/local/lib/python3.6/site-packages (from traitlets>=4.3.1->ipywidgets->jupyter) (1.10.0)
Collecting jsonschema!=2.5.0,>=2.4 (from nbformat>=4.2.0->ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/77/de/47e35a97b2b05c2fadbec67d44cfcdcd09b8086951b331d82de90d2912da/jsonschema-2.6.0-py2.py3-none-any.whl
Collecting wcwidth (from prompt-toolkit<2.0.0,>=1.0.0->jupyter-console->jupyter)
  Downloading https://files.pythonhosted.org/packages/7e/9f/526a6947247599b084ee5232e4f9190a38f398d7300d866af3ab571a5bfe/wcwidth-0.1.7-py2.py3-none-any.whl
Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/site-packages (from jupyter-client->jupyter-console->jupyter) (2.7.3)
Collecting ptyprocess; os_name != "nt" (from terminado>=0.8.1->notebook->jupyter)
  Downloading https://files.pythonhosted.org/packages/ff/4e/fa4a73ccfefe2b37d7b6898329e7dbcd1ac846ba3a3b26b294a78a3eb997/ptyprocess-0.5.2-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from jinja2->notebook->jupyter)
  Downloading https://files.pythonhosted.org/packages/4d/de/32d741db316d8fdb7680822dd37001ef7a448255de9699ab4bfcbdf4172b/MarkupSafe-1.0.tar.gz
Requirement already satisfied: html5lib!=0.9999,!=0.99999,<0.99999999,>=0.999 in /usr/local/lib/python3.6/site-packages (from bleach->nbconvert->jupyter) (0.9999999)
Collecting parso>=0.2.0 (from jedi>=0.10->ipython>=4.0.0; python_version >= "3.3"->ipywidgets->jupyter)
  Downloading https://files.pythonhosted.org/packages/cd/3e/5908f9577dbd1e5df53e64349bfd11e46b726c1e4d8cd676bbe8aa4de316/parso-0.2.1-py2.py3-none-any.whl (91kB)
    100% |################################| 92kB 163kB/s 
Building wheels for collected packages: tornado, pandocfilters, backcall, simplegeneric, MarkupSafe
  Running setup.py bdist_wheel for tornado ... done
  Stored in directory: /root/.cache/pip/wheels/29/8c/cf/6a5a8f6e35d877c0cb72b109d21c34981504897ce9a605e599
  Running setup.py bdist_wheel for pandocfilters ... done
  Stored in directory: /root/.cache/pip/wheels/39/01/56/f1b08a6275acc59e846fa4c1e1b65dbc1919f20157d9e66c20
  Running setup.py bdist_wheel for backcall ... done
  Stored in directory: /root/.cache/pip/wheels/98/b0/dd/29e28ff615af3dda4c67cab719dd51357597eabff926976b45
  Running setup.py bdist_wheel for simplegeneric ... done
  Stored in directory: /root/.cache/pip/wheels/a9/28/53/f24776b4c5bcbe91aaf1f1e247bd6fadd17191aa12fac63902
  Running setup.py bdist_wheel for MarkupSafe ... done
  Stored in directory: /root/.cache/pip/wheels/33/56/20/ebe49a5c612fffe1c5a632146b16596f9e64676768661e4e46
Successfully built tornado pandocfilters backcall simplegeneric MarkupSafe
Installing collected packages: ptyprocess, pexpect, pickleshare, ipython-genutils, traitlets, backcall, wcwidth, prompt-toolkit, pygments, parso, jedi, simplegeneric, ipython, tornado, pyzmq, jupyter-core, jupyter-client, ipykernel, terminado, MarkupSafe, jinja2, Send2Trash, testpath, entrypoints, mistune, pandocfilters, jsonschema, nbformat, nbconvert, notebook, widgetsnbextension, ipywidgets, jupyter-console, qtconsole, jupyter
Successfully installed MarkupSafe-1.0 Send2Trash-1.5.0 backcall-0.1.0 entrypoints-0.2.3 ipykernel-4.8.2 ipython-6.4.0 ipython-genutils-0.2.0 ipywidgets-7.2.1 jedi-0.12.0 jinja2-2.10 jsonschema-2.6.0 jupyter-1.0.0 jupyter-client-5.2.3 jupyter-console-5.2.0 jupyter-core-4.4.0 mistune-0.8.3 nbconvert-5.3.1 nbformat-4.4.0 notebook-5.5.0 pandocfilters-1.4.2 parso-0.2.1 pexpect-4.6.0 pickleshare-0.7.4 prompt-toolkit-1.0.15 ptyprocess-0.5.2 pygments-2.2.0 pyzmq-17.0.0 qtconsole-4.3.1 simplegeneric-0.8.1 terminado-0.8.1 testpath-0.3.1 tornado-5.0.2 traitlets-4.3.2 wcwidth-0.1.7 widgetsnbextension-3.2.1

インストールメッセージは長いのですが、問題なくインストールできました。
ここで一旦dockerのイメージを更新しておきます。

dockerイメージの更新

TensorFlowとJupyterをインストールしたdockerから一旦抜けます。

#(docker上で)
# exit

次に、イメージを確認して今までのイメージをインストール後のものに更新します。

$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
d731df3eb787        pylearn2            "/bin/bash"         19 minutes ago      Exited (0) 2 seconds ago                       zealous_blackwell
$ docker commit d731df3eb787 pylearn2:latest
sha256:31925d29c9d2ba3c7c82dae27791cb62d23ebda8e934bf35c5f163cbe7b36d31
$ docker images | grep pylearn2 #確認
pylearn2                 latest              31925d29c9d2        21 seconds ago      1.54GB

これでTensorFlowとJupyterがインストールされた状態のdockerイメージを作ることができました。
今後このイメージを使用するときは以下のようにします。

$ docker run -i -t -v $HOME/src:$HOME/src -p 8888:8888 \
-e LC_CTYPE=“C.UTF-8” -e MPLBACKEND=“agg" pylearn2 /bin/bash

環境変数LC_CTYPEはminicondaベースのイメージで端末にUTF-8を表示するための設定です。環境変数MPLBACKENDは、matplotlibでX11がインストールされていなくてもエラーを吐かないようにする設定です。

TensorFlowの試運転

dockerに入ったら、まずはTensorFlowが動くかどうかを確認します。

# python
Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> sess = tf.Session()
2018-06-20 08:39:21.264739: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
>>> hello = tf.constant('Hello')
>>> sess.run(hello)
b'Hello'
>>> quit()

難しいことはさせていませんが、とりあえずちゃんと動くようです。

Jupyter Notebookの試運転

次にJupyter Notebookです。dockerにはブラウザもGUI環境もないので、—no-browserオプションを付け、サーバーのみ立ち上げます。また、dockerのユーザーはrootをそのまま使っているので、—allow-rootオプションを付けます。—ipはdockerコンテナのIPアドレスを指定するようですが、0.0.0.0で動きました(深い理由は追求していません)。

# cd #(ソース等が置いてある適当なディレクトリ)
# jupyter notebook —no-browser —ip=0.0.0.0 —allow-root
[I 08:59:07.438 NotebookApp] Serving notebooks from local directory: /Users/******/src/pylearn2/ch4
[I 08:59:07.439 NotebookApp] 0 active kernels
[I 08:59:07.439 NotebookApp] The Jupyter Notebook is running at:
[I 08:59:07.440 NotebookApp] http://60f5a518a768:8888/?token=トークン文字列
[I 08:59:07.440 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

このように立ち上がります。これでホストのMacOS側のブラウザから表示されたURL(ホストのみlocalhostに変更)にアクセスすることでJupyter Notebookが使えるようになりました。

GPUマシンへのインストール

nvidia-dockerのインストール

まず、GPU版TensorFlowを動作させられるdocker環境として、nvidia-dockerをインストールする必要があります。これはnvidia-dockerの公式サイトの指示に従ってインストールします。

$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
OK
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
distribution=ubuntu16.04
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list |   sudo tee /etc/apt/sources.list.d/nvidia-docker.list
deb https://nvidia.github.io/libnvidia-container/ubuntu16.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/$(ARCH) /
deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/$(ARCH) /
$ sudo apt-get update
ヒット:1 http://archive.ubuntulinux.jp/ubuntu artful InRelease
ヒット:2 http://jp.archive.ubuntu.com/ubuntu artful InRelease                                                                  
取得:3 http://jp.archive.ubuntu.com/ubuntu artful-updates InRelease [88.7 kB]                                                  
ヒット:4 http://archive.ubuntulinux.jp/ubuntu-ja-non-free artful InRelease                                                     
ヒット:5 https://download.docker.com/linux/ubuntu artful InRelease                                                             
取得:6 https://nvidia.github.io/libnvidia-container/ubuntu16.04/amd64  InRelease [1,106 B]                                     
取得:7 https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/amd64  InRelease [1,136 B]                                
取得:8 https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64  InRelease [1,129 B]                                           
取得:9 http://jp.archive.ubuntu.com/ubuntu artful-backports InRelease [74.6 kB]                                                
取得:10 http://security.ubuntu.com/ubuntu artful-security InRelease [83.2 kB]                                            
ヒット:11 https://packages.microsoft.com/repos/vscode stable InRelease                                                   
取得:12 https://nvidia.github.io/libnvidia-container/ubuntu16.04/amd64  Packages [4,860 B]                               
取得:13 https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/amd64  Packages [5,568 B]
取得:14 http://jp.archive.ubuntu.com/ubuntu artful-updates/main amd64 Packages [282 kB]
取得:15 https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64  Packages [5,772 B]        
取得:16 http://jp.archive.ubuntu.com/ubuntu artful-updates/main i386 Packages [277 kB]      
取得:17 http://jp.archive.ubuntu.com/ubuntu artful-updates/main amd64 DEP-11 Metadata [88.4 kB]
取得:18 http://jp.archive.ubuntu.com/ubuntu artful-updates/main DEP-11 64x64 Icons [50.0 kB]   
取得:19 http://jp.archive.ubuntu.com/ubuntu artful-updates/universe amd64 Packages [119 kB]    
取得:20 http://jp.archive.ubuntu.com/ubuntu artful-updates/universe i386 Packages [118 kB]     
取得:21 http://jp.archive.ubuntu.com/ubuntu artful-updates/universe amd64 DEP-11 Metadata [84.7 kB]
取得:22 http://jp.archive.ubuntu.com/ubuntu artful-updates/universe DEP-11 64x64 Icons [106 kB]
取得:23 http://jp.archive.ubuntu.com/ubuntu artful-updates/multiverse amd64 DEP-11 Metadata [2,468 B]
取得:24 http://jp.archive.ubuntu.com/ubuntu artful-backports/universe amd64 DEP-11 Metadata [5,092 B]
取得:25 http://security.ubuntu.com/ubuntu artful-security/main i386 Packages [182 kB]                   
取得:26 http://security.ubuntu.com/ubuntu artful-security/main amd64 Packages [187 kB]
取得:27 http://security.ubuntu.com/ubuntu artful-security/main amd64 DEP-11 Metadata [32.7 kB]
取得:28 http://security.ubuntu.com/ubuntu artful-security/main DEP-11 64x64 Icons [37.0 kB]
取得:29 http://security.ubuntu.com/ubuntu artful-security/universe amd64 DEP-11 Metadata [40.4 kB]
取得:30 http://security.ubuntu.com/ubuntu artful-security/universe DEP-11 64x64 Icons [44.8 kB]
1,923 kB を 5秒 で取得しました (332 kB/s)                              
パッケージリストを読み込んでいます... 完了
# dockerdの再起動
$ sudo pkill -SIGHUP dockerd
#nvidia-dockerのインストール
$ sudo apt-get install nvidia-docker2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  libcap2:i386 libffi6:i386 libgmp10:i386 libhogweed4:i386 libicu57:i386 libidn11:i386 libnettle6:i386 libp11-kit0:i386
  libsqlite3-0:i386 libstdc++6:i386 libstemmer0d:i386 libxml2:i386 libyaml-0-2:i386 linux-image-4.13.0-21-generic
  linux-image-extra-4.13.0-21-generic
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
  libnvidia-container-tools libnvidia-container1 nvidia-container-runtime nvidia-container-runtime-hook
以下のパッケージが新たにインストールされます:
  libnvidia-container-tools libnvidia-container1 nvidia-container-runtime nvidia-container-runtime-hook nvidia-docker2
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 4 個。
2,377 kB のアーカイブを取得する必要があります。
この操作後に追加で 9,809 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 https://nvidia.github.io/libnvidia-container/ubuntu16.04/amd64  libnvidia-container1 1.0.0~rc.2-1 [56.1 kB]
取得:2 https://nvidia.github.io/libnvidia-container/ubuntu16.04/amd64  libnvidia-container-tools 1.0.0~rc.2-1 [15.0 kB]
取得:3 https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/amd64  nvidia-container-runtime-hook 1.3.0-1 [576 kB]
取得:4 https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/amd64  nvidia-container-runtime 2.0.0+docker18.03.1-1 [1,726 kB]
取得:5 https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64  nvidia-docker2 2.0.3+docker18.03.1-1 [2,892 B]
2,377 kB を 5秒 で取得しました (469 kB/s)
以前に未選択のパッケージ libnvidia-container1:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 222207 個のファイルとディレクトリがインストールされています。)
.../libnvidia-container1_1.0.0~rc.2-1_amd64.deb を展開する準備をしています ...
libnvidia-container1:amd64 (1.0.0~rc.2-1) を展開しています...
以前に未選択のパッケージ libnvidia-container-tools を選択しています。
.../libnvidia-container-tools_1.0.0~rc.2-1_amd64.deb を展開する準備をしています ...
libnvidia-container-tools (1.0.0~rc.2-1) を展開しています...
以前に未選択のパッケージ nvidia-container-runtime-hook を選択しています。
.../nvidia-container-runtime-hook_1.3.0-1_amd64.deb を展開する準備をしています ...
nvidia-container-runtime-hook (1.3.0-1) を展開しています...
以前に未選択のパッケージ nvidia-container-runtime を選択しています。
.../nvidia-container-runtime_2.0.0+docker18.03.1-1_amd64.deb を展開する準備をしています ...
nvidia-container-runtime (2.0.0+docker18.03.1-1) を展開しています...
以前に未選択のパッケージ nvidia-docker2 を選択しています。
.../nvidia-docker2_2.0.3+docker18.03.1-1_all.deb を展開する準備をしています ...
nvidia-docker2 (2.0.3+docker18.03.1-1) を展開しています...
libnvidia-container1:amd64 (1.0.0~rc.2-1) を設定しています ...
libnvidia-container-tools (1.0.0~rc.2-1) を設定しています ...
libc-bin (2.26-0ubuntu2.1) のトリガを処理しています ...
nvidia-container-runtime-hook (1.3.0-1) を設定しています ...
nvidia-container-runtime (2.0.0+docker18.03.1-1) を設定しています ...
nvidia-docker2 (2.0.3+docker18.03.1-1) を設定しています ...

ここまででnvidia-dockerがインストールできました。GPUがdockerから使えるか、試運転してみます。

$ sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
Unable to find image 'nvidia/cuda:latest' locally
latest: Pulling from nvidia/cuda
b234f539f7a1: Pull complete 
55172d420b43: Pull complete 
5ba5bbeb6b91: Pull complete 
43ae2841ad7a: Pull complete 
f6c9c6de4190: Pull complete 
d5ddb2a2159f: Pull complete 
663648e540ff: Pull complete 
d056eaf3dff4: Pull complete 
7dc790b5527b: Pull complete 
89bce857a556: Pull complete 
Digest: sha256:3cdf1b5becfde8772e15dab594bc76de1cbbefd6c0f8533748854ab47e109ad1
Status: Downloaded newer image for nvidia/cuda:latest
Thu Jun 21 02:21:21 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.130                Driver Version: 384.130                   |
|-------------------------------+----------------------+----------------------+
| 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 108...  Off  | 00000000:05:00.0  On |                  N/A |
| 28%   40C    P8     9W / 250W |    674MiB / 11171MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:06:00.0 Off |                  N/A |
| 28%   39C    P8     9W / 250W |      2MiB / 11172MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
|   2  GeForce GTX 108...  Off  | 00000000:09:00.0 Off |                  N/A |
| 28%   41C    P8     9W / 250W |      2MiB / 11172MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
|   3  GeForce GTX 108...  Off  | 00000000:0A:00.0 Off |                  N/A |
| 28%   31C    P8     9W / 250W |      2MiB / 11172MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

これでちゃんとGPUが認識されているようです。

学習用dockerイメージの作成

Python/機械学習の学習に使う自分用dockerイメージを作るに当たって、

  1. AnacondaベースのイメージにCUDA関係をインストール
  2. Ubuntuなどの一般的なLinuxディストリビューションベースのイメージにPython環境とCUDA関係をインストール
  3. nvidia/cudaのイメージをベースに、必要なLinuxツールとAnacondaをインストール

の3つの方針が考えられます。実はいろいろ試行錯誤したのですが、一番大変なのはdocker上でCUDA関係のプログラムを正しく動作させることでした。ということで、CUDAは動く状態で提供されている3.の方針を最終的に採用することにしました。
しかし、こういう試行錯誤でイメージを気軽に作ったり廃棄したりできるdockerって本当に便利です。

それでは、まずベースとなるCUDAのdockerイメージを取得してnvidia-smiを試運転します。

$ sudo docker pull nvidia/cuda:9.2-cudnn7-devel
9.2-cudnn7-devel: Pulling from nvidia/cuda
b234f539f7a1: Already exists 
55172d420b43: Already exists 
5ba5bbeb6b91: Already exists 
43ae2841ad7a: Already exists 
f6c9c6de4190: Already exists 
d47b00a115a9: Pull complete 
99a4fdc9eb93: Pull complete 
1fae532f04aa: Pull complete 
cc775e2f365e: Pull complete 
96a25d26f6c3: Pull complete 
b5af4c7c5099: Pull complete 
Digest: sha256:7af9b28227306281e73b244147fe4fade80309af895cf502ff22be722bd86483
Status: Downloaded newer image for nvidia/cuda:9.2-cudnn7-devel

$ sudo docker images | grep cudnn
nvidia/cuda         9.2-cudnn7-devel    9c66645e8cbb        10 days ago         2.93GB

$ sudo docker run --runtime=nvidia nvidia/cuda:9.2-cudnn7-devel nvidia-smi
Sat Jun 23 07:37:44 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 396.26                 Driver Version: 396.26                    |
|-------------------------------+----------------------+----------------------+
| 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 108...  Off  | 00000000:05:00.0  On |                  N/A |
| 32%   45C    P8    17W / 250W |    649MiB / 11177MiB |      4%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:06:00.0 Off |                  N/A |
| 28%   39C    P8     9W / 250W |      2MiB / 11178MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
|   2  GeForce GTX 108...  Off  | 00000000:09:00.0 Off |                  N/A |
| 28%   41C    P8     9W / 250W |      2MiB / 11178MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
|   3  GeForce GTX 108...  Off  | 00000000:0A:00.0 Off |                  N/A |
| 28%   31C    P8     9W / 250W |      2MiB / 11178MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

次に、このイメージをコピーして新しいpylearn2-gpuイメージを作成します。

$ sudo docker ps -l
CONTAINER ID        IMAGE                          COMMAND             CREATED              STATUS                          PORTS               NAMES
fbea6756e49f        nvidia/cuda:9.2-cudnn7-devel   "nvidia-smi"        About a minute ago   Exited (0) About a minute ago                       compassionate_aryabhata

$ sudo docker commit fbea6756e49f pylearn2-gpu
sha256:c55e3a89042abcdcefaea7ec61cb7b911da8182eb4c03da08b25361ba9a5b1c3

$ sudo docker images | grep pylearn2
pylearn2-gpu        latest              c55e3a89042a        32 seconds ago      2.93GB
pylearn2            latest              b4f652f793bf        3 days ago          1.07GB

新しいイメージが作成できました。それでは、ここにAnacondaとGPU版のtensorflowをインストールします。まずはAnacondaです。

$ sudo docker run -i -t -v $HOME:$HOME pylearn2-gpu /bin/bash
# (ここで適当にLinux関係のツールをインストール; 内容は省略)
# Anacondaのインストール; インストーラはAnaconda公式ページよりダウンロード済
# sh ./Anaconda3-5.2.0-Linux-x86_64.sh
# (インストールディレクトリは/usr/local/anaconda3としています)
# (インストールメッセージは省略)

# デフォルトのPythonの確認
# python --version
Python 3.6.5 :: Anaconda, Inc.

これでOKのようです。次にtensorflow-gpuです。pipでインストールするか、condaでインストールするかという選択肢がありますが、pipでやるとどうもCUDAライブラリが新しすぎて(9.2がインストールされていますが、9.0がないというエラーがでます)うまく動作しませんでした。
よって、condaでCUDA 9.0と一緒にインストールします。せっかく9.2が入っているのに勿体ない気もしますが、動作しないよりははるかにましです。

# conda install tensorflow-gpu=1.8.0
Solving environment: done

## Package Plan ##

  environment location: /usr/local/anaconda3

  added / updated specs: 
    - tensorflow-gpu=1.8.0


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    tensorboard-1.8.0          |   py36hf484d3e_0         3.1 MB
    absl-py-0.2.2              |           py36_0         135 KB
    markdown-2.6.11            |           py36_0         104 KB
    html5lib-0.9999999         |           py36_0         176 KB
    astor-0.6.2                |           py36_0          42 KB
    protobuf-3.5.2             |   py36hf484d3e_0         610 KB
    grpcio-1.12.1              |   py36hdbcaa40_0         1.7 MB
    cupti-9.0.176              |                0         1.6 MB
    bleach-1.5.0               |           py36_0          22 KB
    cudatoolkit-9.0            |       h13b8566_0       340.4 MB
    termcolor-1.1.0            |           py36_1           7 KB
    gast-0.2.0                 |           py36_0          15 KB
    _tflow_180_select-1.0      |              gpu           2 KB
    tensorflow-1.8.0           |       hb11d968_0           5 KB
    libprotobuf-3.5.2          |       h6f1eeef_0         4.2 MB
    tensorflow-base-1.8.0      |   py36hc1a7637_0       161.3 MB
    cudnn-7.1.2                |        cuda9.0_0       367.8 MB
    tensorflow-gpu-1.8.0       |       h7b35bdc_0           5 KB
    ------------------------------------------------------------
                                           Total:       881.2 MB

The following NEW packages will be INSTALLED:

    _tflow_180_select: 1.0-gpu              
    absl-py:           0.2.2-py36_0         
    astor:             0.6.2-py36_0         
    cudatoolkit:       9.0-h13b8566_0       
    cudnn:             7.1.2-cuda9.0_0      
    cupti:             9.0.176-0            
    gast:              0.2.0-py36_0         
    grpcio:            1.12.1-py36hdbcaa40_0
    libprotobuf:       3.5.2-h6f1eeef_0     
    markdown:          2.6.11-py36_0        
    protobuf:          3.5.2-py36hf484d3e_0 
    tensorboard:       1.8.0-py36hf484d3e_0 
    tensorflow:        1.8.0-hb11d968_0     
    tensorflow-base:   1.8.0-py36hc1a7637_0 
    tensorflow-gpu:    1.8.0-h7b35bdc_0     
    termcolor:         1.1.0-py36_1         

The following packages will be REMOVED:

    anaconda:          5.2.0-py36_3         

The following packages will be DOWNGRADED:

    bleach:            2.1.3-py36_0          --> 1.5.0-py36_0    
    html5lib:          1.0.1-py36h2f9c1c0_0  --> 0.9999999-py36_0

Proceed ([y]/n)? y


Downloading and Extracting Packages
tensorboard-1.8.0    |  3.1 MB | ############################################################################ | 100% 
absl-py-0.2.2        |  135 KB | ############################################################################ | 100% 
markdown-2.6.11      |  104 KB | ############################################################################ | 100% 
html5lib-0.9999999   |  176 KB | ############################################################################ | 100% 
astor-0.6.2          |   42 KB | ############################################################################ | 100% 
protobuf-3.5.2       |  610 KB | ############################################################################ | 100% 
grpcio-1.12.1        |  1.7 MB | ############################################################################ | 100% 
cupti-9.0.176        |  1.6 MB | ############################################################################ | 100% 
bleach-1.5.0         |   22 KB | ############################################################################ | 100% 
cudatoolkit-9.0      | 340.4 MB | ########################################################################### | 100% 
termcolor-1.1.0      |    7 KB | ############################################################################ | 100% 
gast-0.2.0           |   15 KB | ############################################################################ | 100% 
_tflow_180_select-1. |    2 KB | ############################################################################ | 100% 
tensorflow-1.8.0     |    5 KB | ############################################################################ | 100% 
libprotobuf-3.5.2    |  4.2 MB | ############################################################################ | 100% 
tensorflow-base-1.8. | 161.3 MB | ########################################################################### | 100% 
cudnn-7.1.2          | 367.8 MB | ########################################################################### | 100% 
tensorflow-gpu-1.8.0 |    5 KB | ############################################################################ | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

試運転

それではいよいよtensorflowでGPUが使えるか確認してみましょう。
以下のようなコードを動かしてみます。

tf_gpu_test.py
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
# python ./tf_gpu_test.py
/usr/local/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
2018-06-24 02:09:02.116418: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-06-24 02:09:02.352012: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] Found device 0 with properties: 
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:05:00.0
totalMemory: 10.92GiB freeMemory: 10.11GiB
2018-06-24 02:09:02.489979: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] Found device 1 with properties: 
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:06:00.0
totalMemory: 10.92GiB freeMemory: 10.76GiB
2018-06-24 02:09:02.629932: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] Found device 2 with properties: 
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:09:00.0
totalMemory: 10.92GiB freeMemory: 10.76GiB
2018-06-24 02:09:02.767443: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1356] Found device 3 with properties: 
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:0a:00.0
totalMemory: 10.92GiB freeMemory: 10.76GiB
2018-06-24 02:09:02.773949: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0, 1, 2, 3
2018-06-24 02:09:03.511304: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-06-24 02:09:03.511340: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929]      0 1 2 3 
2018-06-24 02:09:03.511350: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0:   N Y Y Y 
2018-06-24 02:09:03.511358: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 1:   Y N Y Y 
2018-06-24 02:09:03.511365: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 2:   Y Y N Y 
2018-06-24 02:09:03.511371: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 3:   Y Y Y N 
2018-06-24 02:09:03.512097: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/device:GPU:0 with 9783 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:05:00.0, compute capability: 6.1)
2018-06-24 02:09:03.605217: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/device:GPU:1 with 10413 MB memory) -> physical GPU (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:06:00.0, compute capability: 6.1)
2018-06-24 02:09:03.704471: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/device:GPU:2 with 10413 MB memory) -> physical GPU (device: 2, name: GeForce GTX 1080 Ti, pci bus id: 0000:09:00.0, compute capability: 6.1)
2018-06-24 02:09:03.803648: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/device:GPU:3 with 10413 MB memory) -> physical GPU (device: 3, name: GeForce GTX 1080 Ti, pci bus id: 0000:0a:00.0, compute capability: 6.1)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 17386783839364822905
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 10259070976
locality {
  bus_id: 1
  links {
    link {
      device_id: 1
      type: "StreamExecutor"
      strength: 1
    }
    link {
      device_id: 2
      type: "StreamExecutor"
      strength: 1
    }
    link {
      device_id: 3
      type: "StreamExecutor"
      strength: 1
    }
  }
}
incarnation: 381639879118345626
physical_device_desc: "device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:05:00.0, compute capability: 6.1"
, name: "/device:GPU:1"
device_type: "GPU"
memory_limit: 10919205274
locality {
  bus_id: 1
  links {
    link {
      type: "StreamExecutor"
      strength: 1
    }
    link {
      device_id: 2
      type: "StreamExecutor"
      strength: 1
    }
    link {
      device_id: 3
      type: "StreamExecutor"
      strength: 1
    }
  }
}
incarnation: 4242073010359048695
physical_device_desc: "device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:06:00.0, compute capability: 6.1"
, name: "/device:GPU:2"
device_type: "GPU"
memory_limit: 10919205274
locality {
  bus_id: 1
  links {
    link {
      type: "StreamExecutor"
      strength: 1
    }
    link {
      device_id: 1
      type: "StreamExecutor"
      strength: 1
    }
    link {
      device_id: 3
      type: "StreamExecutor"
      strength: 1
    }
  }
}
incarnation: 8306542693356065997
physical_device_desc: "device: 2, name: GeForce GTX 1080 Ti, pci bus id: 0000:09:00.0, compute capability: 6.1"
, name: "/device:GPU:3"
device_type: "GPU"
memory_limit: 10919205274
locality {
  bus_id: 1
  links {
    link {
      type: "StreamExecutor"
      strength: 1
    }
    link {
      device_id: 1
      type: "StreamExecutor"
      strength: 1
    }
    link {
      device_id: 2
      type: "StreamExecutor"
      strength: 1
    }
  }
}
incarnation: 5522832392138685792
physical_device_desc: "device: 3, name: GeForce GTX 1080 Ti, pci bus id: 0000:0a:00.0, compute capability: 6.1"
]

ちょっと警告メッセージも出ましたが、GPUデバイスがtensorflowに認識されていることが確認できました。

では、ここまで構築したdockerコンテナの環境をイメージに固定します。

# exit #(dockerから)
$ sudo docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
c4e6d6f6990f        pylearn2-gpu        "/bin/bash"         17 hours ago        Exited (0) 5 seconds ago                       competent_zhukovsky

$ sudo docker commit c4e6d6f6990f pylearn2-gpu:latest
sha256:1f29beacea2e577021e46f8c41ba9f3ca5204da36a9c4a16c951f53d9ebfdd9d

$ sudo docker images | grep pylearn2
pylearn2-gpu        latest              1f29beacea2e        33 seconds ago      9.48GB
pylearn2            latest              b4f652f793bf        3 days ago          1.07GB

これでtensorflow-gpuが動作するpylearn2-gpuイメージを作成できました。
今後、このイメージには

$ sudo docker run --runtime=nvidia -i -t -v $HOME:$HOME -p 6006:6006 -p 8888:8888 \
-e LC_CTYPE="C.UTF-8" -e MPLBACKEND="agg" pylearn2-gpu /bin/bash

# -p 6006:6006はTensorBoardのデフォルトポートのフォワーディング
# -p 8888:8888はJupyterのデフォルトポートのフォワーディング
# LC_CTYPEの設定はPythonのUnicodeエラー防止のため
# MPLBACKENDはMatplotlibのX関係のエラー防止のため

でコンテナを立ち上げて使用することができます。

今回達成したこと

  • Jupyter NotebookとTensorFlowをdocker環境に導入しました。
  • GPUマシンではnvidia-dockerを使ってホスト環境を汚さずにGPUを使った機械学習勉強用環境を構築できました。

参考文献

  1. クジラ飛行机, Pythonによるスクレイピング&機械学習[開発テクニック], ソシム株式会社, 2016
  2. nvidia-docker公式リポジトリ: https://github.com/NVIDIA/nvidia-docker