Introduction

公式バイナリでもよいのですが、自分でビルドしたのでメモです。
CMakeでビルドします。
なお、Visual Studio 2015が必要です。2017ではビルドできませんでした。 あと、ビルドにすごい時間がかかります。

Preparation

まず必要なものをダウンロードして、インストールまたは展開します。

CMake

PATHを通しておきます。

CUDA 9.1

CUDA Toolkitから環境に適応したインストーラをダウンロードします。

CuDNN 7

NVIDIA cuDNNから環境に適応したバイナリをダウンロードします。
なおダウンロードには登録が必要です。
また、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1に展開する必要はありません。
自由にディレクトリに展開しておくことができます。

Python 3.6

自分の環境では、Visual Studio 2017でインストールしたAnacondaが入っていますので、これでPythonに対応します。

SWIGWIN

公式ページのDownloadから入手します。

SWIGとSWIGWINがあるので間違いないように。

git

これもPATHが通っている必要があります。

Git for Windowsをインストールしておくのが無難です。

Build

まず、tensorflow\contrib\cmake\CMakeLists.txt を開きます。

40行目を

1
2
- set(tensorflow_CUDA_VERSION "9.0" CACHE STRING "CUDA version to build against")
+ set(tensorflow_CUDA_VERSION "9.1" CACHE STRING "CUDA version to build against")

このように変更します。
これで準備は完了です。
あとは、tensorflow\contrib\cmake に移動してCMakeをたたくだけです。
少しコマンドが長いですが…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# \ は / に変更しておく
$ set SWIG_EXE="D:/Works/Lib/SWIG/Windows/3.0.12/swig.exe"
$ set PYTHON_EXECUTABLE_64="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/python.exe"
$ set PYTHON_LIBRARIES_64="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/libs/python36.lib"
$ set NUMPY_INCLUDE_DIR="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/Lib/site-packages/numpy/core/include"
$ set CUDNN_HOME="D:/Works/Lib/NVIDIA/cuDNN/9.1/7.0/Win10"

$ cd tensorflow\contrib\cmake
$ mkdir build
$ cd build
$ cmake -G "Visual Studio 14 2015 Win64" ^
-D tensorflow_CUDA_VERSION=9.1 ^
-D tensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX2 ^
-D SWIG_EXECUTABLE=%SWIG_EXE% ^
-D PYTHON_EXECUTABLE="%PYTHON_EXECUTABLE_64%" ^
-D PYTHON_LIBRARIES="%PYTHON_LIBRARIES_64%" ^
-D NUMPY_INCLUDE_DIR="%NUMPY_INCLUDE_DIR%" ^
-D tensorflow_ENABLE_GPU=ON ^
-D tensorflow_BUILD_SHARED_LIB=ON ^
-D CUDNN_HOME="%CUDNN_HOME%" ^
..

ここでビルド前に生成されるプロジェクトファイルに手を加えます。
具体的には、ビルド中に生成されるlibファイルをリンクしているプロジェクトがあるのですが、そのリンクパスが間違っているため、ビルドが途中で停止します。
下記に情報がありました。

修正対象は下記のプロジェクトファイル。

  • _beam_search_ops.vcxproj
  • _gru_ops.vcxproj
  • _lstm_ops.vcxproj
  • _nearest_neighbor_ops.vcxproj
  • _periodic_resample_op.vcxproj

修正内容は、

1
2
- <AdditionalDependencies>\pywrap_tensorflow_internal.lib
+ <AdditionalDependencies>Release\pywrap_tensorflow_internal.lib

になります。

修正後は下記のコマンドでビルドを開始します。

1
$ cmake --build . --config Release

これでビルドが通ります。
が、前にも書いたように、すごく時間がかかります。
i7 8700K32GBの環境でも、2時間から3時間もビルドに時間がかかりました… 上記の設定でビルドすると、Releaseフォルダに、

  • tensorflow.dll
  • tensorflow.lib
  • tensorflow_static.lib

を含む大量のバイナリが生成されます。

Why using Visual Studio 2015?

2017を使うと下記のエラーが出てビルドがうまくいきませんでした。

1
2
3
4
Found CUDA: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.1
(found suitable exact version "9.1")
CMake Error at CMakeLists.txt:322 (message):
Selected compiler (or version) is not supported for CUDA

調べたところ、下記の記事を見つけました。

この中で、

というVisual Studio 2017 15.5でCUDAが停止する、というNvidiaのコミュニティへのリンクがあります。
詳細は続報待ちですが、2015に変えたら動いたのでそういうものだと捉えておきます。

Why specify Numpy dir?

下記のエラーが出てビルドがうまくいきませんでした。

1
Cannot get NumPy include directory: Is NumPy installed?

CMakeList.txtを解析していくと、NUMPY_INCLUDE_DIR変数を参照していたので、CMakeの引数で指定することで明示的に指定したわけです。