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 | - set(tensorflow_CUDA_VERSION "9.0" CACHE STRING "CUDA version to build against") |
このように変更します。
これで準備は完了です。
あとは、tensorflow\contrib\cmake に移動してCMakeをたたくだけです。
少しコマンドが長いですが…
1 | # \ は / に変更しておく |
ここでビルド前に生成されるプロジェクトファイルに手を加えます。
具体的には、ビルド中に生成されるlibファイルをリンクしているプロジェクトがあるのですが、そのリンクパスが間違っているため、ビルドが途中で停止します。
下記に情報がありました。
修正対象は下記のプロジェクトファイル。
- _beam_search_ops.vcxproj
- _gru_ops.vcxproj
- _lstm_ops.vcxproj
- _nearest_neighbor_ops.vcxproj
- _periodic_resample_op.vcxproj
修正内容は、
1 | - <AdditionalDependencies>\pywrap_tensorflow_internal.lib |
になります。
修正後は下記のコマンドでビルドを開始します。
1 | $ cmake --build . --config Release |
これでビルドが通ります。
が、前にも書いたように、すごく時間がかかります。
i7 8700K、32GBの環境でも、2時間から3時間もビルドに時間がかかりました… 上記の設定でビルドすると、Releaseフォルダに、
- tensorflow.dll
- tensorflow.lib
- tensorflow_static.lib
を含む大量のバイナリが生成されます。
Why using Visual Studio 2015?
2017を使うと下記のエラーが出てビルドがうまくいきませんでした。
1 | Found CUDA: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v9.1 |
調べたところ、下記の記事を見つけました。
この中で、
という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の引数で指定することで明示的に指定したわけです。