(20201014 作業メモ) 種々の環境を docker で一台のパソコンに集約する

14 10月

機械学習を学び始めた頃、CUPY を使って計算していたのですが、この環境を docker で再現したいと思います。複数のパソコンに散らばったコードを実行環境もろとも一台に集約したい。docker に詳しいわけではありません。とりあえず、試行錯誤を記録していきます。

コードを書くのは jupyter で、実行は端末からする感じでどうかと思います(20201019 今のところ実行も jupyter です)。CUPY がインストール済みで、jupyter が利用できるような環境も、すでに誰かが作っているのかも。

まずは、このサイトを見ながら、コンテナを起動してみます。

docker run --gpus all -it tensorflow/tensorflow:latest-gpu bash

bash が起動して来るわけですが、こんな画面です。

pip が入っていたので、pip list と打ってみました。

root@1b66aad56ea9:/# pip list
Package                Version
---------------------- ---------------
absl-py                0.10.0
aiohttp                3.6.2
asn1crypto             0.24.0
astunparse             1.6.3
async-timeout          3.0.1
attrs                  20.2.0
cachetools             4.1.1
certifi                2020.6.20
chardet                3.0.4
cryptography           2.1.4
gast                   0.3.3
google-auth            1.22.0
google-auth-oauthlib   0.4.1
google-pasta           0.2.0
grpcio                 1.32.0
h5py                   2.10.0
idna                   2.6
idna-ssl               1.1.0
importlib-metadata     2.0.0
Keras-Preprocessing    1.1.2
keyring                10.6.0
keyrings.alt           3.0
Markdown               3.2.2
multidict              4.7.6
numpy                  1.18.5
oauthlib               3.1.0
opt-einsum             3.3.0
pip                    20.2.3
protobuf               3.13.0
pyasn1                 0.4.8
pyasn1-modules         0.2.8
pycrypto               2.6.1
pygobject              3.26.1
python-apt             1.6.5+ubuntu0.3
pyxdg                  0.25
requests               2.24.0
requests-oauthlib      1.3.0
rsa                    4.6
SecretStorage          2.3.1
setuptools             50.3.0
six                    1.15.0
tensorboard            2.3.0
tensorboard-plugin-wit 1.7.0
tensorflow-estimator   2.3.0
tensorflow-gpu         2.3.1
termcolor              1.1.0
typing-extensions      3.7.4.3
urllib3                1.25.10
Werkzeug               1.0.1
wheel                  0.30.0
wrapt                  1.12.1
yarl                   1.6.0
zipp                   3.2.0
root@1b66aad56ea9:/# 

CUPY や matplotlib とか欲しい。インストールしてみました。

pip install matplotlib
Collecting matplotlib
  Downloading matplotlib-3.3.2-cp36-cp36m-manylinux1_x86_64.whl (11.6 MB)
     |████████████████████████████████| 11.6 MB 12.2 MB/s 
Requirement already satisfied: certifi>=2020.06.20 in /usr/local/lib/python3.6/dist-packages (from matplotlib) (2020.6.20)
Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.6/dist-packages (from matplotlib) (1.18.5)
Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3
  Downloading pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
     |████████████████████████████████| 67 kB 8.3 MB/s 
Collecting python-dateutil>=2.1
  Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
     |████████████████████████████████| 227 kB 11.1 MB/s 
Collecting pillow>=6.2.0
  Downloading Pillow-8.0.0-cp36-cp36m-manylinux1_x86_64.whl (2.2 MB)
     |████████████████████████████████| 2.2 MB 13.2 MB/s 
Collecting kiwisolver>=1.0.1
  Downloading kiwisolver-1.2.0-cp36-cp36m-manylinux1_x86_64.whl (88 kB)
     |████████████████████████████████| 88 kB 9.5 MB/s 
Collecting cycler>=0.10
  Downloading cycler-0.10.0-py2.py3-none-any.whl (6.5 kB)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.1->matplotlib) (1.15.0)
Installing collected packages: pyparsing, python-dateutil, pillow, kiwisolver, cycler, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.2.0 matplotlib-3.3.2 pillow-8.0.0 pyparsing-2.4.7 python-dateutil-2.8.1

