A certain engineer "COMPLEX"

開発メモ その122 TensorFlowをCUDA 9.1 + CuDNN 7 on Windowsでビルドする

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行目を

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

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

【windows】AVX2を有効にしてTensorflowをビルドする(GPUなし) - Qiita
# 概要タイトルの通りです。widnows環境でcmakeの方でtensorflowをビルドします。その時にいろいろと小技が必要だったので、その内容を備忘録的に書いておきます。# 注...

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

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

修正内容は、

になります。

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

これでビルドが通ります。
が、前にも書いたように、すごく時間がかかります。
i7 8700K32GBの環境でも、2時間から3時間もビルドに時間がかかりました...

上記の設定でビルドすると、Releaseフォルダに、

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

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

Why using Visual Studio 2015?

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

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

tensorflow 1.3,1.4,1.5,1.6 DLL load failed with CUDA 9.1, CUDnn-7.05, Windows 10 · Issue #16939 · tensorflow/tensorflow
import tensorflow strack trace> py lib\_learn\tensorflow\versions\versiontest.pyTraceback (most recent call last): File "lib/tensorflow_gpu_...

この中で、

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

Why specify Numpy dir?

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

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

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。