TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

WindowsにCaffeをインストールする

以前にWindowsでCaffeをビルドしてGPUで実行する方法について書きましたが、内容が古くなったので書き直します。

以前に日記を書いた時点では、ビルド済みバイナリが配布されていなかったため、自分でビルドを行いましたが、ビルド済みバイナリが配布されるようになりました。

公式からリンクされているGitHubWindowsブランチからダウンロードできます。

github.com

Visual Studio 2013用と2015用、GPU対応、Pythonのバージョンの組み合わせで、5種類のビルド済みバイナリが用意されています。

ここでは、
Visual Studio 2015, CUDA 8.0, Python 3.5: Caffe Release
をダウンロードした前提で記述します。
他のバージョンでもおそらく同様の手順で大丈夫です。

環境

インストール方法

ビルド済みバイナリのダウンロード

WindowsブランチのREADME.mdのPrebuilt binariesに記載されているリンクから環境に合わせたバイナリをダウンロードします。

アーカイブ展開

ダウンロードしたcaffe.zipを任意のディレクトリに展開します。

インストールは以上です。

MNISTサンプルの実行

公式の手順に従って、MNISTサンプルを実行します。

リポジトリ取得

caffe.zipにはサンプルが含まれていないので、Githubリポジトリを取得します。

任意のディレクトリで、

git clone https://github.com/BVLC/caffe.git

を実行して、リポジトリを取得します。

ディレクトリのコピー

git cloneしたローカルリポジトリから、以下のディレクトリをビルド済みのcaffeを展開したディレクトリに、コピーします。

  • data
  • examples
MNISTデータダウンロード

以下の手順で実行するシェルは、bashのシェルになっているので、Windowsで実行するにはMinGWなどでbashをインストールします。

bashを起動し、Caffeのディレクトリに移動し、

./data/mnist/get_mnist.sh

を実行し、MNISTのデータをダウンロードします。
wgetとgunzipが使われています。不足しているコマンドがあれば、MinGWのパッケージマネージャでインストールしてください。

データ準備

examples\mnist\create_mnist.shを編集します。

「BUILD=build/examples/mnist」→「BUILD=bin」に修正
「convert_mnist_data.bin」→「convert_mnist_data.exe」に修正(2か所)
編集後、

./examples/mnist/create_mnist.sh

を実行します。

訓練実行

examples\mnist\train_lenet.shを編集します。

「./build/tools/caffe」→「./bin/caffe」に修正
編集後、

./examples/mnist/train_lenet.sh

を実行します。

成功すれば以下のように出力されます。

$ ./examples/mnist/train_lenet.sh
I0315 23:17:26.000556 14060 caffe.cpp:219] Using GPUs 0
I0315 23:17:26.162506 14060 caffe.cpp:224] GPU 0: GeForce GTX 1080
I0315 23:17:26.425354 14060 common.cpp:36] System entropy source not available, using fallback algorithm to generate seed instead.
I0315 23:17:28.068279 14060 solver.cpp:44] Initializing solver from parameters:
test_iter: 100
test_interval: 500
base_lr: 0.01
display: 100
max_iter: 10000
lr_policy: "inv"
gamma: 0.0001
power: 0.75
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000
snapshot_prefix: "examples/mnist/lenet"
solver_mode: GPU
device_id: 0
net: "examples/mnist/lenet_train_test.prototxt"
train_state {
  level: 0
  stage: ""
}
I0315 23:17:28.069281 14060 solver.cpp:87] Creating training net from net file: examples/mnist/lenet_train_test.prototxt
I0315 23:17:28.071815 14060 net.cpp:296] The NetState phase (0) differed from the phase (1) specified by a rule in layer mnist
I0315 23:17:28.071815 14060 net.cpp:296] The NetState phase (0) differed from the phase (1) specified by a rule in layer accuracy
I0315 23:17:28.072289 14060 net.cpp:53] Initializing net from parameters:
(省略)
I0315 23:19:28.510016 14060 solver.cpp:219] Iteration 9700 (90.204 iter/s, 1.1086s/100 iters), loss = 0.0021487
I0315 23:19:28.510545 14060 solver.cpp:238]     Train net output #0: loss = 0.00214882 (* 1 = 0.00214882 loss)
I0315 23:19:28.511018 14060 sgd_solver.cpp:105] Iteration 9700, lr = 0.00601382
I0315 23:19:29.621973 14060 solver.cpp:219] Iteration 9800 (90.028 iter/s, 1.11077s/100 iters), loss = 0.00816679
I0315 23:19:29.622474 14060 solver.cpp:238]     Train net output #0: loss = 0.0081669 (* 1 = 0.0081669 loss)
I0315 23:19:29.622474 14060 sgd_solver.cpp:105] Iteration 9800, lr = 0.00599102
I0315 23:19:30.711405 14060 solver.cpp:219] Iteration 9900 (91.8658 iter/s, 1.08854s/100 iters), loss = 0.00674243
I0315 23:19:30.711905 14060 solver.cpp:238]     Train net output #0: loss = 0.00674254 (* 1 = 0.00674254 loss)
I0315 23:19:30.712406 14060 sgd_solver.cpp:105] Iteration 9900, lr = 0.00596843
I0315 23:19:31.783195 14060 solver.cpp:448] Snapshotting to binary proto file examples/mnist/lenet_iter_10000.caffemodel
I0315 23:19:31.795729 14060 sgd_solver.cpp:273] Snapshotting solver state to binary proto file examples/mnist/lenet_iter_10000.solverstate
I0315 23:19:31.805755 14060 solver.cpp:311] Iteration 10000, loss = 0.00296754
I0315 23:19:31.805755 14060 solver.cpp:331] Iteration 10000, Testing net (#0)
I0315 23:19:32.516114  7412 data_layer.cpp:73] Restarting data prefetching from start.
I0315 23:19:32.544718 14060 solver.cpp:398]     Test net output #0: accuracy = 0.9909
I0315 23:19:32.544718 14060 solver.cpp:398]     Test net output #1: loss = 0.0277917 (* 1 = 0.0277917 loss)
I0315 23:19:32.545192 14060 solver.cpp:316] Optimization Done.
I0315 23:19:32.545692 14060 caffe.cpp:260] Optimization Done.