Caffe (with CUDA 8, cuDNN 5.1) を Windows 10 Pro 64bit で build して matcaffe のデモを走らせる(2017-11時点)

環境

Windows 10 Professional, 64 bit. Fall Creators Update 適用済み。GPUGeForce GTX 1060.

Matlab は現時点で最新の R2017b と、諸事情により必要なかなり古い R2014a の両方でデモコードの実行に成功した。なので、これらの間のバージョンならどれでも通るのではないだろうか。

やりたいこと

画像関係の Deep Learning したい。まさに自分がしたい内容について matcaffe のコードが公開されているので、まずは matcaffe を動かしたい。

ウェブ上にもちろん情報はあるんだけど、それでもハマったので、自分用にメモ。とくに matcaffe 固有の問題はウェブ上に記述が少ない。日本語はほぼない。

手順の流れ

基本はここ → GitHub - BVLC/caffe at windows だが、ハマりポイントがあり、また matlab 関係はいろいろ足りていないのでけっこうググる必要があった。

今回入れるのは Visual Studio 2015, CUDA 8.0, Python 3.5: Caffe Release とする。

以下の記述で、実行場所の指定がなかったり ./ とあったり、caffe/foobar などとある場合は、cd caffe 後のディレクトリ(直下に build, cmake, data, docker, ... が見えている位置)を意味することとする。

  1. (必須)Visual Studio 2015 のインストール
  2. (必要かどうか不明確)システム > システムの詳細設定 > 環境変数 > システム環境変数 に VCTargetsPath として C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140 を新規でセット。
  3. (必須)CMake 3.4以上のインストール
  4. GPU使うなら必須)CUDA 8 と cuDNN 5.1 のインストール
  5. (必須?)Anaconda3 4.2.0 のインストール ← 4.4.0 は python 3.6 がデフォなので厳密を期した。Miniconda でもいいと思う。
  6. conda で必要なツールのインストール ← 記憶がやや曖昧…
  7. git のインストール(必要ではないかも)
  8. 適当なディレクトリを作って、コマンドプロンプトpowershell から git clone https://github.com/BVLC/caffe.git して、cd caffe して、git checkout windows する。
  9. (必須)展開されたディレクトリのうちの scripts フォルダに build_win.cmd というのがある(なかったら上の git clone に失敗してるかも)。これをテキストエディタで開いて編集。
  10. (必須かどうかは場合による?)展開されたディレクトリのうちのルートディレクトリに CMakeLists.txt があるのでこれを編集。
  11. (matcaffe の場合おそらく必須)caffe/matlab/CMakeLists.txt を編集(後述)
  12. scripts ディレクトリよりもひとつ上の階層において、コマンドプロンプトなどから、cmake と python --version がちゃんと通ることを確認(パスの確認)。後者で、2.7 とか出た場合、cygwin あたりの python が優先されてるっぽいので、cygwin から python をアンインストールしておく(必要かどうかは知らないけど、どうせ cygwinpython 使わんでしょ?)
  13. 同じ場所で、scripts\build_win.cmd を実行する。失敗した場合は、build ディレクトリを削除したほうが良い(キャッシュみたいのが生成されるので)。あと、C:\Users[ユーザー名].caffe\dependencies という隠しフォルダ(ディレクトリ)も自動生成されていて、こっちも消したほうがいい場合があるかもしれない。
  14. ビルドが通ったら、mnist のテストをする。
  15. matlab から実行できることをテストするために、classification_demo.m を実行する。

以下、それぞれについてもう少し詳しい手順を記す。

Visual Studio 2015 のインストール

Visual Studio のページに行くと最新の 2017 に飛ばされるので、下の方から 以前の Visual Studio ソフトウェアのダウンロード | Visual Studio へ飛ぶ。しかしここで 2015 の右の「ダウンロード」をクリックすると MS アカウントにログインしろと言われる。さらに、しばらくログインしていなかった場合はそれでも「お前にはダウンロードする資格はない」とか言われてリダイレクトされる。どうすればいいかというと、MSアカウント(というか Visual Studio アカウント?)の自分のプロフィール画面の左下にある Visual Studio Dev Essentials というのに無料 subscribe すればよい。うーん、わかりづらい。

