GPGPU用のマシンを手に入れました - まんぼう日記 のマシンのOSを入れかえて,CUDA等も更新しました.その結果,こういう環境になりました.
- OS: Ubuntu 16.04 LTS
- CUDA 7.5 & cuDNN 5.0
- Theano 0.8.2 & Caffe 1.0.0-rc3
というわけで,作業メモ.
- GPGPUマシンの更新(1) 〜 Ubuntu 16.04 をインストールして NVIDIA ドライバを入れる 〜 - まんぼう日記
- GPGPUマシンの更新(2) 〜 CUDA 7.5 と cuDNN 5.1RC - まんぼう日記
- GPGPUマシンの更新(3) 〜 Theano と Caffe のインストール - まんぼう日記
この(3)では,Theano 0.8.2 と Caffe 1.0.0-rc3 をインストールします.
ちなみに,このマシンがまだ Ubuntu 14.04 だった時代の関連記事が以下にあります.
- Theano 0.8.2 と cuDNN v5 - まんぼう日記
- Theano 0.8.0 と cuDNN 4 - まんぼう日記
- Theano 0.8.0rc1(または,ignore_border は True にしよう) - まんぼう日記
- GPGPU用マシンに Ubuntu をインストールして Theano を使えるようにする - まんぼう日記
- Ubuntu マシンに Caffe をインストール - まんぼう日記
- 準備: NumPy, SciPy, OpenCV のインストール
- CUDA 7.5 の ``unsupported GNU version! gcc versions later than 5 are not supported!'' への対応策について
- Theano 0.8.2 のインストール
- Caffe 1.0.0-rc3 のインストール
- 余談: NumPy & SciPy がどの BLAS を使ってるか確認
準備: 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