非日常デコレーション

一般 web developer の雑記です

Ubuntu16.04のインストールからGTX1080/CUDA8.0RCでcaffeをビルド

最近は研究がDeepLearningよりになっています。ツールとしての使い方しかまだできていませんが。

Ubuntu16.04をクリーンインストール

isoイメージをCDに焼いたものをセットし、UEFIでROMの優先順位を一番上に置いて起動。最初はパーティション作成を手動でやってて、優先順位の作業を忘れてEFIブートパーティションが項目になくてマウントできず、ローダーの設定がうまくいかなかったため奔走した。結局手動はやめてフルインストールでやった。

必要最低限のもの

$ sudo apt-get install git 
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get install update
$ sudo apt-get install nvidia-367
$ sudo apt-get install mesa-common-dev
$ sudo apt-get install freeglut3-dev

CUDAインストール

runfileのダウンロード

https://developer.nvidia.com/cuda-toolkit からCUDA8のDownloadリンクへ進み、 Linux/x86_64/Ubuntu/16.04/runfile[local] の順に選択しDownload[1.4GB]。この後これをhome直下に移動させておく。

pathの記述

$ gedit .bashrc

で最後の行に以下を追記。

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_ROOT=/usr/local/cuda

runfileの実行

1.Ctrl+Alt+F1で仮想コンソールに入る。 (最初はここで真っ黒になり何も表示されなかったためrunfileで入れるのを諦めて一旦debファイルからインストールしたが、CUDAサンプルの時点でエラーが出たのでその後runfileでインストールし直そうとしたら仮想コンソールに文字が表示されたのでそのまま以下を行った)

2.usernameとpasswordでloginする

3.以下のコマンドを打つ。なお、コンソールでは_"Shift + -"で入力できる。shコマンド後は0%からEnterでページ送りをする必要があるので注意。driverは古いけどyesを選び、シンボリックリンク作成にもyesを選ぶ。基本デフォルト設定を選べば大丈夫。

$ sudo init 3
$ chmod +x cuda_8.0.27_linux.run
$ sudo sh cuda_8.0.27_linux.run
$ sudo reboot

4.再起動後、login画面で Ctrl+Alt+F1で再度コンソールに入り、loginしたのち

$ sudo apt-get install nvidia-367 --reinstall
$ sudo reboot

5.動作確認

$ nvidia-smi

NVIDIA-SMI 367.27 Driver Version 367.27やGeForce GTX 1080が確認できる。

6.サンプル動作確認

$ cd NVIDIA_CUDA-8.0_Samples/5_Simulations/nbody
$ make
$ ./nbody -benchmark -numbodies=256000 -device=0

エラーが出ずに
"= 2900.647 single-precision GFLOP/s at 20 flops per interaction"まで出れば成功。

最初deb fileでインストールした時は
"error only devices available, 1 requested. existing"
といったエラーが出てきて、caffeのruntestでもコアダンプのエラー
"error == cudaSuccess(38 vs. 0) no CUDA-capable device is detected"
でもうダメだーと思っていたが、

sudo apt-get remove --purge nvidia-*
sudo rm -rf /usr/local/cuda
sudo rm -rf /usr/local/cuda-8.0

で一旦cudaをuninstallしてrunfileでやり直したらうまくいった。CUDAサンプルが動くか確認するのが大事。

Caffeのビルド

関連ライブラリのインストール

$ sudo apt-get install build-essential cmake git pkg-config
$ sudo apt-get install libatlas-base-dev
$ sudo apt-get install python-opencv
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev  
$ sudo apt-get install --no-install-recommends libboost-all-dev
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
$ sudo apt-get install python-pip python-dev python-numpy python-scipy
$ sudo apt-get install libopencv-dev

caffeのビルドまで

cudnnを使う場合は以下。v2とかだとファイルの中身がフォルダに分かれていないので注意。(v2はSegNetとかでしか使わないけど)

$ cd ~/Downloads
$ mv cudnn-8.0-linux-x64-v5.0-ga.tgz cuda.tgz
$ tar zxvf cuda.tgz
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$ sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$ sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

find以降は名前解決のために必要。

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

$ find . -type f -exec sed -i -e 's^"hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;
$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libhdf5_serial.so libhdf5.so
$ sudo ln -s libhdf5_serial_hl.so libhdf5_hl.so

$ cd ~/caffe
$ make all -j8
$ make test -j8
$ make runtest -j8

ちなみにSegNetのビルドはcudnnライブラリがv2でないとダメ。
よってv2も/usr/local/cudaのincludeとlib64に入れておく。(2つのバージョンのライブラリどちらも入れとくのは怖いが)
make runtestで2/4ができなかったが、SegNet自体は動いている。大丈夫なのかこれ。

コンパイル作業で丸1~2日はかけてしまった。もう環境構築はやりたくない。

参考

GTX-1080 など GeForce を Ubuntu 16.04 LTS で CUDA-8.0RC と共に使う - Qiita