chainer deel を試す

Deel を試します。

GitHub - uei/deel: Deel; A High level deep learning description language

$ sudo apt-get install libopencv-dev
$ sudo apt-get install python-opencv
$ sudo apt-get install libhdf5-dev
$ git clone http://github.com/uei/deel
$ cd deel
$ python setup.py install

$ cd data
$ ./getCaltech101.sh
(エラー出た)
ValueError: operands could not be broadcast together with shapes (3,144,145) (3,817,656) (3,144,145)



$ cd ../misc
$ ./getPretrainedModels.sh

テスト

$ python examples/gender.py panda.jpg 
Loading gender_net.caffemodel
#1 | male | 63.8%
#2 | female | 36.2%

chainer MNIST を試す

下準備

git, matplotlib を入れます。

$ sudo apt-get install git
$ sudo pip install matplotlib

データをもらう

$ sudo git clone https://github.com/pfnet/chainer.git

mnist を動かす

$ cd chainer/examples/mnist/
$ ./train_mnist.py -g 0

ここでエラーが出ました。

nvidia-smi でもエラーが出たので、ドライバーを入れ直した所、正常に動きました。

初回の起動でデータセットをダウンロードしますが、http://yann.lecun.com/exdb/mnist/ のサイトがダウンしてたりします。

その際は、/usr/local/lib/python2.7/dist-packages/chainer/datasets/mnist.py のURLを適当なミラーサイトに書き換えれば、とりあえず先に進めます。

次のエラーが出ました。

96     if extensions.PlotReport.available():

この部分で AttributeError: type object 'PlotReport' has no attribute 'available' ということです。

ソースコードをみると、コンストラクタの中で def _check_available(): しています。
バージョンアップに伴って、メソッドの改定が有ったのでしょうか。
正常にコンストラクトできたら、そのチェックは出来ているという雰囲気?!

やむないので、

96     #if extensions.PlotReport.available():
97     if True:

などしちゃいます。

とりあえず実行する。

$ ./train_mnist.py -g 0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.193103    0.0990286             0.94295        0.9691                    25.6391       
2           0.0731526   0.071707              0.977382       0.9773                    31.8223       
3           0.0473904   0.086795              0.984782       0.9736                    37.7731       
4           0.0367857   0.081037              0.987615       0.9758                    44.0105       
5           0.0254271   0.0803791             0.991698       0.9775                    49.7157       
6           0.0242218   0.0728918             0.992148       0.9819                    55.351        
7           0.0225581   0.0713523             0.992582       0.9805                    61.1866       
8           0.0151419   0.085011              0.995082       0.9789                    66.9343       
9           0.0154926   0.102077              0.994649       0.9768                    72.5936       
10          0.0187828   0.072758              0.993915       0.9823                    78.331        
11          0.0160584   0.0846834             0.994532       0.9812                    83.9434       
12          0.0101223   0.0924774             0.996732       0.9807                    89.8204       
13          0.0125349   0.0968882             0.996049       0.98                      96.0304       
14          0.0136353   0.079207              0.995899       0.9839                    101.928       
15          0.0109211   0.138                 0.996482       0.9743                    107.863       
16          0.00852963  0.096225              0.997516       0.9812                    113.651       
17          0.00918454  0.0962035             0.997199       0.9819                    119.358       
18          0.00934543  0.0869832             0.997282       0.984                     125.122       
19          0.00991504  0.0877433             0.996999       0.983                     130.87        
20          0.00880426  0.103433              0.997282       0.9804                    136.807

バージョンに有った train_mnist.py を使う

もしくは、ちゃんと github から、自分が使う chainer の version に有ったコードを手に入れます。

Chainer 1.21.0 用

chainer/train_mnist.py at v1.21.0 · pfnet/chainer · GitHub

実行

