空飛ぶ気まぐれ雑記帳

主に趣味とかプログラミングについて扱います。

DLIB with CUDAでCNNを使ってみた in Windows

はじめに

下記の記事を書いてて、うぉぉぉぉってなってそのままDLIBのコンパイルをやりなおしました。

elda27.hatenablog.com

DLIBのコンパイル

DLIBのCUDAを有効にするためには、CUDA 8.0(RC版じゃないですよ)とcuDNN 5.0以上が必要です。また、Windowsも64bit環境でなければならないので注意してください。
まず、cuDNNは下記のURLからダウンロードしてください。バージョンは5.0でも5.1でもどっちでも構いません。

cuDNN
developer.nvidia.com

このcuDNNを適当な所に解凍し、さらに以下のCMakeを実行します。

cmake -DCOMPILER_CAN_DO_CPP_11=ON -DCMAKE_PREFIX_PATH=<cuDNNのルートディクレトリ> <dlibのルートディレクトリ>

ただし、このままだとコンフィギャレーションエラーが出るので、以下の様に"dlib/cmake_utils/test_for_cudnn/find_cudnn.txt"を以下のように書き換えます(githubリポジトリにある最新版のdlibを使う場合、このバグは修正済みなので飛ばしてOK)。

message(STATUS "Looking for cuDNN install...")
# Look for cudnn, we will look in the same place as other CUDA
# libraries and also a few other places as well.
find_path(cudnn_include cudnn.h
    HINTS ${CUDA_INCLUDE_DIRS} ENV CUDNN_INCLUDE_DIR  ENV CUDNN_HOME
    PATHS /usr/local ENV CPATH
    PATH_SUFFIXES include
    )
get_filename_component(cudnn_hint_path "${CUDA_CUBLAS_LIBRARIES}" PATH)
find_library(cudnn cudnn
    HINTS ${cudnn_hint_path} ENV CUDNN_LIBRARY_DIR  ENV CUDNN_HOME 
    PATHS /usr/local /usr/local/cuda ENV LD_LIBRARY_PATH
    PATH_SUFFIXES lib64 lib x64
    )
mark_as_advanced(cudnn cudnn_include)

これでコンパイルすれば、無事CMakeも通ると思います。

サンプルコード

ソースコードの内容は前と代わりませんがCUDAを使用する場合はcmakeオプションに"-DUSE_CUDA"オプションを追加してください。

github.com

結果

推定精度は前回と同じなんだけど、実行時間(学習時間)が爆速になりました。
以前は学習に2日程かかっていたものが20sで終わるようになりました(GTX 970で実行)
まあ、DLIBではそもそもCPUにおける並列化すらしていないようなので当たり前といえば当たり前ですが。