Help us understand the problem. What is going on with this article?

Tensorflowのdockerを使ってみる(macOS)

初めてdockerを使った時のメモ(初心者向け)。docker hubで配布されているdockerの中身は使ってみないとよくわからないので、Tensorflowのdocker環境についてもメモ。Tensorflowの公式ページで配布(リンク)されているdockerイメージを使ってみた。(2018/11/24現在)
Tensorflow 2.0 Alpha版向けに更新。(2019/3/9)

動作環境

ホスト側はmacOS High Sierra。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G65

1. dockerのインストール

dockerのホームページからDocker.dmgをダウンロードする。このときdocker storeのアカウントを作る必要があったので作ってからダウンロード。dmgを開いてApplicationフォルダに移動してインストール。Docker.appを起動する。メニューバーにクジラのアイコンが出て、dockerコマンドが使えるようになる。

$ docker -v
Docker version 18.09.0, build 4d60db4

(補足)デフォルトではメモリを2GB割り当てるようになっている。Tensorflowを使って学習させると、2GBでは不足するので、メニューバーのクジラアイコンから"Preferences..."→"Advanced"→"Memory"で割り当てを増やしておくと良い。CPUの割り当て数も適宜変更する。

2. Tensorflowのdockerを動かす。

2-1. dockerの起動

Tensorflowの公式ページを参考にdockerを起動してみる。

$ docker pull tensorflow/tensorflow #最新イメージをダウンロード
$ docker run -it -p 8081:8888 tensorflow/tensorflow # Start a Jupyter notebook server

Tensorflow 2.0 Alphaを使うときは、

$ docker pull tensorflow/tensorflow:2.0.0a0-py3-jupyter
$ docker run -it -p 8081:8888 tensorflow/tensorflow:2.0.0a0-py3-jupyter

とする。

起動すると以下のように表示される。

