以前にWindowsでCaffeをビルドしてGPUで実行する方法について書きましたが、内容が古くなったので書き直します。
以前に日記を書いた時点では、ビルド済みバイナリが配布されていなかったため、自分でビルドを行いましたが、ビルド済みバイナリが配布されるようになりました。
公式からリンクされているGitHubのWindowsブランチからダウンロードできます。
Visual Studio 2013用と2015用、GPU対応、Pythonのバージョンの組み合わせで、5種類のビルド済みバイナリが用意されています。
ここでは、
Visual Studio 2015, CUDA 8.0, Python 3.5: Caffe Release
をダウンロードした前提で記述します。
他のバージョンでもおそらく同様の手順で大丈夫です。
環境
- Windows 10 Home 64bit
- Visual Studio 2015 Community
- CUDA 8.0
- Python 3.5.1(Anaconda 4.1.1)
インストール方法
ビルド済みバイナリのダウンロード
WindowsブランチのREADME.mdのPrebuilt binariesに記載されているリンクから環境に合わせたバイナリをダウンロードします。
MNISTサンプルの実行
公式の手順に従って、MNISTサンプルを実行します。
リポジトリ取得
caffe.zipにはサンプルが含まれていないので、Githubのリポジトリを取得します。
任意のディレクトリで、
git clone https://github.com/BVLC/caffe.git
を実行して、リポジトリを取得します。
MNISTデータダウンロード
以下の手順で実行するシェルは、bashのシェルになっているので、Windowsで実行するにはMinGWなどでbashをインストールします。
./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.