まんぼう日記

takataka's diary

GPGPUマシンの更新(3) 〜 Theano と Caffe のインストール

GPGPU用のマシンを手に入れました - まんぼう日記 のマシンのOSを入れかえて,CUDA等も更新しました.その結果,こういう環境になりました.

  • OS: Ubuntu 16.04 LTS
  • CUDA 7.5 & cuDNN 5.0
  • Theano 0.8.2 & Caffe 1.0.0-rc3

というわけで,作業メモ.

この(3)では,Theano 0.8.2 と Caffe 1.0.0-rc3 をインストールします.

 

ちなみに,このマシンがまだ Ubuntu 14.04 だった時代の関連記事が以下にあります.

 

 

 

 

準備: NumPy, SciPy, OpenCV のインストール

Ubuntu 16.04 LTS デフォルトの Python のバージョンはこんなん.

$ python --version
Python 2.7.12
$ python3 --version
Python 3.5.2

まずは Python 2.7 用のんをインストール:

$ sudo apt install python-numpy python-scipy python-opencv ipython

バージョンはこんなことになりました.

$ python
>>> import numpy as np
>>> np.__version__
'1.11.0'
>>> import scipy as sp
>>> sp.__version__
'0.17.0'
>>> import cv2
>>> cv2.__version__
'2.4.9.1'

ついでに python3 用のんもインストール(16.04 LTS 標準の OpenCV はまだ 2.4 なので,python3 用のんはありません):

$ sudo apt install python3-numpy python3-scipy ipython3

 

CUDA 7.5 の ``unsupported GNU version! gcc versions later than 5 are not supported!'' への対応策について

Ubuntu 16.04 標準の gcc のバージョンは

$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.2) 5.4.0 20160609

なんですが, CUDA 7.5 は 5 より大きいバージョンに対応してません.この問題に対して,Theano の公式サイト Easy Installation of an Optimized Theano on Current Ubuntu — Theano 0.8.2 documentation の ``For Ubuntu 16.04 with cuda 7.5'' の項では,g++-4.9 をインストールしてそっちをデフォルトに設定し直すことで問題を回避する方法が説明されてます.一方,Caffe の方は公式にはそういう情報がないようですが, Compile and run Caffe on Ubuntu 15.10 · GitHub というページに,CUDA の方で gcc のバージョン判定をやめさせるという大胆な回避法が述べられてます.Caffe はソースからインストールするため,依存関係にある他のソフトが 5.4 でコンパイルされてる都合で,後者の策を選ばざるを得ません.

 

というわけで,CUDA の host_config.h ( GPGPUマシンの更新(2) 〜 CUDA 7.5 と cuDNN 5.0RC - まんぼう日記 に従って CUDA 7.5 をインストールしてたら /usr/include/host_config.h )の115行目をコメントアウトしておきます.

115c115
< #error -- unsupported GNU version! gcc versions later than 5 are not supported!
---
> //#error -- unsupported GNU version! gcc versions later than 5 are not supported!

