機械学習を学び始めた頃、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