ArchLinux で Keras をやるための環境構築をして、ちょっと使ってみる。

Kerasの環境構築をしたの続きである。

前回の記事では、TensorFlow, KerasをDockerで動かしてみた。 NVIDIAのGPUを使いたかったので、NVIDIA Dockerというものを使った。

細かい環境は次の通りだった。

OS:

% uname -a                                                          
Linux fg-arch 4.9.11-1-ARCH #1 SMP PREEMPT Sun Feb 19 13:45:52 UTC 2017 x86_64 GNU/Linux

GPU:

vv% lspci -v | grep GeForce -A3
02:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1) (prog-if 00 [VGA controller])
	Subsystem: ASUSTeK Computer Inc. Device 85c5
	Flags: bus master, fast devsel, latency 0, IRQ 42
	Memory at f6000000 (32-bit, non-prefetchable) [size=16M]

すぐに使えるDockerイメージの作成

前回の記事でKerasは使えるようになった。 しかし、毎回Kerasのインストールをしなければならず面倒くさい。

また今回、NVIDIA搭載マシンにはSSHで繋ぐので、 プロットは画像で出力してデスクトップPCから見たい。 このためにはマウントボリュームが有用である。 マウントボリュームを使うと、ホスト側のディレクトリを Docker上のマシンからマウントできる。 すなわち、Docker上のPythonで生成する画像データをマウントしたディレクトリへ出力すれば、ホスト側でもその画像を参照できる。

ということで、すぐに使える状態のDockerイメージを作成しておくことにする。 イメージの名前は keras-tf とした。

$ mkdir keras-tf
$ cd keras-tf

Dockerファイルには下記のように記述する。

$ cat <<EOF > Dockerfile
FROM gcr.io/tensorflow/tensorflow:latest-gpu

RUN apt-get update
RUN apt-get install -y graphviz
RUN pip install keras
RUN pip install pydot

VOLUME ["/mnt"]
EOF

イメージの生成は次のようにする。

$ docker build -t keras-tf .

すると、なんかいろいろ処理が走るが、 問題が無ければ次のようにイメージが確認できるはずである。

$ docker images | grep keras-tf
keras-tf                       latest              227585b4d6fc        7 minutes ago       2.76 GB

Docker イメージの作り直し

Docker イメージをあとで修正したい場合が必ずあるだろう。 そのときには一旦イメージを削除してから作り直す。

$ docker rmi keras-tf
$ docker build -t keras-tf .

起動スクリプトの作成

Dockerの起動

NVIDIA SMIとかの起動も面倒なので、適当にスクリプトにまとめた。 たぶんまだ直すと思う。

$ cat <<EOF > start.sh
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 --rm -v /ローカルの/共有したい/ディレクトリ:/mnt keras-tf bash
EOF

最後に実行してみる。

$ sh start.sh
Fri Jul 28 12:35:49 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 378.13                 Driver Version: 378.13                    |
|-------------------------------+----------------------+----------------------+
| 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  | 0000:02:00.0     Off |                  N/A |
|  2%   50C    P8    10W / 120W |      8MiB /  6072MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
root@83948db74ee2:/notebooks# python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.so.8.0 locally
>>>

これでKerasを使うまでの手続きのストレスが大幅に減った。

線形回帰

せっかくなので線形回帰をやってみる。 と言いたいところだが、次の記事 Kerasではじめての線形回帰に続く。