かなり間が空いているが、本記事は以下の記事の続きに相当する。

これまでの検証は 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!!