普通に入ります。pip list の出力です。冗長ですがそのまま。

pip list
Package                Version
---------------------- ---------------
absl-py                0.10.0
aiohttp                3.6.2
asn1crypto             0.24.0
astunparse             1.6.3
async-timeout          3.0.1
attrs                  20.2.0
cachetools             4.1.1
certifi                2020.6.20
chardet                3.0.4
cryptography           2.1.4
cycler                 0.10.0
gast                   0.3.3
google-auth            1.22.0
google-auth-oauthlib   0.4.1
google-pasta           0.2.0
grpcio                 1.32.0
h5py                   2.10.0
idna                   2.6
idna-ssl               1.1.0
importlib-metadata     2.0.0
Keras-Preprocessing    1.1.2
keyring                10.6.0
keyrings.alt           3.0
kiwisolver             1.2.0
Markdown               3.2.2
matplotlib             3.3.2
multidict              4.7.6
numpy                  1.18.5
oauthlib               3.1.0
opt-einsum             3.3.0
Pillow                 8.0.0
pip                    20.2.3
protobuf               3.13.0
pyasn1                 0.4.8
pyasn1-modules         0.2.8
pycrypto               2.6.1
pygobject              3.26.1
pyparsing              2.4.7
python-apt             1.6.5+ubuntu0.3
python-dateutil        2.8.1
pyxdg                  0.25
requests               2.24.0
requests-oauthlib      1.3.0
rsa                    4.6
SecretStorage          2.3.1
setuptools             50.3.0
six                    1.15.0
tensorboard            2.3.0
tensorboard-plugin-wit 1.7.0
tensorflow-estimator   2.3.0
tensorflow-gpu         2.3.1
termcolor              1.1.0
typing-extensions      3.7.4.3
urllib3                1.25.10
Werkzeug               1.0.1
wheel                  0.30.0
wrapt                  1.12.1
yarl                   1.6.0
zipp                   3.2.0

いったん exit で終了する。コンテナの bash から、ホストの bash に移る。

root@1b66aad56ea9:/home# exit
exit
friend@z390:~$ 

コンテナの確認をしてみると、先ほどのコンテナ(1b66aad56ea9)が停止している。

$ docker ps -a
CONTAINER ID        IMAGE                                          COMMAND                  CREATED             STATUS                      PORTS                    NAMES
1b66aad56ea9        tensorflow/tensorflow:latest-gpu               "bash"                   23 hours ago        Exited (0) 15 seconds ago                            objective_galois
41258b29d47d        tensorflow/tensorflow:1.14.0-gpu-py3-jupyter   "bash -c 'source /et…"   12 days ago         Created                     0.0.0.0:8888->8888/tcp   angry_dhawan
9cc4e5d8b261        tensorflow/tensorflow:1.14.0-gpu-py3-jupyter   "bash -c 'source /et…"   3 weeks ago         Exited (0) 2 weeks ago                               frosty_johnson

commit というコマンドがあって、コンテナ起動時の改変を反映させるらしい。適当な名前を付けて、改変を反映させたイメージを作ってみる。

$ docker commit 1b66aad56ea9 tensorflow/tensorflow:latest-gpu-a
sha256:86a7a8a48459a281417804cf539434d90ed348cb5c2838b79ce2ab471c02e1d2

docker イメージのリストをみてみる。

$ docker images
REPOSITORY                  TAG                      IMAGE ID            CREATED             SIZE
tensorflow/tensorflow       latest-gpu-a             86a7a8a48459        15 seconds ago      3.11GB
tensorflow/tensorflow       latest-gpu               8a8486aa1902        2 weeks ago         3.05GB
tensorflow/tensorflow       latest-gpu-jupyter       f0b0261fec71        2 months ago        3.3GB
tensorflow/tensorflow       1.14.0-gpu-py3-jupyter   60c989453335        16 months ago       3.65GB
nvcr.io/nvidia/tensorflow   19.02-py3                a69e20c13cca        20 months ago       6.05GB
nvcr.io/nvidia/tensorflow   18.09-py3                cdb03344e1b3        2 years ago         3.75GB
nvcr.io/nvidia/tensorflow   18.01-py2                377b46c75bfc        2 years ago         2.88GB