ビルドに必要なのは VC++(のコンパイラ cl.exe)だけらしい。自分は、怖いので、絶対に関係ないであろうモバイル関係以外はほとんど全部入れた気がするけど、正直、容量の無駄なので、あとで消したい。

CUDA 8 と cuDNN 5.1 のインストール

互換性の問題があるらしいので、CUDA は 8, cuDNN は 5.1 とする。CUDA は正しくは CUDA Toolkit というやつ(最初これすら知らなくて右往左往した)。具体的にはここから→ CUDA Toolkit Download | NVIDIA Developer 。一方、cuDNN はググればダウンロードページに行くと思うけど、その先は Developer program みたいの会員登録(無料)しないとダウンロードできなかったと思う。先に CUDA をインストールして、cuDNN の方は、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 以下の同名ディレクトリに中身を移動しちゃうだけでよい。

Anaconda3 4.2.0 のインストール & 必要なツールのインストール(condaで)

Anaconda installer archive ← ここから昔のバージョンを落とせる。 4.4.0 は python 3.6 がデフォだが、caffe はあちこちで「3.5 にしてね」ってあるので、厳密を期した。でもたぶん、4.4.0 を入れておいて、conda install python=3.5 でいいんじゃないですかね…。

この後、

conda install --yes cmake ninja six scikit-image

だったかをしたはずだが、記憶がすでに曖昧だ…。たしか、protobuf==3.1.0 はしようとしてもエラーができてできなかった気がする。

build_win.cmd の変更