$ ./train_mnist.py -g 0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.19085     0.099535              0.941401       0.9684                    6.44824       
2           0.0744746   0.0768928             0.976717       0.9764                    10.8679       
3           0.0486528   0.0741029             0.984432       0.9772                    15.2855       
4           0.0382096   0.0868596             0.987816       0.9758                    19.7071       
5           0.0295276   0.073381              0.990398       0.9795                    24.1291       
6           0.0233222   0.0931531             0.992381       0.9751                    28.5248       
7           0.0199249   0.0811498             0.993565       0.9801                    32.9042       
8           0.0202854   0.10219               0.993432       0.9779                    37.2762       
9           0.0196941   0.0857413             0.993398       0.9805                    41.6189       
10          0.0114205   0.0849754             0.995932       0.9811                    45.969        
11          0.0153012   0.0857274             0.994949       0.9808                    50.3032       
12          0.0126985   0.0856742             0.996065       0.9805                    54.6374       
13          0.0142371   0.0987941             0.995348       0.9802                    58.9803       
14          0.00942709  0.0975199             0.996999       0.9811                    63.318        
15          0.0112361   0.109751              0.997066       0.9772                    67.661        
16          0.00985846  0.0991543             0.996982       0.9815                    71.9995       
17          0.0107471   0.107608              0.996932       0.9821                    76.3405       
18          0.0105749   0.11046               0.996966       0.98                      80.6792       
19          0.00803951  0.123615              0.997666       0.9814                    85.0176       
20          0.0115847   0.0917939             0.996799       0.9853                    89.358    

速度について

なお、結構遅いです。

nvidia-smi でチェックした所、GPU使用率は20%程度ですが、CPU使用率は100%に成っていましたので、私の環境におけるボトルネックGPUではなく、CPUのようです。

ログのプロット

サンプルに含まれていそうだけど、ちょっと探して見当たらなかったので書きました。

import matplotlib.pyplot as plt
import argparse
import json

parser = argparse.ArgumentParser()
parser.add_argument("result")
args = parser.parse_args()

with open(args.result, 'r') as f:
        jsonData = json.load(f)

xs = []
ys1 = []
ys2 = []
for line in jsonData:
#       print(line["main/loss"])
        xs.append(line["iteration"])
        ys1.append(line["main/loss"])
        ys2.append(line["main/accuracy"])

plt.xlabel("iteration")
plt.ylabel("error")
plt.plot(xs, ys1, label="main/loss")
plt.plot(xs, ys2, label="main/accuracy")
plt.legend(loc='upper left')
plt.show()
$ python plot.py ./result/log

f:id:pongsuke:20170317111522p:plain

学習結果を保存して、判定させる

保存する

スナップショット取るように、改変する。

(しらべちゅう)

...
from chainer import serializers

 ...

def main():
    global model

 ...

serializers.save_hdf5('modelhdf5', model)

読み込んで判定させる




    
  

ubuntu14.04 LTS + CUDA + cuDNN + Chainer インストールメモ

ubuntu14.04 LTS + CUDA + cuDNN + Chainer インストールメモ

OSの選定

インストールガイド — Chainer 1.18.0 ドキュメント

chainer 公式のインストールガイドに、We recommend these platforms. Ubuntu 14.04 LTS 64bit と、有るので、従います。

LTS は Long Term Support.

ハードウェアの選定

GPU

ディープラーニングだから特別重要、、、と言えばGPU.

CUDA を使用したいので、Nvidiaのチップが入っているやつにしたい。

Radeon も CUDA を利用できたりするらしいですが、動作確認が取れている組み合わせでも、かなりインストールで苦しむので、試す気になれない。

CUDA(Compute Unified Device Architecture:クーダ)とは、NVIDIAが提供するGPU向けのC言語統合開発環境であり、コンパイラ (nvcc) やライブラリなどから構成されている。

スペックメモ

Chip Architecture CUDAコア メモリ 実売 コメント
TITAN X Pascal 3584 12 GB 18万 日本未発売?
冷却を工夫しないと性能が出ない?
GTX1080 Pascal 2560 8 GB 6~12万 簡易水冷バージョンも出ている
GTX1060 Pascal 1280 6 GB 3~4.5万
GTX1050 Pascal 640 2 GB 1~2万
GTX 950 Maxwell 768 2 GB 1.5~3万

補助電源は、6pin, 8pin 1つだったり、2つだったり、ミックスだったりする。

RAM

曰く、32G では不足するとのこと。。。

電源

GPU の事を考えると、最低でも 400w

OS のインストール

ubuntu14,04 を DVD に焼いて、インストールします。

初期設定

パッケージのアップデート

$ sudo apt-get update
$ sudo apt-get upgrade

ssh をインストール自動起動設定して、ipを固定、nameサーバー設定