こんな解決法でほんまにええんやろか…(^^;

 

Theano 0.8.2 のインストール

Theano 0.8.2 は,Theano 0.8.2 と cuDNN v5 - まんぼう日記 の時に 0.8.0 からアップグレードする形で入れたことがあります.でもそんときは Ubuntu 14.04 LTS + CUDA 7.5 でした.今度は 16.04 LTS なので,上述のように gcc のバージョンに関する問題がありますが,それ以外は簡単.上述の Easy Installation of an Optimized Theano on Current Ubuntu — Theano 0.8.2 documentation の ``For Ubuntu 16.04 with cuda 7.5'' の項の g++-4.9 に関する所を除いて実行すればok.

$ sudo apt-get install python-dev python-pip python-nose g++ libopenblas-dev git

して,

$ sudo pip install Theano

するだけです.

$ python
>>> import theano
>>> theano.__version__
'0.8.2'

 

ついでに

$ sudo apt install python3-dev python3-nose
$ sudo pip3 install Theano

したら python3 で動く Theano もインストールできました(ちゃんと動作確認してませんが).

 

それから,上記の Theano の文書に

# Work around a glibc bug
echo -e "\n[nvcc]\nflags=-D_FORCE_INLINES\n" >> ~/.theanorc

 と書いてある通り,nvcc 実行時に -D_FORCE_INLINES というオプションを指定するように~/.theanorc を書いとかないといけません.これがないと,Theano で GPU を使うプログラムを実行すると

/usr/include/string.h: In function ‘void* __mempcpy_inline(void*, const void*, size_t)’:
/usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope
   return (char *) memcpy (__dest, __src, __n) + __n;
                                          ^

というようなエラーが出て動きません.

 

とりあえず 続 GPGPU用マシンにCUDAをインストール - まんぼう日記 の theano-test.py で動作確認

$ THEANO_FLAGS='floatX=float32,device=gpu0' python theano-test.py
Using gpu device 0: Tesla K20c (CNMeM is disabled, cuDNN 5005)
##### using Theano ( on  gpu0 )
N =  10000 elapsed time for theano [sec] =  1.02109408379
##### using Numpy ( on cpu )
N =  10000 elapsed time for np.dot() [sec] =  4.12550902367
$ THEANO_FLAGS='floatX=float32,device=gpu1' python theano-test.py
Using gpu device 1: Quadro K620 (CNMeM is disabled, cuDNN 5005)
##### using Theano ( on  gpu1 )
N =  10000 elapsed time for theano [sec] =  2.94780111313
##### using Numpy ( on cpu )
N =  10000 elapsed time for np.dot() [sec] =  4.1551990509

ふむ,okそうですな.

 

Caffe 1.0.0-rc3 のインストール

Ubuntu が対象なので,http://caffe.berkeleyvision.org/install_apt.html を参考に.ただし,16.04 に対応した説明はないので,いくつか手間をかけないといけないところがあります.たかたかは https://gist.github.com/wangruohui/679b05fcd1466bb0937f を部分的に参考にしました.

 

まず,install_apt.html の ``General dependencies'' のところは言われた通り:

$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
$ sudo apt-get install --no-install-recommends libboost-all-dev

 

``CUDA'' については GPGPUマシンの更新(2) 〜 CUDA 7.5 と cuDNN 5.0RC - まんぼう日記 でインストール済み,``BLAS'' については Theano のインストール時に OpenBLAS をインストール済み(↓の「余談」も参照),``Python'' の python-dev も Theano 入れるときにインストール済み.

 

あとは,``Remaining dependencies, 14.04'' の通りに:

$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

16.04 でもこれで問題なさそうです.それから,Python から Caffe を使うつもりのひとは,次もやっときましょう.

$ sudo apt install python-protobuf python-skimage

後で make pycaffe, make pytest やった時に見つからへんって怒られますので.

 

準備ができたので,Caffe | Installation にしたがって Caffe をコンパイルしましょう.

$ git clone https://github.com/BVLC/caffe.git
$ cd caffe
$ cp Makefile.config.example Makefile.config

ここまでのたかたかの手順から素直に考えると,Makefile.configの修正は次の箇所のみでよいはず.

5c5
< # USE_CUDNN := 1
---
> USE_CUDNN := 1
28c28
< CUDA_DIR := /usr/local/cuda
---
> #CUDA_DIR := /usr/local/cuda
31c31
< # CUDA_DIR := /usr
---
> CUDA_DIR := /usr
46c46
< BLAS := atlas
---
> BLAS := open

ところが,これで make すると

src/caffe/net.cpp:8:18: fatal error: hdf5.h: そのようなファイルやディレクトリはありません

とか言われます.HDF5関係のファイルの名前が違ってるせい.解決の仕方はいろいろありますが,https://gist.github.com/wangruohui/679b05fcd1466bb0937f に従うなら,(1) Makefile.config を次のように修正:

90c90
< INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
---
> INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial

(2) Makefile を次のように修正:

181c181
< LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
---
> LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

でok.

 

でも,再び make すると,今度は

NVCC src/caffe/layers/softmax_layer.cu
/usr/include/string.h: In function ‘void* __mempcpy_inline(void*, const void*, size_t)’:
/usr/include/string.h:652:42: error: ‘memcpy’ was not declared in this scope
   return (char *) memcpy (__dest, __src, __n) + __n;
                                          ^

とか言われます.Theano のセクションでも同じエラー見かけましたね.で,これは Makefile.config を次のように修正することで解決します.

25c25
< # CUSTOM_CXX := g++
---
> CUSTOM_CXX := g++-5 -D_FORCE_INLINES

 

やれやれ,これで先へ進めます.

$ make all
$ make runtest
$ make pycaffe
$ make pytest

無事コンパイルとテストが終了.

 

/usr/local/caffe以下にインストールすることにします.

$ sudo make DISTRIBUTE_DIR=/usr/local/caffe distribute
$ cd /usr/local/caffe/bin
$ for fn in *.bin; do sudo ln -s ${fn} `basename ${fn} .bin` ; done
$ cd 「git clone した caffe ディレクトリ」
$ sudo cp -r data docs docker examples matlab models scripts src tools /usr/local/caffe

 

あとは,ユーザの環境変数を設定すればok.~/.bashrc に次のように書いとくことにしました.

export CAFFE_HOME=/usr/local/caffe
export PATH=${CAFFE_HOME}/bin:${PATH}
export PYTHONPATH=${CAFFE_HOME}/python:${PYTHONPATH}
export LD_LIBRARY_PATH=${CAFFE_HOME}/lib:${LD_LIBRARY_PATH}

 

実行してみます.

$ caffe --version
caffe version 1.0.0-rc3
$ python
>>> import caffe
>>> caffe.__version__
'1.0.0-rc3'

 

余談: NumPy & SciPy がどの BLAS を使ってるか確認

$ python
>>> import numpy as np
>>> np.show_config()

すると,

openblas_info:
  NOT AVAILABLE

と言われたりしますが,実は上記の過程で libopenblas-dev を apt-get したから(?) OpenBLAS 使うようになってます(参考: http://stackoverflow.com/questions/29979539/how-can-i-make-numpy-use-openblas-in-ubuntu).次のようにしてそのことを確認できます.

$ update-alternatives --display libblas.so
libblas.so - 自動モード
  link best version is /usr/lib/openblas-base/libblas.so
  リンクは現在 /usr/lib/openblas-base/libblas.so を指しています
  link libblas.so is /usr/lib/libblas.so
  slave blas.pc is /usr/lib/pkgconfig/blas.pc
  slave libblas.a is /usr/lib/libblas.a
/usr/lib/libblas/libblas.so - 優先度 10
  スレーブ blas.pc: /usr/lib/pkgconfig/blas-netlib.pc
  スレーブ libblas.a: /usr/lib/libblas/libblas.a
/usr/lib/openblas-base/libblas.so - 優先度 40
  スレーブ blas.pc: /usr/lib/pkgconfig/blas-openblas.pc
  スレーブ libblas.a: /usr/lib/openblas-base/libblas.a