[I 02:13:21.486 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[I 02:13:21.505 NotebookApp] Serving notebooks from local directory: /notebooks
[I 02:13:21.505 NotebookApp] The Jupyter Notebook is running at:
[I 02:13:21.505 NotebookApp] http://(19d9db677fef or 127.0.0.1):8888/?token=745afa5eb731b6d826ab65eca9475115b303cb8f5f6403c4
[I 02:13:21.505 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 02:13:21.506 NotebookApp] 

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://(19d9db677fef or 127.0.0.1):8888/?token=745afa5eb731b6d826ab65eca9475115b303cb8f5f6403c4

これでjupyterが動いたので、Safariから、
http://localhost:8081/
にアクセスしてみる。docker run -it -p 8081:8888 tensorflow/tensorflow としたので、8081ポートからアクセスする。Macでもjupyterを稼働していたので変更した。Password or token: を聞かれるので、runした時に表示されていたtoken=745afa5eb731b6d826ab65eca9475115b303cb8f5f6403c4を入れて、アクセスする。
jupyter.png

Tensorflowのバージョンを確認すると、1.12.0(Tensorflow 2.0 Alphaの場合は 2.0.0-alpha0)だった。

import tensorflow as tf
print(tf.__version__)

2-2. dockerの端末で作業する

2-2-1. dockerの状態を確認する

dockerの起動で一つのターミナルが使われている(runコマンドのデフォルトではフォアグラウンドで動作する)ので、もう一つターミナルを開いて、稼働中のコンテナの状況を確認する。

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                              NAMES
19d9db677fef        tensorflow/tensorflow   "/run_jupyter.sh --a…"   10 minutes ago      Up 10 minutes       6006/tcp, 0.0.0.0:8081->8888/tcp   gallant_nobel

ここで表示されるgallant_nobelというコンテナ名を使う。最初にrunする時に名前を--nameで指定しない時は、勝手に名前がつけられる。今回はgallant_nobelという名前になった。

2-2-2. dockerの端末にログインする

dockerで作業をするため、bashでdockerに入る。

$ docker exec -it gallant_nobel bash

OSを確認する。Tensorflowの提供しているdockerのOSはUbuntu 16.04だった。

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"

python2で実行することが想定されている。docker hubのDescriptionを見ると、 docker runするときに -py3オプションをつけると、Python 3.5がデフォルトとなる様子。

# python --version
Python 2.7.12
# pip list
Package                            Version    
---------------------------------- -----------
absl-py                            0.6.1      
astor                              0.7.1      
backports-abc                      0.5        
backports.functools-lru-cache      1.5        
backports.shutil-get-terminal-size 1.0.0      
backports.weakref                  1.0.post1  
bleach                             3.0.2      
configparser                       3.5.0      
cycler                             0.10.0     
decorator                          4.3.0      
defusedxml                         0.5.0      
entrypoints                        0.2.3      
enum34                             1.1.6      
funcsigs                           1.0.2      
functools32                        3.2.3.post2
futures                            3.2.0      
gast                               0.2.0      
grpcio                             1.16.0     
h5py                               2.8.0      
ipaddress                          1.0.22     
ipykernel                          4.10.0     
ipython                            5.8.0      
ipython-genutils                   0.2.0      
ipywidgets                         7.4.2      
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      
Keras-Applications                 1.0.6      
Keras-Preprocessing                1.0.5      
kiwisolver                         1.0.1      
Markdown                           3.0.1      
MarkupSafe                         1.1.0      
matplotlib                         2.2.3      
mistune                            0.8.4      
mock                               2.0.0      
nbconvert                          5.4.0      
nbformat                           4.4.0      
notebook                           5.7.0      
numpy                              1.15.4     
pandas                             0.23.4     
pandocfilters                      1.4.2      
pathlib2                           2.3.2      
pbr                                5.1.0      
pexpect                            4.6.0      
pickleshare                        0.7.5      
Pillow                             5.3.0      
pip                                18.1       
prometheus-client                  0.4.2      
prompt-toolkit                     1.0.15     
protobuf                           3.6.1      
ptyprocess                         0.6.0      
Pygments                           2.2.0      
pyparsing                          2.3.0      
python-dateutil                    2.7.5      
pytz                               2018.7     
pyzmq                              17.1.2     
qtconsole                          4.4.2      
scandir                            1.9.0      
scikit-learn                       0.20.0     
scipy                              1.1.0      
Send2Trash                         1.5.0      
setuptools                         40.5.0     
simplegeneric                      0.8.1      
singledispatch                     3.4.0.3    
six                                1.11.0     
sklearn                            0.0        
subprocess32                       3.5.3      
tensorboard                        1.12.0     
tensorflow                         1.12.0     
termcolor                          1.1.0      
terminado                          0.8.1      
testpath                           0.4.2      
tornado                            5.1.1      
traitlets                          4.3.2      
wcwidth                            0.1.7      
webencodings                       0.5.1      
Werkzeug                           0.14.1     
wheel                              0.32.2     
widgetsnbextension                 3.4.2
# apt list
Listing... Done
adduser/now 3.113+nmu3ubuntu4 all [installed,local]
apt/now 1.2.27 amd64 [installed,local]
base-files/now 9.4ubuntu4.7 amd64 [installed,local]
base-passwd/now 3.5.39 amd64 [installed,local]
bash/now 4.3-14ubuntu1.2 amd64 [installed,local]
binutils/now 2.26.1-1ubuntu1~16.04.7 amd64 [installed,local]
bsdutils/now 1:2.27.1-6ubuntu3.6 amd64 [installed,local]
build-essential/now 12.1ubuntu2 amd64 [installed,local]
bzip2/now 1.0.6-8 amd64 [installed,local]
ca-certificates/now 20170717~16.04.1 all [installed,local]
coreutils/now 8.25-2ubuntu3~16.04 amd64 [installed,local]
cpp/now 4:5.3.1-1ubuntu1 amd64 [installed,local]
cpp-5/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
curl/now 7.47.0-1ubuntu2.11 amd64 [installed,local]
dash/now 0.5.8-2.1ubuntu2 amd64 [installed,local]
debconf/now 1.5.58ubuntu1 all [installed,local]
debianutils/now 4.7 amd64 [installed,local]
dh-python/now 2.20151103ubuntu1.1 all [installed,local]
diffutils/now 1:3.3-3 amd64 [installed,local]
distro-info-data/now 0.28ubuntu0.9 all [installed,local]
dpkg/now 1.18.4ubuntu1.4 amd64 [installed,local]
dpkg-dev/now 1.18.4ubuntu1.5 all [installed,local]
e2fslibs/now 1.42.13-1ubuntu1 amd64 [installed,local]
e2fsprogs/now 1.42.13-1ubuntu1 amd64 [installed,local]
findutils/now 4.6.0+git+20160126-2 amd64 [installed,local]
g++/now 4:5.3.1-1ubuntu1 amd64 [installed,local]
g++-5/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
gcc/now 4:5.3.1-1ubuntu1 amd64 [installed,local]
gcc-5/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
gcc-5-base/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
gcc-6-base/now 6.0.1-0ubuntu1 amd64 [installed,local]
gir1.2-glib-2.0/now 1.46.0-3ubuntu1 amd64 [installed,local]
gnupg/now 1.4.20-1ubuntu3.3 amd64 [installed,local]
gpgv/now 1.4.20-1ubuntu3.3 amd64 [installed,local]
grep/now 2.25-1~16.04.1 amd64 [installed,local]
gzip/now 1.6-4ubuntu1 amd64 [installed,local]
hdf5-helpers/now 1.8.16+docs-4ubuntu1.1 amd64 [installed,local]
hostname/now 3.16ubuntu2 amd64 [installed,local]
init/now 1.29ubuntu4 amd64 [installed,local]
init-system-helpers/now 1.29ubuntu4 all [installed,local]
initscripts/now 2.88dsf-59.3ubuntu2 amd64 [installed,local]
insserv/now 1.14.0-5ubuntu3 amd64 [installed,local]
iso-codes/now 3.65-1 all [installed,local]
libacl1/now 2.2.52-3 amd64 [installed,local]
libaec-dev/now 0.3.2-1 amd64 [installed,local]
libaec0/now 0.3.2-1 amd64 [installed,local]
libapparmor1/now 2.10.95-0ubuntu2.10 amd64 [installed,local]
libapt-inst2.0/now 1.2.29 amd64 [installed,local]
libapt-pkg5.0/now 1.2.27 amd64 [installed,local]
libasan2/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libasn1-8-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
libatomic1/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libattr1/now 1:2.4.47-2 amd64 [installed,local]
libaudit-common/now 1:2.4.5-1ubuntu2.1 all [installed,local]
libaudit1/now 1:2.4.5-1ubuntu2.1 amd64 [installed,local]
libblkid1/now 2.27.1-6ubuntu3.6 amd64 [installed,local]
libbz2-1.0/now 1.0.6-8 amd64 [installed,local]
libc-bin/now 2.23-0ubuntu10 amd64 [installed,local]
libc-dev-bin/now 2.23-0ubuntu10 amd64 [installed,local]
libc6/now 2.23-0ubuntu10 amd64 [installed,local]
libc6-dev/now 2.23-0ubuntu10 amd64 [installed,local]
libcap2/now 1:2.24-12 amd64 [installed,local]
libcap2-bin/now 1:2.24-12 amd64 [installed,local]
libcc1-0/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libcilkrts5/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libcomerr2/now 1.42.13-1ubuntu1 amd64 [installed,local]
libcryptsetup4/now 2:1.6.6-5ubuntu2.1 amd64 [installed,local]
libcurl3-gnutls/now 7.47.0-1ubuntu2.11 amd64 [installed,local]
libdb5.3/now 5.3.28-11ubuntu0.1 amd64 [installed,local]
libdbus-1-3/now 1.10.6-1ubuntu3.3 amd64 [installed,local]
libdbus-glib-1-2/now 0.106-1 amd64 [installed,local]
libdebconfclient0/now 0.198ubuntu1 amd64 [installed,local]
libdevmapper1.02.1/now 2:1.02.110-1ubuntu10 amd64 [installed,local]
libdpkg-perl/now 1.18.4ubuntu1.5 all [installed,local]
libexpat1/now 2.1.0-7ubuntu0.16.04.3 amd64 [installed,local]
libexpat1-dev/now 2.1.0-7ubuntu0.16.04.3 amd64 [installed,local]
libfdisk1/now 2.27.1-6ubuntu3.6 amd64 [installed,local]
libffi6/now 3.2.1-4 amd64 [installed,local]
libfreetype6/now 2.6.1-0.1ubuntu2.3 amd64 [installed,local]
libfreetype6-dev/now 2.6.1-0.1ubuntu2.3 amd64 [installed,local]
libgcc-5-dev/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libgcc1/now 1:6.0.1-0ubuntu1 amd64 [installed,local]
libgcrypt20/now 1.6.5-2ubuntu0.5 amd64 [installed,local]
libgdbm3/now 1.8.3-13.1 amd64 [installed,local]
libgfortran3/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libgirepository-1.0-1/now 1.46.0-3ubuntu1 amd64 [installed,local]
libglib2.0-0/now 2.48.2-0ubuntu4.1 amd64 [installed,local]
libgmp10/now 2:6.1.0+dfsg-2 amd64 [installed,local]
libgnutls30/now 3.4.10-4ubuntu1.4 amd64 [installed,local]
libgomp1/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libgpg-error0/now 1.21-2ubuntu1 amd64 [installed,local]
libgssapi-krb5-2/now 1.13.2+dfsg-5ubuntu2 amd64 [installed,local]
libgssapi3-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
libhcrypto4-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
libhdf5-10/now 1.8.16+docs-4ubuntu1.1 amd64 [installed,local]
libhdf5-cpp-11/now 1.8.16+docs-4ubuntu1.1 amd64 [installed,local]
libhdf5-dev/now 1.8.16+docs-4ubuntu1.1 amd64 [installed,local]
libhdf5-serial-dev/now 1.8.16+docs-4ubuntu1.1 all [installed,local]
libheimbase1-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
libheimntlm0-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
libhogweed4/now 3.2-1ubuntu0.16.04.1 amd64 [installed,local]
libhx509-5-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
libidn11/now 1.32-3ubuntu1.2 amd64 [installed,local]
libisl15/now 0.16.1-1 amd64 [installed,local]
libitm1/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libjpeg-dev/now 8c-2ubuntu8 amd64 [installed,local]
libjpeg-turbo8/now 1.4.2-0ubuntu3.1 amd64 [installed,local]
libjpeg-turbo8-dev/now 1.4.2-0ubuntu3.1 amd64 [installed,local]
libjpeg8/now 8c-2ubuntu8 amd64 [installed,local]
libjpeg8-dev/now 8c-2ubuntu8 amd64 [installed,local]
libk5crypto3/now 1.13.2+dfsg-5ubuntu2 amd64 [installed,local]
libkeyutils1/now 1.5.9-8ubuntu1 amd64 [installed,local]
libkmod2/now 22-1ubuntu5 amd64 [installed,local]
libkrb5-26-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
libkrb5-3/now 1.13.2+dfsg-5ubuntu2 amd64 [installed,local]
libkrb5support0/now 1.13.2+dfsg-5ubuntu2 amd64 [installed,local]
libldap-2.4-2/now 2.4.42+dfsg-2ubuntu3.3 amd64 [installed,local]
liblsan0/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
liblz4-1/now 0.0~r131-2ubuntu2 amd64 [installed,local]
liblzma5/now 5.1.1alpha+20120614-2ubuntu2 amd64 [installed,local]
libmount1/now 2.27.1-6ubuntu3.6 amd64 [installed,local]
libmpc3/now 1.0.3-1 amd64 [installed,local]
libmpdec2/now 2.4.2-1 amd64 [installed,local]
libmpfr4/now 3.1.4-1 amd64 [installed,local]
libmpx0/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libncurses5/now 6.0+20160213-1ubuntu1 amd64 [installed,local]
libncursesw5/now 6.0+20160213-1ubuntu1 amd64 [installed,local]
libnettle6/now 3.2-1ubuntu0.16.04.1 amd64 [installed,local]
libp11-kit0/now 0.23.2-5~ubuntu16.04.1 amd64 [installed,local]
libpam-modules/now 1.1.8-3.2ubuntu2.1 amd64 [installed,local]
libpam-modules-bin/now 1.1.8-3.2ubuntu2.1 amd64 [installed,local]
libpam-runtime/now 1.1.8-3.2ubuntu2.1 all [installed,local]
libpam0g/now 1.1.8-3.2ubuntu2.1 amd64 [installed,local]
libpcre3/now 2:8.38-3.1 amd64 [installed,local]
libperl5.22/now 5.22.1-9ubuntu0.5 amd64 [installed,local]
libpng12-0/now 1.2.54-1ubuntu1.1 amd64 [installed,local]
libpng12-dev/now 1.2.54-1ubuntu1.1 amd64 [installed,local]
libpopt0/now 1.16-10 amd64 [installed,local]
libprocps4/now 2:3.3.10-4ubuntu2.4 amd64 [installed,local]
libpython-dev/now 2.7.12-1~16.04 amd64 [installed,local]
libpython-stdlib/now 2.7.12-1~16.04 amd64 [installed,local]
libpython2.7/now 2.7.12-1ubuntu0~16.04.3 amd64 [installed,local]
libpython2.7-dev/now 2.7.12-1ubuntu0~16.04.3 amd64 [installed,local]
libpython2.7-minimal/now 2.7.12-1ubuntu0~16.04.3 amd64 [installed,local]
libpython2.7-stdlib/now 2.7.12-1ubuntu0~16.04.3 amd64 [installed,local]
libpython3-stdlib/now 3.5.1-3 amd64 [installed,local]
libpython3.5-minimal/now 3.5.2-2ubuntu0~16.04.4 amd64 [installed,local]
libpython3.5-stdlib/now 3.5.2-2ubuntu0~16.04.4 amd64 [installed,local]
libquadmath0/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libreadline6/now 6.3-8ubuntu2 amd64 [installed,local]
libroken18-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
librtmp1/now 2.4+20151223.gitfa8646d-1ubuntu0.1 amd64 [installed,local]
libsasl2-2/now 2.1.26.dfsg1-14build1 amd64 [installed,local]
libsasl2-modules-db/now 2.1.26.dfsg1-14build1 amd64 [installed,local]
libseccomp2/now 2.3.1-2.1ubuntu2~16.04.1 amd64 [installed,local]
libselinux1/now 2.4-3build2 amd64 [installed,local]
libsemanage-common/now 2.3-1build3 all [installed,local]
libsemanage1/now 2.3-1build3 amd64 [installed,local]
libsepol1/now 2.4-2 amd64 [installed,local]
libsmartcols1/now 2.27.1-6ubuntu3.6 amd64 [installed,local]
libsodium18/now 1.0.8-5 amd64 [installed,local]
libsqlite3-0/now 3.11.0-1ubuntu1 amd64 [installed,local]
libss2/now 1.42.13-1ubuntu1 amd64 [installed,local]
libssl1.0.0/now 1.0.2g-1ubuntu4.13 amd64 [installed,local]
libstdc++-5-dev/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libstdc++6/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libsystemd0/now 229-4ubuntu21.4 amd64 [installed,local]
libsz2/now 0.3.2-1 amd64 [installed,local]
libtasn1-6/now 4.7-3ubuntu0.16.04.3 amd64 [installed,local]
libtinfo5/now 6.0+20160213-1ubuntu1 amd64 [installed,local]
libtsan0/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libubsan0/now 5.4.0-6ubuntu1~16.04.10 amd64 [installed,local]
libudev1/now 229-4ubuntu21.4 amd64 [installed,local]
libusb-0.1-4/now 2:0.1.12-28 amd64 [installed,local]
libustr-1.0-1/now 1.0.4-5 amd64 [installed,local]
libuuid1/now 2.27.1-6ubuntu3.6 amd64 [installed,local]
libwind0-heimdal/now 1.7~git20150920+dfsg-4ubuntu1.16.04.1 amd64 [installed,local]
libzmq3-dev/now 4.1.4-7 amd64 [installed,local]
libzmq5/now 4.1.4-7 amd64 [installed,local]
linux-libc-dev/now 4.4.0-138.164 amd64 [installed,local]
login/now 1:4.2-3.1ubuntu5.3 amd64 [installed,local]
lsb-base/now 9.20160110ubuntu0.2 all [installed,local]
lsb-release/now 9.20160110ubuntu0.2 all [installed,local]
make/now 4.1-6 amd64 [installed,local]
makedev/now 2.3.1-93ubuntu2~ubuntu16.04.1 all [installed,local]
mawk/now 1.3.3-17ubuntu2 amd64 [installed,local]
mime-support/now 3.59ubuntu1 all [installed,local]
mount/now 2.27.1-6ubuntu3.6 amd64 [installed,local]
multiarch-support/now 2.23-0ubuntu10 amd64 [installed,local]
ncurses-base/now 6.0+20160213-1ubuntu1 all [installed,local]
ncurses-bin/now 6.0+20160213-1ubuntu1 amd64 [installed,local]
openssl/now 1.0.2g-1ubuntu4.13 amd64 [installed,local]
passwd/now 1:4.2-3.1ubuntu5.3 amd64 [installed,local]
patch/now 2.7.5-1ubuntu0.16.04.1 amd64 [installed,local]
perl/now 5.22.1-9ubuntu0.5 amd64 [installed,local]
perl-base/now 5.22.1-9ubuntu0.5 amd64 [installed,local]
perl-modules-5.22/now 5.22.1-9ubuntu0.5 all [installed,local]
pkg-config/now 0.29.1-0ubuntu1 amd64 [installed,local]
procps/now 2:3.3.10-4ubuntu2.4 amd64 [installed,local]
python/now 2.7.12-1~16.04 amd64 [installed,local]
python-apt-common/now 1.1.0~beta1ubuntu0.16.04.2 all [installed,local]
python-dev/now 2.7.12-1~16.04 amd64 [installed,local]
python-minimal/now 2.7.12-1~16.04 amd64 [installed,local]
python2.7/now 2.7.12-1ubuntu0~16.04.3 amd64 [installed,local]
python2.7-dev/now 2.7.12-1ubuntu0~16.04.3 amd64 [installed,local]
python2.7-minimal/now 2.7.12-1ubuntu0~16.04.3 amd64 [installed,local]
python3/now 3.5.1-3 amd64 [installed,local]
python3-apt/now 1.1.0~beta1ubuntu0.16.04.2 amd64 [installed,local]
python3-dbus/now 1.2.0-3 amd64 [installed,local]
python3-gi/now 3.20.0-0ubuntu1 amd64 [installed,local]
python3-minimal/now 3.5.1-3 amd64 [installed,local]
python3-pycurl/now 7.43.0-1ubuntu1 amd64 [installed,local]
python3-software-properties/now 0.96.20.7 all [installed,local]
python3.5/now 3.5.2-2ubuntu0~16.04.4 amd64 [installed,local]
python3.5-minimal/now 3.5.2-2ubuntu0~16.04.4 amd64 [installed,local]
readline-common/now 6.3-8ubuntu2 all [installed,local]
rsync/now 3.1.1-3ubuntu1.2 amd64 [installed,local]
sed/now 4.2.2-7 amd64 [installed,local]
sensible-utils/now 0.0.9ubuntu0.16.04.1 all [installed,local]
software-properties-common/now 0.96.20.7 all [installed,local]
systemd/now 229-4ubuntu21.4 amd64 [installed,local]
systemd-sysv/now 229-4ubuntu21.4 amd64 [installed,local]
sysv-rc/now 2.88dsf-59.3ubuntu2 all [installed,local]
sysvinit-utils/now 2.88dsf-59.3ubuntu2 amd64 [installed,local]
tar/now 1.28-2.1ubuntu0.1 amd64 [installed,local]
ubuntu-keyring/now 2012.05.19 all [installed,local]
unzip/now 6.0-20ubuntu1 amd64 [installed,local]
util-linux/now 2.27.1-6ubuntu3.6 amd64 [installed,local]
xz-utils/now 5.1.1alpha+20120614-2ubuntu2 amd64 [installed,local]
zlib1g/now 1:1.2.8.dfsg-2ubuntu4.1 amd64 [installed,local]
zlib1g-dev/now 1:1.2.8.dfsg-2ubuntu4.1 amd64 [installed,local]
余談:dockerでGPUを使う

TensorflowはGPUとともに使うことが多く、tensorflowのdockerでは-gpuを設定してdocker runする必要があるが、その場合はnvidia-dockerが必要となる。macOS(High Sierra, 10.13.6)ではnVidiaのGPUが正式サポートされておらず、Windowsではnvidia-dockerが使えないことから、結局、dockerの場合はホストOSにUbuntuなどLinux系を使わないとGPUが使えない。macOSやWindows上で、CPUベースでのTensorflowを使った動作確認する程度であれば、dockerは便利かもしれない。TensorflowをGPU有効にして使う場合は、Windowsの場合はGPU対応されているNativeなTensorflowを使う必要がある。macOSは今のところGPUを使った機械学習には不利な印象。

余談:macOSでGPUを使う(Intel:PlaidMLとAMD:ROCm

macOSではiGPUとしてIntelのGPU、dGPUとしてAMDのGPUのサポートがされているため、これらを使う方法が考えられる。AMDではROCmとよばれる仕組みがサポートされており、これがnVidiaのCUDAに相当する。CUDAを使ったtensorflow-gpuと同様に、ROCmを使ったtensorflow-rocmが用意されている。しかし、ROCmはUbuntuなどLinux系のみの対応であり、macOSでは使えない。一方、macOSでGPUを使う方法としてIntel(旧Vertex.ai)のPlaidMLを使う方法がある。Kerasのバックエンドを置き換える形(pythonのコードで、os.environ["KERAS_BACKEND"] = "plaidml.keras.backend"import keras の前に設定するとKerasのバックエンドがデフォルトのTensorflowから置換)で容易に利用できる。今のところ、公式(?)にmacOSでGPUに対応する唯一の方法かもしれない。また、Windowsを含めて内蔵GPUを使う方法としてもplaidMLは有効と思われる。Intelの傘下となり、今後の発展に期待。

2-2-3. dockerの端末を環境設定する(OpenCVのセットアップ)

dockerの中で作業する。
デフォルトではOpenCVが使えなかったので、インストールする。

# apt update
# apt install -y libsm6 libxext6 libxrender-dev python-pip python3-pip
# pip install opencv-python
# pip3 install opencv-python
余談:Dockerfileを使う

dockerのセットアップはDockerfileという名前のファイルにスクリプトとして書いてもセットアップできる。Dockerfileを使う場合は、以下のようなDockerfileを用意して、docker build -t tf:1 .のように呼び出して(同じフォルダ"."にDockefileを置く)、イメージ"tf:1"を作る。docker run -it -p 8081:8888 tf:1 のようにして起動できる。Dockerfileは他人の作業内容を知る上で便利。ただ、 FROM ubuntu:xenial などベーシックなものをベースにしないと、結局どんな環境設定がされているのかわからないという印象。

Dockefile
FROM tensorflow/tensorflow
RUN apt update && apt install -y libsm6 libxext6 libxrender-dev python-pip python3-pip
RUN pip install opencv-python
RUN pip3 install opencv-python

2-3. dockerを終了する

dockerの端末での作業を終える。

# exit

dockerを終了する。

$ docker stop gallant_nobel

2-4. 再びdockerで作業を行う

環境を保存して、再度実行させるには、作業したコンテナを利用すれば良い。
再度、dockerのコンテナを起動して、jupyterのtokenを知る。

$ docker start gallant_nobel
$ docker exec -it gallant_nobel bash

もしも、最初のコマンドと同じように
$ docker run -it -p 8081:8888 tensorflow/tensorflow
とすると、履歴は保存されていない新しいコンテナができる。
生成された全てのコンテナを知るには以下のコマンド(ps -a)でわかる。

$ docker ps -a
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                       PORTS                              NAMES
63ec4be10dd6        tensorflow/tensorflow   "/run_jupyter.sh --a…"   34 minutes ago      Exited (137) 9 minutes ago                                      sleepy_pascal
19d9db677fef        tensorflow/tensorflow   "/run_jupyter.sh --a…"   8 hours ago         Up 8 minutes                 6006/tcp, 0.0.0.0:8081->8888/tcp   gallant_nobel

不要なコンテナ(ここではCONTAINER ID=63ec4be10dd6)は、コンテナ名(sleepy_pascal)を使って、

$ docker rm sleepy_pascal

で削除できる。

3. コンテナを保存して別のマシンで動作させる

3-1. コンテナを停止する

$ docker stop gallant_nobel

3-2. イメージを作成する

ここでは、"gallant:0.0"という名前でイメージを作る。

$ docker commit -m "Test" gallant_nobel gallant:0.0

Macに保存されているイメージはdocker imagesでわかる。

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
gallant                 0.0                 67e9ba8e53c8        9 seconds ago       1.37GB
tensorflow/tensorflow   latest              2054925f3b43        2 weeks ago         1.34GB

3-3. イメージをファイルに保存する

以下のコマンドでimageを"~/gallant.tar.gz"に保存する。

$ docker save gallant:0.0 > ~/gallant.tar.gz

3-4. イメージをファイルからロードする

別のマシンにgallant.tar.gzをコピーして、以下のコマンドでrunさせる。
ここでは一旦イメージを削除して、ロードしてみる。

$ docker rmi gallant:0.0 #削除
$ docker images #削除されたことを確認
$ docker load < gallant.tar.gz #ロード
$ docker images #追加されたことを確認

3-5. イメージから起動する

最初にTensorflowのdockerを起動した時と同様に、runで起動する。今回は、gallantという名前をつけてコンテナを作る。また、-dオプションをつけてバックグラウンドで起動させる。

$ docker run --name gallant -it -d -p 8081:8888 gallant:0.0 # Start a Jupyter notebook server

psコマンドで起動中のコンテナを確認すると、gallantが動作していることがわかる。

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                              NAMES
de4373702c8a        gallant:0.0             "/run_jupyter.sh --a…"   24 seconds ago      Up 22 seconds       6006/tcp, 0.0.0.0:8081->8888/tcp   gallant

あとは上述のexecコマンド(docker exec -it gallant bash)で端末での作業を継続できる。

まとめ

Tensorflowのサイトにあるdockerを使って、Jupyterでの動作環境を構築した。OpenCVを使えるように設定し、docker imageを作成して保存した。他のマシンでも使えるようにimageをファイルとして出力し、そのファイルを用いてロード、開発環境を再現できることを確認した。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away