$ sudo apt-get install ssh
$ service ssh start
$ sudo apt-get install sysv-rc-conf
$ sudo sysv-rc-conf ssh on
$ sudo sysv-rc-conf --list ssh
ssh          2:on       3:on    4:on    5:on

$ sudo cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.100.50
netmask 255.255.255.0
gateway 192.168.100.1

$ cat /etc/resolvconf/resolv.conf.d/base
nameserver 8.8.8.8
$ sudo reboot

ドライバとCUDAのインストール

Ubuntu14.04にNVIDIAドライバーをインストールしたらGUIログインできなくなったときの話 - Qiita

こちらにならいました。

ドライバと CUDA を入れる

先に、古いドライバを確認し、削除します。その後、公式サイトから最新の物をダウンロードして入れます。

$ dpkg -l | grep nvidia
$ dpkg -l | grep cuda

$ sudo apt-get --purge remove nvidia-*
$ sudo apt-get --purge remove cuda-*

※私の場合、初期設定では nvidia のドライバーと cuda は入っていませんでした。

グラフィックボードのドライバとCUDAを入れる

取得。

NVIDIAドライバダウンロード

NVIDIA-Linux-x86_64-375.39.runでした。

CUDA 8.0 Downloads | NVIDIA Developer

cuda_8.0.61_375.26_linux.runでした。

入れる

$ chmod a+x NVIDIA-Linux-x86_64-375.39.run
$ chmod a+x cuda_8.0.61_375.26_linux.run

$ sudo service lightdm stop

openglなしでNVIDIAドライバをインストール

$ sudo ./NVIDIA-Linux-x86_64-375.39.run --no-opengl-files

CUDAをドライバインストールなしでインストール

$ sudo ./cuda_8.0.61_375.26_linux.run --silent --no-opengl-libs --toolkit

nvidia ドライバ動作確認

$ nvidia-smi 
Tue Mar 14 10:36:45 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.39                 Driver Version: 375.39                    |
|-------------------------------+----------------------+----------------------+
| 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:06:00.0     Off |                  N/A |
|  0%   36C    P0    25W / 120W |      0MiB /  6071MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

cuda 動作確認

toolkit をインストール して、nvcc -V

$ sudo apt-get install nvidia-cuda-toolkit

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Wed_Jul_17_18:36:13_PDT_2013
Cuda compilation tools, release 5.5, V5.5.0
環境変数追加
$ echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
$ echo 'export CUDA_PATH=/usr/local/cuda' >> ~/.bashrc
$ source ~/.bashrc

chainer 依存ライブラリ等を入れておく

NumPy 1.9, 1.10, 1.11 pip python2.7-dev

$ sudo apt-get install g++
$ sudo apt-get install python-numpy
$ sudo apt-get install python-pip
$ sudo apt-get install python2.7-dev

Six 1.9

cuDNN インストール

公式サイト曰く、

cuDNN support cuDNN v2, v3, v4, v5, v5.1

なので、

https://developer.nvidia.com/rdp/cudnn-download

cuDNN v5.1 Library for Linux から、 cudnn-8.0-linux-x64-v5.1.tgz を取得

$ tar -zxf cudnn-8.0-linux-x64-v5.1.tgz
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

Pathを通す。

$ echo 'export CPATH=/usr/local/cuda/include:$CPATH' >> ~/.bashrc
$ echo 'export LIBRARY_PATH=/usr/local/cuda/lib64:$LIBRARY_PATH' >> ~/.bashrc

Pathの通っている場所に、libcuda.so をシンボリックリンクさせる

$ find /usr/local/ -name libcuda.so
/usr/local/cuda-8.0/lib64/stubs/libcuda.so

$ cd /usr/local/cuda/lib64
$ sudo ln -sv /usr/local/cuda-8.0/lib64/stubs/libcuda.so .

chainer インストール

ディレクトリ作るのに permission denied でたので、sudo してます。
いいのかな?これで。

$ sudo PATH=/usr/local/cuda/bin:$PATH LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH CUDA_PATH=/usr/local/cuda CPATH=/usr/local/cuda/include:$CPATH  LIBRARY_PATH=/usr/local/cuda/lib64 pip install chainer

バージョンと動作の確認

$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import chainer
>>> chainer.__version__
'1.21.0'
>>> import cupy
>>> import cupy.cudnn