NVCaffe 0.15をWindowsでビルド(GPU対応)

[NVIDIA主催のAI講習](https://www.nvidia.com/ja-jp/deep-learning-ai/education/)でAI開発の手ほどきを受けてウキウキの会社員のみなさんがいきなりぶち当たる壁「Linux機」の手配。おじさんはそんな辛い気持ちよくわかります。

そんな事情はわかりつつ、[NVIDIA DIGITS 6\.0をWindowsで使う！ \- 夜間飛行](https://pid123.blogspot.com/2018/06/nvidia-digits6-windows.html)ではwindows版BVLC/CaffeでDIGITSを動かしたのですが、オリジナルがビルドできないのって気になります。

cmakeの扱いやCIツールのお勉強、WindowsとLinuxの差異へのさらなる習熟を目指してNVIDIAのNVCaffe 0.15をWindows機向けにbuildしましたのでご報告です。

# とりあえずバイナリ欲しい人向け
この辺にリンク貼っておいたんで… **Prebuild binaries**から持っていってくだされ。
[caffe/README\.md at caffe\-0\.15\-win · Chachay/caffe](https://github.com/Chachay/caffe/blob/caffe-0.15-win/README.md)

(Appveyorの都合から2019年1月まで有効だと思います)

# 環境
* Windows 7 / Windows 10 - 64 bit
* Anaconda/ Miniconda
* Microsoft Visual C++ Compiler for Python 2.7
* Visual C++ 2015 Build Tools
* CUDA8 / CuDNN7
* VCPKG 

VCPKGは以降のDependancyを固定するため、https://github.com/Microsoft/vcpkg/tree/47f362db993e31588f72f08e2982b04ae924430c を使うこと前提です。

# Python環境の準備
[NVIDIA DIGITS 6\.0をWindowsで使う！ \- 夜間飛行](https://pid123.blogspot.com/2018/06/nvidia-digits6-windows.html)で準じる環境をお願いします。そのあと

```
pip install protobuf==3.6
```

でprotobufをアップグレード（たぶん3.5でいい）

# VCPKGでライブラリの準備
必要なライブラリをざざっと作ります。

```bash
vcpkg install glog gflags lmdb leveldb snappy protobuf hdf5 opencv openblas zlib libjpeg-turbo ^
                    boost-system boost-thread boost-filesystem boost-regex ^
                    --triplet x64-windows
```

## boost-pythonの設定
vcpkgで作るboost-pythonがpython3版なのでport設定を変更します

```cmake:/ports/boost-python/profile.cmake
# Find Python. Can't use find_package here, but we already know where everything is
set(PYTHON_PATH "D:/Anaconda3/envs/DIGITS/python.exe")
file(GLOB PYTHON_INCLUDE_PATH "D:/Anaconda3/envs/DIGITS/include")
set(PYTHONLIBS_RELEASE  "D:/Anaconda3/envs/DIGITS/libs")
set(PYTHONLIBS_VERSION "27")
include(${CURRENT_INSTALLED_DIR}/share/boost-build/boost-modular-build.cmake)
boost_modular_build(SOURCE_PATH ${SOURCE_PATH})
include(${CURRENT_INSTALLED_DIR}/share/boost-vcpkg-helpers/boost-modular-headers.cmake)
boost_modular_headers(SOURCE_PATH ${SOURCE_PATH})
```

あとはCONTROLからpython3を抜いておくと余計なPython.exeはビルドしなくなります。そして、boost-buildをこちょこちょ。

```cmake:/installed/x64-windows/share/boost-build/user-config.jam
if "@PORT@" = "boost-python"
{
    using python : @PYTHON_VERSION@ : "@PYTHON_PATH@" : "@PYTHON_INCLUDE_PATH@" : "@PYTHONLIBS_RELEASE@" ;
    using python : @PYTHON_VERSION@ : "@PYTHON_PATH@" : "@PYTHON_INCLUDE_PATH@" : "@PYTHONLIBS_DEBUG@" : <python-debugging>on ;
}
```

boost-pythonのビルド

```bash
vcpkg install boost-python --triplet x64-windows
```

## できたライブラリのバージョン

* Boost 1.67 (本当は1.5Xがよかった)
* Protobuf 3.5.1 (本当は3.1.Xがよかった)
* HDF 1.10.1
* lmdb 0.9.70
* LevelDB 1.20
* OpenCV 3.4.1

# Caffeのビルド
このレポ使います [Chachay/caffe: Caffe: a fast open framework for deep learning\.](https://github.com/Chachay/caffe/tree/93bf1e9d8f1c0b31b21621cf48a5d42e4530b515)

```
git clone https://github.com/Chachay/caffe/
```
### build_windows.cmdの編集
みなさんの環境に合わせて[root]/script/build_windows.cmdを編集します

* VCPKG_DIRへのパスに従って、このあたり

```
if NOT DEFINED VCPKG_DIR set VCPKG_DIR=C:\tools\vcpkg\installed\x64-windows
SET VCPKG_CMAKE=c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake
SET HDF5_ROOT=C:\tools\%VCPKG_PBUILD_NAME%\installed\%VCPKG_TRIPLET%
SET HDF5_ROOT_DIR_HINT=C:\tools\%VCPKG_PBUILD_NAME%\installed\%VCPKG_TRIPLET%\share\hdf5
```

* CMakeOutput.log/CMakeError.logの表示削除
消し忘れてしまいましたすみません。227行目から4行削除.

```
echo --------------CMakeOutput.log---------------------
cat "C:/project/caffe/build/CMakeFiles/CMakeOutput.log"
echo --------------CMakeError.log---------------------
cat "C:/project/caffe/build/CMakeFiles/CMakeError.log"
```

### ビルド

```
cd caffe
script\build_windows.cmd
```

こんなログが出るはず　→ [caffe 0\.15\.15\.1\.18 \- AppVeyor](https://ci.appveyor.com/project/Chachay/caffe/build/job/7iiwwbnirrnj38pd)

## 変更点の解説
あとで書く