跳慮跋考

興味も思考も行先不明

Windows10でGPUを有効にしてTensorFlowをソースコードからビルド

Linux は普段使いには不便すぎる。Apple は邪悪である。まともな PC が一台しかない私は Windows を入れつつそこで開発する宿命を背負っているのだ。という訳で頑張ってビルドします。
pip installするだけとかそういうのじゃないよ。


基本 tensorflow/contrib/cmake に従います(2017/11/04 時点の HEAD はこれ)。

環境

  • Visual Studio Community 2015, Version 14.0.25431.01 Update 3
  • Python 3.5.4 64-bit (Anaconda 4.4.0)
  • CMake 3.6.0
  • swigwin-3.0.12
  • CUDA Toolkit 8.0
  • cuDNN 5.1

Visual Studio は Visual C++ を入れていること。
CMake のバージョンをもっと上げると VS2017 にも対応しているらしいが、私が最初見ていたページ(r0.12 で大分古い)に"up to 3.6"とか書いてあったので 3.6 を入れてしまった。VS2017 で成功するのかは不明。

エラー対処

Error C2001: Newline in constant

Error C2001: Newline in constant · Issue #207 · libusb/libusb · GitHub
BOM がソースファイルにない場合、ユーザー環境のコードページで解釈しようとして UTF-8 が読めなくなると。マルチバイトな文化圏特有っぽい?
今回の場合は/source-charset:utf-8をどこに設定すればいいのかよく判らなかったので、全てのソースコードに BOM を付けるという力業で対処。
↓こういう PowerScript でガッとやりました。(リポジトリのルートで実行)

foreach ($i in Get-ChildItem -Recurse) {
	if ($i.PSIsContainer) {
		continue
	}

	if ($i.FullName -like "*.cc" -or $i.FullName -like "*.h") {
		echo $i.FullName
		$tmp = $i.FullName + ".tmp"
		get-content -Encoding UTF8 $i.FullName | set-content -Encoding UTF8 $tmp
		remove-item $i.FullName
		move-item $tmp $i.FullName
	}
}

fatal error C1060: compiler is out of heap space

RAM は十分あって、この場合はコンパイラが 32-bit 版なのが悪かった。

>cl
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.23918 for x86
...

これはvcvarsall.batを使った所為で、そっちではなくC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.batを使う。

>cl
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.23918 for x64

Internal error : assertion failed

fail to build tensorflow-gpu by CUDA 9.0 cuDNN 7 at win10 envs · Issue #14126 · tensorflow/tensorflow · GitHub
最初 CUDA 8.0 だと警告が出たので、9.0 でビルドしていると出た。
しょーがないので 8.0 を(グラフィックドライバ抜きで Toolkit だけ)入れると解決。

指定されたモジュールが見つかりません。

ビルドが無事終了して(i7-7700K で 2 時間弱掛かった)、インストール後 import してみると

>>> import tensorflow as tf
Traceback (most recent call last):
  File "C:\Users\b\AppData\Local\conda\conda\envs\tf-env\lib\site-packages\tensorflow\python\platform\self_check.py", line 87, in preload_check
    ctypes.WinDLL(build_info.cudnn_dll_name)
  File "C:\Users\b\AppData\Local\conda\conda\envs\tf-env\lib\ctypes\__init__.py", line 351, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] 指定されたモジュールが見つかりません。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\b\AppData\Local\conda\conda\envs\tf-env\lib\site-packages\tensorflow\__init__.py", line 24, in <module>
    from tensorflow.python import *
  File "C:\Users\b\AppData\Local\conda\conda\envs\tf-env\lib\site-packages\tensorflow\python\__init__.py", line 49, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "C:\Users\b\AppData\Local\conda\conda\envs\tf-env\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 30, in <module>
    self_check.preload_check()
  File "C:\Users\b\AppData\Local\conda\conda\envs\tf-env\lib\site-packages\tensorflow\python\platform\self_check.py", line 97, in preload_check
    % (build_info.cudnn_dll_name, build_info.cudnn_version_number))
ImportError: Could not find 'cudnn64_6.dll'. TensorFlow requires that this DLL be installed in a directory that is named in your %PATH% environment variable. Note that installing cuDNN is a separate step from installing CUDA, and this DLL is often found in a different directory from the CUDA DLLs. You may install the necessary DLL by downloading cuDNN 6 from this URL: https://developer.nvidia.com/cudnn

何故か cuDNN 6 を要求される。
NVIDIA から拾ってきて、cuDNN Install Guide に従いC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0下に展開。
これで恙なく動いた(ビルド時も cuDNN 6 でいいのかは未検証)。めでたしめでたし。

(AVX が無効とか言われるが、有効にしようとすると今度はillegal sizeof operandとか言われるのでもう気にしない……)