if DEFINED APPVEYOR ( の else の方だけでいい、という記述も見かけたけど、よくわからんし大した量じゃないので両方変えた。

変えた場所は

  • WITH NINJA=1 → =0 に(2箇所)
  • PYTHON_VERSION=2 → =3 に(2箇所)
  • BUILD_MATLAB=0 → =1(2箇所)
  • CONDA_ROOT のパスを自分のパスへ変更。ダブルクオーテーションは付けない。自分の場合は、C:\Users\maz\Anaconda3 だった(2箇所)
  • cmake -Gなんちゃら、のところに、-DCUDNN_ROOT=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 ^ を追加。不要な気がするが念のため。

CMakeLists.txt への追記

既に入っている cygwingcc とコンフリクト(?)するのを避けるために、「Visual Studio の方の C コンパイラを使ってね」と伝える必要があるらしい。Ninja 切れば不要だったのかもしれないが、まぁ…

17行目あたり(projectの前でないといけないらしい)に、以下を追記した:

## Specify the C compiler for avoiding errors
set(CMAKE_C_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe")
set(CMAKE_CXX_COMPILER "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/cl.exe")

注意事項としては、なんか知らんけど、パスの区切りはバックスラッシュ(円マーク)だと怒られる。スラッシュにする必要がある。あとは、もし Visual Studio 2015 以外を使いたいなら、14.0 のところをもちろん自分の数字に変えるべし。

matlab/CMakeLists.txt の編集

このままビルドすると、 matlab で実行しようとしたときに mex が見つからないよ、みたいに怒られる。正確には、

Undefined function 'caffe_' for input arguments of type 'char'

だったと思う。このエラーを回避するために、MEX File Missing during Installation · Issue #5219 · BVLC/caffe · GitHub にあるとおり2行追加する(61行目あたり)。

set_target_properties(matlab PROPERTIES 
                                 RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/matlab/+caffe/private)

set_target_properties(matlab PROPERTIES 
                                 RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/matlab/+caffe/private
                                 RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/matlab/+caffe/private
                                 RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/matlab/+caffe/private
)

とする。

実は最初にビルドしたときはこれを知らなかったので、後で上記の修正をしてから再度ビルドしたら大丈夫になった。

mnist のテスト(シェルから)

WindowsでCaffeをビルドしてGPUで実行する - TadaoYamaokaの日記 にあることに近いのだが、いくつか注意や相違があるのでメモ。

  • 記事にある通り、シェルスクリプトを使うので、ここまで使ってきコマンドプロンプトではなく、ここからは Unix 系のシェルを使う。記事には MSYS とあるが、僕は前に入れていた Cygwin で問題なく動いた。
  • 使うシェルスクリプトファイル(.sh ファイル)たちの改行コード (EOL) が Win の CR+LF になっているので、うまくいかない可能性がある。たとえば、Notepad++ で開いて、menu > edit > EOL conversion > Unix (LF) とすればよい。

念のため、やることもまとめておく。

  • data/mnist/get_mnist.sh を編集:
    • 改行コードを LF に変える。
  • examples/mnist/create_mnist.sh を編集:
    • 改行コードを LF に変える。
    • BUILD=build/examples/mnist → BUILD=build/examples/mnist/Release へ変更(環境によっては違う場所可能性あり)。
    • convert_mnist_data.bin → convert_mnist_data.exe へ変更(2か所)
  • examples/mnist/train_lenet.sh を編集:
    • 改行コードを LF に変える。
    • ./build/tools/caffe → ./build/tools/Release/caffe へ変更(環境によっては違う場所可能性あり)。

以上が終わったら、Cygwin などから、

./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh

の順に実行する。GPU の場合、GPU-Z やタスクマネージャ(Windows Fall Creators Update適用済の場合)を見るとちゃんと作動していることがわかる。

classification_demo.m のテスト(matlab上で)

matlab はインストール済みとする。

手順は以下の通り

Net.m ファイルの編集

caffe/matlab/+caffe/Net.m の編集について。これは結構ググったのだが、結論としては、https://github.com/BVLC/caffe/pull/5588#issuecomment-303673915 を参考に、72-74行目にある

if ~isempty(self.hNet_self)

コメントアウトして、

if self.isvalid

を記述する。

これで問題なくデモが走るようになった。結果は 1000x1 の配列で、中身チェックしてないけど、エラー出てないからたぶんいいんじゃないか…(疲れた)。

実は変更内容はわかっても変更箇所がわからなかったので、上の github スレッドからリンクしていた(同じ meixiaofeng さんによる) https://github.com/meixiaofeng/caffe/pull/1/files を見て変更箇所を特定した。しかし、これだと変更前のソースになぜか if がないことになっている…。バージョンが微妙に違うのかもしれない(?)。まぁなんにせよ if self.isvalid で走ってるから、いいか。

ほかにハマったところ

ウェブ上の情報がまちまち

現時点 (2017-11-08) での最新バージョンでの入れ方は、「scripts\build_win.cmd を直接テキストエディタでいじって、その後に実行せよ」というもの。しかし古い自家ビルドとかだと、Winであっても、「違う設定ファイルをいじって、Caffe.sln というのを Visual Studio でビルドしろ」とかあって混乱した(やってみたが python 2 のせいっぽい、文字列をダブルクオーテーションで囲ったところの syntax error が連発して死んだ)。結局、現時点では、公式の build_win.cmd でいけるようだ。現時点では。

環境変数の名前を typo した

VCTargetsPath を VcTergetsPath と2重に typo していた。と思ったけど Windows の variables は NOT case-sensitive なので Vc はまだよかった。Tergets がひどい。つらい。

Cmakeが依存ファイルのダウンロード中にWindows download Prebuilt Dependencies.cmakeエラーで止まる

これは proxy が原因だった。Cmake の(あるいはファイルダウンローダの?)設定方法がよくわからなかったし、ググるのに疲れていたので、VPNで回避した。VPNで回避できたということは、確実にproxyのせいともいえる。

気づいたキッカケは、エラーメッセージでググって、これ→ python - Cmake error at Windows download Prebuilt Dependencies.cmake:54 file Download hash mismatch - Stack Overflow を見て、通信関係の問題と言ってるので、「じゃあまた proxy だろどうせ…」→ 当たりだった。