新しく、tensorflow/tensorflow:latest-gpu-a が加わっていた。新しいイメージで起動する。

$ docker run --gpus all -it tensorflow/tensorflow:latest-gpu-a bash 

________                               _______________                
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ / 
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


WARNING: You are running this container as root, which can cause new files in
mounted volumes to be created as the root user on your host machine.

To avoid this, run the container by specifying your user's userid:

$ docker run -u $(id -u):$(id -g) args...

pip list で matplotlib があるかどうか確認する。

root@f2f457c86eb7:/# pip list
Package                Version
---------------------- ---------------
absl-py                0.10.0
aiohttp                3.6.2
asn1crypto             0.24.0
astunparse             1.6.3
async-timeout          3.0.1
attrs                  20.2.0
cachetools             4.1.1
certifi                2020.6.20
chardet                3.0.4
cryptography           2.1.4
cycler                 0.10.0
gast                   0.3.3
google-auth            1.22.0
google-auth-oauthlib   0.4.1
google-pasta           0.2.0
grpcio                 1.32.0
h5py                   2.10.0
idna                   2.6
idna-ssl               1.1.0
importlib-metadata     2.0.0
Keras-Preprocessing    1.1.2
keyring                10.6.0
keyrings.alt           3.0
kiwisolver             1.2.0
Markdown               3.2.2
matplotlib             3.3.2
multidict              4.7.6
numpy                  1.18.5
oauthlib               3.1.0
opt-einsum             3.3.0
Pillow                 8.0.0
pip                    20.2.3
protobuf               3.13.0
pyasn1                 0.4.8
pyasn1-modules         0.2.8
pycrypto               2.6.1
pygobject              3.26.1
pyparsing              2.4.7
python-apt             1.6.5+ubuntu0.3
python-dateutil        2.8.1
pyxdg                  0.25
requests               2.24.0
requests-oauthlib      1.3.0
rsa                    4.6
SecretStorage          2.3.1
setuptools             50.3.0
six                    1.15.0
tensorboard            2.3.0
tensorboard-plugin-wit 1.7.0
tensorflow-estimator   2.3.0
tensorflow-gpu         2.3.1
termcolor              1.1.0
typing-extensions      3.7.4.3
urllib3                1.25.10
Werkzeug               1.0.1
wheel                  0.30.0
wrapt                  1.12.1
yarl                   1.6.0
zipp                   3.2.0

確かに反映されていた。他に、pandas, scikit-learn, seaborn, jupyter をインストールした。

次に、jupyter を利用することを考える。新しいイメージで起動する。以前に jupyter 用のイメージを起動するときに port のオプションを付けたので、それを参考にした。

$ docker run --gpus all -it -p 8888:8888 tensorflow/tensorflow:latest-gpu-a bash

コンテナ内で、普通にコマンド jupyter notebook を打ってもエラーを生じて起動せず。通常ブラウザが自動的に起動してくるので、それはそうだろうと思う。よくわからないけど、下記のようにオプションを付けてみた。きっとあとで変更があると思うが、起動することは起動した。

root@b5baf4cc44c4:/# jupyter notebook --ip 0.0.0.0 --port 8888 --no-browser --allow-root

端末に表示されたリンクをブラウザで開くと、jupyter が起動している。

cupy をまだインストールしていなかった。

root@b5baf4cc44c4:/# pip install cupy-cuda110
Collecting cupy-cuda110
  Downloading cupy_cuda110-8.0.0-cp36-cp36m-manylinux1_x86_64.whl (148.5 MB)
     |████████████████████████████████| 148.5 MB 18 kB/s 
Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.6/dist-packages (from cupy-cuda110) (1.18.5)
Collecting fastrlock>=0.3
  Downloading fastrlock-0.5-cp36-cp36m-manylinux1_x86_64.whl (31 kB)
