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
とか言われるのでもう気にしない……)