Keras 環境構築をした その3
かなり間が空いているが、本記事は以下の記事の続きに相当する。
これまでの検証は Python2 を使ってきたが、Python3 が使いたくなったので修正した。
また、ニューラルネットの学習に時間がかかることが多くなってきたので、 長時間放置できるように Docker 起動方法を改良した。
1. Dockerfile の変更
Python3 で各種ライブラリをインストールするようにしただけ。
FROM tensorflow/tensorflow:latest-gpu
VOLUME ["/mnt"]
RUN apt-get update -y --fix-missing
RUN apt-get install -y graphviz
RUN apt-get install -y python3-pip
RUN pip3 install --upgrade pip
RUN python3 -m pip install matplotlib
RUN python3 -m pip install tensorflow
RUN python3 -m pip install keras
RUN python3 -m pip install pydot
WORKDIR "/mnt"
2. Docker イメージの作り直し
以前の Docker イメージを削除し、新しく作り直す。
$ docker rmi keras-tf
$ docker build -t keras-tf .
3. 制御スクリプトの作成
せっかくなので起動スクリプトも改良した。
これまでの方法では Docker コンテナは実行時にのみ生成していたため、 スクリプトの実行を止めることなくコンテナから出ることができなかった。
だから学習に時間が長く必要なときなど途中で外出したり寝たりして放置した場合に、 サーバーとの接続が切れてしまうと、スクリプト実行と共に学習も打ち切られてしまい不便だった。
そこでコンテナをデーモンとして動作させ、それに attach
する方式にした。
少し長いが次の制御スクリプトを書いた。
$ chmod u+x container_ctl
$ cat container_ctl
#!/bin/sh
CONTAINER=keras-tf
help() {
echo "Usage: $0 [start|stop|restart|attach]"
}
start() {
if [ $(docker ps | grep $CONTAINER | wc -l) != 0 ]; then
echo "Running container exists. Stop or attach it."
exit 2
fi
echo "Starting the container."
if [ $(ps ax | grep nvidia-docker-plugin | grep -v grep | wc -l) == 0 ]; then
sudo -b nohup nvidia-docker-plugin > /tmp/nvidia-docker.log
fi
nvidia-docker run --rm nvidia/cuda nvidia-smi
nvidia-docker run -it -d --rm -v /house/living/documents/keras:/mnt $CONTAINER bash
attach
}
stop() {
if [ $(docker ps | grep $CONTAINER | wc -l) == 0 ]; then
echo "Running container not exists."
exit 2
fi
echo "Stopping the container."
CONTAINER_ID=$(docker ps | grep $CONTAINER | cut -c-12)
nvidia-docker stop ${CONTAINER_ID}
}
restart() {
stop
start
}
attach() {
echo "Attaching the container. Press Ctrl-p Ctrl-q to detach container."
if [ $(docker ps | grep $CONTAINER | wc -l) == 0 ]; then
echo "Running container not exists."
exit 2
fi
CONTAINER_ID=$(docker ps | grep $CONTAINER | cut -c-12)
nvidia-docker attach ${CONTAINER_ID}
}
if [ $# == 0 ]; then
help
exit 1
fi
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
attach)
attach
;;
*)
help
exit 1
esac
4. 動作確認
最後に実行してみる。
コンテナ起動し attach
。
$ ./container_ctl start
Starting the container.
Sun Oct 14 05:06:52 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 396.45 Driver Version: 396.45 |
|-------------------------------+----------------------+----------------------+
| 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 106... Off | 00000000:02:00.0 Off | N/A |
| 0% 39C P8 7W / 120W | 10MiB / 6078MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
83d391de57e9a8a5e07102e5279cbb4bcc20cf73d196c1f06cd061f89d45faac
Attaching the container. Press Ctrl-p Ctrl-q to detach container.
root@83d391de57e9:/mnt#
Python3 を実行し、適当に変数に値を入れておく。
root@83d391de57e9:/mnt# python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> t = "Okaeri!!"
>>>
Ctrl-p Ctrl-q
を送信して、コンテナから脱出する。
read escape sequence
$
また attach
すると、Python3 の repl が復元された。
$ ./container_ctl attach
Attaching the container. Press Ctrl-p Ctrl-q to detach container.
>>>
さっきセットした変数を参照してみる。
>>> print(t)
Okaeri!!