Ry0 Note

ガジェットレビューと技術メモ

Ubuntu 14.04にCUDA 7.0とcuDNNを導入する

NVIDIAの本気!効果は確か

UbuntuにCUDAとcuDNNをCaffeで使うためにインストール

Deep Learningのフレームワーク「Caffe」をUbuntuで使用する上で、CUDAとcuDNNと呼ばれるライブラリを導入すると学習等の処理が速くなるというので、導入したときのメモです。Caffe以外の用途でこれらのライブラリを使用する場合でも同様の操作なのでよかったら御覧ください。

最近リリースされた「TensorFlow」もCuda 7.0とCUDNN 6.5 V2が対応バージョン(最新バーションじゃ上手く動かなかった)なのでこの記事を見ればGPUの環境を整えることができますよ。TensorFlowはまだ勉強中です。

環境の確認

この記事は以下の環境で検証しています。

  • Ubuntu 14.04
  • グラフィックボード GeForce GTX 750 Ti

NVIDIAのグラフィックカードのドライバは事前に以下の方法(apt-get経由)でインストールしています。

1
2
3
sudo add-apt-repository ppa:mamarley/nvidia
sudo apt-get update
sudo apt-get install nvidia-340

必ずしもこの方法でドライバを導入しておく必要はありません。あくまで環境の確認です。

CUDAのインストール

https://developer.nvidia.com/cuda-downloads#linux
ここからLinux x86のタブのUbuntu 14.04 DEB (3KB)をダウンロードします。

1
2
3
sudo dpkg -i cuda-repo-ubuntu1404_7.0-28_amd64.deb
sudo apt-get update
sudo apt-get install cuda

意図せずにcudaの最新版が入ってしまう場合があります.その場合(Y/N)の段階でNを選択して,以下のコマンドを打ち直してください.

1
sudo apt-get install cuda-7-0

.bashrcに以下を記述

1
2
3
4
5
#CUDA
export CUDA_HOME=/usr/local/cuda-7.0

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64
export PATH=$PATH:${CUDA_HOME}/bin

サンプルコードをコンパイル

1
2
3
cuda-install-samples-7.0.sh ~
cd ~/NVIDIA_CUDA-7.0_Samples
make

コンパイルに成功したら、以下のコマンドを打ってサンプルが実行できたらCUDAの導入は成功です。

1
2
cd bin/x86_64/linux/release
./smokeParticles

cuDNNのインストール

cuDNNはDeep Learningに特化したライブラリで畳み込み等の計算を高速に処理してくれるライブラリだそう。 これもCaffeが対応しているため、導入します。 詳しくは下のリンクを見てください。
追記もありますので最後までしっかり読んでくださいね。

【レポート】
GTC 2015 - Deep Learning用のCUDAライブラリ「cuDNN」

しかしこのライブラリを取得するためにはデベロッパー登録が必要です。 ここ(https://developer.nvidia.com/cudnn)がダウンロードリンクなのですが、NVIDIAの登録が済んでいない場合「Register」をクリックしてアカウントを作成してください。そのあとcuDNNの使用を申請します。「どういった用途で使うの?」といった質問を記入する欄がありますが、英語で「Caffeで使いたいんだ。頼む、ください。」程度の短い文章でも使用OKがでました。私の場合、金曜の夜申請して休みを挟んで月曜日に申請が認可されました。

申請が通り、ライブラリのダウンロードが完了したら以下のコマンドを実行してライブラリをパソコンにインストールします。インストールと言っても該当ファイルを所定の場所にコピーするだけです。

1
2
3
4
tar -zxf cudnn-6.5-linux-x64-v2.tgz
cd cudnn-6.5-linux-x64-v2
sudo cp lib* /usr/local/cuda/lib64/
sudo cp cudnn.h /usr/local/cuda/include/

追記[2016/6/29]

cuDNNのバージョンの末尾のv2,v3…などはCaffeのバージョンによってすでに使えない場合があります。追記した段階ではcuda 7.0では有効なバージョンはV4でした。cuDNN関係でコンパイルエラーになる場合はこれを注意してください。久しぶりに新規でインストールしようとすると詰まりました。

エラー内容の一例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PROTOC src/caffe/proto/caffe.proto
CXX src/caffe/blob.cpp
CXX src/caffe/common.cpp
CXX src/caffe/parallel.cpp
CXX src/caffe/layer_factory.cpp
In file included from ./include/caffe/util/device_alternate.hpp:40:0,
                 from ./include/caffe/common.hpp:19,
                 from ./include/caffe/blob.hpp:8,
                 from src/caffe/blob.cpp:4:
./include/caffe/util/cudnn.hpp: In function ‘void caffe::cudnn::createPoolingDesc(cudnnPoolingStruct**, caffe::PoolingParameter_PoolMethod, cudnnPoolingMode_t*, int, int, int, int, int, int)’:
./include/caffe/util/cudnn.hpp:136:9: error: ‘CUDNN_PROPAGATE_NAN’ was not declared in this scope
         CUDNN_PROPAGATE_NAN, h, w, pad_h, pad_w, stride_h, stride_w));
         ^
./include/caffe/util/cudnn.hpp:15:28: note: in definition of macro ‘CUDNN_CHECK’
     cudnnStatus_t status = condition; \
                            ^
./include/caffe/util/cudnn.hpp:136:68: error: there are no arguments to ‘cudnnSetPooling2dDescriptor_v4’ that depend on a template parameter, so a declaration of ‘cudnnSetPooling2dDescriptor_v4’ must be available [-fpermissive]
         CUDNN_PROPAGATE_NAN, h, w, pad_h, pad_w, stride_h, stride_w));
                                                                    ^
./include/caffe/util/cudnn.hpp:15:28: note: in definition of macro ‘CUDNN_CHECK’
     cudnnStatus_t status = condition; \
                            ^
./include/caffe/util/cudnn.hpp:136:68: note: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
         CUDNN_PROPAGATE_NAN, h, w, pad_h, pad_w, stride_h, stride_w));

また最近のcuDNNではcudnn-6.5のころとディレクトリ構造が変わっていますので、注意してください。

1
2
3
4
tar -zxf cudnn-7.0-linux-x64-v4.0-prod.tgz
cd cuda
sudo cp ./lib64/* /usr/local/cuda/lib64/
sudo cp ./include/cudnn.h /usr/local/cuda/include/

おわりに

これでCaffeの力をフルに活用できる環境が整いました。実際にCPUオンリーで処理させたときと比較して段違いに速くなるのでNVIDIAのグラフィックカードがPCに刺さっている場合は導入を検討してはいかがでしょうか。

またCaffeのインストール、自分でデータセットを作成してCaffeを使った学習、学習結果の利用といったTipsも元気があれば書きたいと思うのでお楽しみに。