Installing collected packages: fastrlock, cupy-cuda110
Successfully installed cupy-cuda110-8.0.0 fastrlock-0.5

ホストのフォルダーとコンテナのフォルダーを繋いでみる。両方とも事前にフォルダーを用意しておいた。

$ docker run --gpus all -it -p 8888:8888 -v $HOME/rtx2070:/home/rtx2070 tensorflow/tensorflow:latest-gpu-a bash

これで、ホストにあるコードが利用できる。

しかし、実行すると cupy を利用するコードが上手く動かない。明日また調整が必要だ。

(20201016)

CUPY のバージョンが CUDA と合っていなかったようだ。コンテナ内で CUDA のバージョンを確かめる。

root@9994809eda68:/home/rtx2070# nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243

CUDA 10.1 と合う CUPY のバージョンは、ここの記事によると、cuda-cupy110 ではないようである。とりあえず CUPY をアンインストールする(このサイトのイメージを使えば何でもないのではないかな?)。

root@9994809eda68:/home/rtx2070# pip uninstall cupy-cuda110
Found existing installation: cupy-cuda110 8.0.0
Uninstalling cupy-cuda110-8.0.0:
  Would remove:
    /usr/local/lib/python3.6/dist-packages/cupy/*
    /usr/local/lib/python3.6/dist-packages/cupy_backends/*
    /usr/local/lib/python3.6/dist-packages/cupy_cuda110-8.0.0.dist-info/*
    /usr/local/lib/python3.6/dist-packages/cupyx/*
Proceed (y/n)? y
  Successfully uninstalled cupy-cuda110-8.0.0

引き続いて、 インストール。

root@9994809eda68:/home/rtx2070# pip install cupy-cuda101
Collecting cupy-cuda101
  Downloading cupy_cuda101-8.0.0-cp36-cp36m-manylinux1_x86_64.whl (115.3 MB)
     |████████████████████████████████| 115.3 MB 188 kB/s 
Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.6/dist-packages (from cupy-cuda101) (1.18.5)
Requirement already satisfied: fastrlock>=0.3 in /usr/local/lib/python3.6/dist-packages (from cupy-cuda101) (0.5)
Installing collected packages: cupy-cuda101
Successfully installed cupy-cuda101-8.0.0

再掲ですが、 jupyter の起動。

root@9994809eda68:/home/rtx2070# jupyter notebook --ip 0.0.0.0 --port 8888 --no-browser --allow-root

これで、動いた。

コンテナを終了する。現在のコンテナを確認する。

friend@z390:~$ docker ps -a
CONTAINER ID        IMAGE                                          COMMAND                  CREATED             STATUS                       PORTS                    NAMES
9994809eda68        tensorflow/tensorflow:latest-gpu-a             "bash"                   18 hours ago        Exited (130) 6 seconds ago                            exciting_goodall
db89b75f006b        tensorflow/tensorflow:latest-gpu               "bash"                   20 hours ago        Exited (0) 20 hours ago                               heuristic_banach
41258b29d47d        tensorflow/tensorflow:1.14.0-gpu-py3-jupyter   "bash -c 'source /et…"   13 days ago         Created                      0.0.0.0:8888->8888/tcp   angry_dhawan
9cc4e5d8b261        tensorflow/tensorflow:1.14.0-gpu-py3-jupyter   "bash -c 'source /et…"   4 weeks ago         Exited (0) 2 weeks ago                                frosty_johnson

CUPY を入れ替えたので、commit が必要だが、commit は上書きができるようだ。

friend@z390:~$ docker commit 9994809eda68 tensorflow/tensorflow:latest-gpu-a
sha256:50f329f8ced7c6c99dc1afeb3a764a399167f49de282b59dee363121f31cbe71

これで、計算の環境を一台に集約できそう。

コマンドが長いので、シェルスクリプト(ファイル名:docker_cupy.sh)にした。bash ./docker_cupy.sh で起動する。ファイルの記載内容は下記。

#!/bin/bash

docker run --gpus all -it -p 8888:8888 -v $HOME/projects:/home/projects tensorflow/tensorflow:latest-gpu-a bash

exit 0