Python

TensorFlowのビルド方法(tf1.13.1, CUDA10.1, cuDNN7.5.0, Windows10)

Windows 10でTensorFlow 1.13.1のGPU版(CUDA 10.1 + cuDNN 7.5.0)のビルドに成功したので、その方法を載せておきます。
基本的な流れは、前に紹介したTensorFlow 1.12.0のビルド方法と似ていますが、少し手順が異なる部分があります。以下の内容も、1.12.0のビルドと異なる部分は赤字で強調しておきました。(コード中の文字は赤くなっていません。ご了承ください)

ビルド環境のアウトライン

  • ハードウェア/OS
    • CPU: Intel Core i7-7700K(AVX2に対応したCPU)
    • OS: Windows 10 Pro Build 17763(64bit)
  • TensorFlow関連
    • TensorFlow 1.13.1
    • CUDA 10.1 for Windows
    • cuDNN 7.5.0 for Windows(CUDA 10.1用)
  • ビルド関連
    • Microsoft Visual C++ 2015 Redistributable Update 3
    • Microsoft Build Tools 2015 Update 3
    • MSYS2 x64
    • Bazel 0.19.0
    • Python 3.6.8(tf1.13.1は3.7にも対応しているようです)

 

ビルド環境の構築

CUDA 10.1、cuDNN 7.5のインストール部分までは、tf1.12.0をビルドするときと同じ内容になります。tf1.13.1はPython 3.7にも対応しているようですが、今回はtf1.12.0のビルドで使用したPython 3.6.8をそのまま利用しています。

Visual C++ Build Tools 2015のインストール

Microsoft Visual Studio サイトの「再頒布可能パッケージおよびビルド ツール」から、以下のツールをダウンロードしてインストールします。なお、私が試した限りでは、Visual Studio 2017を使うとビルドに失敗します。

  • Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3(x64版)
  • Microsoft Build Tools 2015 Update 3

 

MSYS2のセットアップ

MSYS2のインストール

MSYS2のサイトから、64bit版のMSYS2(msys2-x86_64-20180531.exe)をダウンロードしてインストールします。
インストール先は、デフォルトのC:\msys64にしています。

環境変数PATHの設定

環境変数のPATHC:\msys64\usr\binを追加します。

コマンドプロンプトでwhere bashと入力して、MSYS2配下のbash.exeが最初に見つかるかどうか確認します。

> where bash
C:\msys64\usr\bin\bash.exe

 

MSYS2パッケージの更新と追加

C:\msys64\msys2_shell.cmd でMSYS2のコンソールを起動し、以下のコマンドでインストール済みパッケージを最新化します。

pacman -Syu

 

MSYS2のコンソールを再起動して、以下コマンドで必要なパッケージを追加します。

pacman -Su
pacman -S git patch unzip

 

Bazelのセットアップ

TensorFlowのビルドにはBazelが利用されているので、Bazelを導入します。ビルドするTensorFlowのバージョンによって、利用可能なBazelバージョンの組み合わせが異なります。TensorFlow 1.13.1をビルドする場合は、Bazel 0.19.0を利用してください。(最新バージョンを使うとビルドエラーになります)

Bazelのダウンロード

BazelはGitHubのReleasesからビルド済みの実行ファイルをダウンロードすることもできますが、MSYS2に含まれているwgetコマンドで直接取得してきた方が簡単です。
コマンドプロンプトで以下のコマンドを実行し、C:\tools配下にBazel 0.19.0をダウンロードします。

> cd /d c:\
> mkdir tools
> cd tools
> wget https://github.com/bazelbuild/bazel/releases/download/0.19.0/bazel-0.19.0-windows-x86_64.exe -O bazel.exe

wgetでSSL関連のエラーが出る場合、wgetコマンドの最後に--no-check-certificateを付ければOKです。

環境変数の設定

Bazelを利用するために、以下の環境変数を設定します。

環境変数名 設定値
PATH C:\toolsを追加
BAZEL_SH
C:\msys64\usr\bin\bash.exe(bash.exeのフルパス)
BAZEL_VC C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC

 

コマンドプロンプトでbazel.exeへのパスが通っているか確認します。

> where bazel.exe
C:\tools\bazel.exe

 

Python 3.6.8のセットアップ

Python 3.6.8のインストール

Python.orgのダウンロードページからWindows用のPython 3.6.8(x64版)をダウンロードしてインストールします。Python 3.7以降のバージョンには対応していないので、必ずPython 3.6.8を利用してください。また、AnacondaやMinicondaを使うとビルドエラーになるようなので、TensorFlowのビルドにはPython.orgのPythonを使用してください。

インストール先はC:\Python36にしています。

環境変数PATHの設定

インストーラーでPATHの追加も自動で行われると思いますが、念のためパス設定が行われているか、whereコマンドで確認します。

> where pip3 python
C:\Python36\Scripts\pip3.exe
C:\Python36\python.exe

 

もし、パスが通っていない場合は環境変数のPATHにC:\Python36\Scripts\C:\Python36\2つのパスを追加してください。

 

CUDA 10.1、cuDNN 7.5.0のセットアップ

CUDA 10.1のインストール

NVIDIAのCUDA Toolkitのページから、Windows 10向けのCUDA Toolkit 10.1 for Windows(cuda_10.1.105_418.96_win10.exe)をダウンロードしてインストールします。
私の場合は、カスタム設定で全てにチェックを入れてインストールしました。

cuDNN 7.5.0のインストール

NVIDIAのcuDNNのページから、Windows 10用のcuDNN 7.5.0 for CUDA 10.1cudnn-10.1-windows10-x64-v7.5.0.56.zip)をダウンロードします。なお、cuDNNをダウンロードするには、Membershipへの登録(無料)が必要になります。

ダウンロードしたzipファイルのcudaフォルダに含まれているlib,bin,includeフォルダを、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1フォルダに上書きコピーします。

CUDA 10.1とcuDNN 7.5.0の導入方法については、以前に書いた「nVIDIA CUDA Toolkit 10 のインストール」も参考にしてみてください。

環境変数PATHの設定

環境変数のPATHに以下3つのパスを追加します。なお、既にPATHに追加されている場合は追加する必要はありません。(CUDA 10.0からCUDA 10.1にアップデートした場合は、3つともパスの書き換えが必要です)

CUDA 10.1では、CUPTIライブラリのフォルダ名が変わっているようです。
以前のバージョンではlibx64だったと思いますが、CUDA 10.1ではlib64に変わっているので、パス名を間違えないようにしてください。

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\libnvvp
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64

 

パスが通っているかどうか、whereコマンドで確認します。

> where nvcc.exe nvvp.exe cupti64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc.exe
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\libnvvp\nvvp.exe
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64\cupti64_101.dll

Windowsのロングパス名を有効化

ファイル名を指定して実行(Windowsキー+R)でgpedit.mscを実行して、ローカルグループポリシーエディターを起動します。

コンピューターの構成> 管理者用テンプレート> システム> ファイルシステム を選択し、その中にある「Win32の長いパスを有効にする」を「有効」に変更します。

 

TensorFlow 1.13.1のビルド

ビルド用のPython環境作成

スタートメニューから「Visual C++ 2015 x64 Native Build Tools Command Prompt」を起動して、以下のコマンドでTensorFlowビルド用のPython環境を作成していきます。なお、後続のパッケージ作成まで、このコンソールを継続して利用するのでコンソール画面は閉じないでください。

cmd.exeなどで単純にコマンドプロンプトを開くと、ビルドに必要な環境変数が設定されないため、必ずスタートメニューの「Visual C++ 2015 x64 Native Build Tools Command Prompt」からプロンプトを開いてください。

> where python
C:\Python36\python.exe

rem Python仮想環境用のフォルダ(C:\venvs)を作成
> mkdir c:\venvs

rem 仮想環境(build_tf1131)を作成し有効化
> python -m venv c:\venvs\build_tf1131
> C:\venvs\build_tf1131\Scripts\activate.bat

rem build_tf1131のpython.exeが有効になったことを確認
> where python
C:\venvs\build_tf1131\Scripts\python.exe
C:\Python36\python.exe

rem pipのアップグレード(任意)
> python -m pip install --upgrade pip

rem 必要なパッケージのインストール
> pip3 install six numpy wheel
> pip3 install keras_applications==1.0.7 --no-deps
> pip3 install keras_preprocessing==1.0.9 --no-deps

今回利用するkeras_applicationsとkeras_preprocessingのバージョンは、tf1.12.0の時よりも新しいバージョンを指定しましたが、tf1.12.0の時と同じバージョンを指定しても正しくビルドできると思います。

 

pip3 listと入力して、導入したパッケージの確認が可能です。

> pip3 list
Package             Version
------------------- -------
Keras-Applications  1.0.7
Keras-Preprocessing 1.0.9
numpy               1.16.1
pip                 19.0.3
setuptools          40.6.2
six                 1.12.0
wheel               0.33.1

コンソールは閉じずに、後続のステップに進みます。

TensorFlow 1.13.1のソースコード取得

TensorFlowビルド用のフォルダを作成しGitHubからソースコードを取得してきます。ビルド用のフォルダはC:\build\tf1131に設定しました。

> mkdir C:\build\tf1131
> cd /d c:\build\tf1131
> pwd
/c/build/tf1131

rem TensorFlow1.13.1のソースコード取得
> git clone https://github.com/tensorflow/tensorflow.git
> cd tensorflow
> git checkout v1.13.1

GitでSSLのエラーが出る場合は、コンソールでgit config --global http.sslVerify falseを実行してください。

 

不要:eigenのバグ修正

TensorFlow 1.13.1では、eigenのバグ修正は不要です。

Bazelでビルド設定

コンソール画面に戻って、以下コマンドでTensorFlowのビルド設定を行います。

> cd /d C:\build\tf1131\tensorflow
> pwd
/c/build/tf1131/tensorflow

> python ./configure.py

 

対話形式で設定を行っていくので、それぞれ以下のように画面から値を入力して設定を行ってください。なお、何も入力せずにEnterキーを押すと、画面に表示されているデフォルト値がそのまま設定されます

Pythonのパス(Location of python)

Enterキーを押してデフォルト値(c:\venvs\build_tf1131\Scripts\python.exe)を設定します。

Pythonライブラリのパス(Python Library path to use)

Enterキーを押してデフォルト値(c:\venvs\build_tf1131\lib\site-packages)を設定します。

XLA JIT supportの設定: N

Enterキーを押してデフォルト値(N)を設定します。
XLA JIT supportを有効にするとビルドに失敗するため、必ずNを選択してください。

ROCm supportの設定: N

Enterキーを押してデフォルト値(N)を設定します。

CUDA supportの設定: Y

今回はCUDAを利用するため「y」と入力してEnterキーを押します。
ここでデフォルト値の(N)を設定すると、CUDAが利用されないので注意してください。

CUDA SDK versionの設定: 10.1

CUDA 10.1を利用するので「10.1」と入力してEnterキーを押します。

CUDA 10.1 toolkitのパス設定

Enterキーを押してデフォルト値(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1)を設定します。

cuDNN versionの設定: 7.5

今回利用するcuDNNのバージョン「7.5」を入力してEnterキーを押します。

cuDNNのパス設定

Enterキーを押してデフォルト値(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1)を設定します。

CUDAのCCバージョン設定

利用するGPUに合わせて、CUDA compute capabilitiesのバージョンを指定します。私の場合はTuringのTITAN RTXを利用するので「7.5」と入力しEnterキーを押します。

GPUごとに対応しているバージョンはNVIDIAのCUDA GPUのページから調べられます。なお、現時点ではTITAN RTXやGEFORCE RTX 2080TiなどのTuringのバージョンが載っていませんが、Turing系のチップを搭載したGPUの場合は「7.5」になります。

対応するバージョンはカンマ区切りで複数指定可能ですが、指定バージョンを増やすほど最終的に作成されるファイルのサイズが大きくなります。

最適化オプションの設定

利用しているCPUに合わせて最適化オプションを設定します。
私の場合はAVX2に対応しているIntel Core i7-7700Kを利用しているので「/arch:AVX2」と入力してEnterキーを押します。

inline overrideの設定: Y

Enterキーを押してデフォルト値(Y)を設定します。

 

設定値のサマリ

これでビルド設定が完了です。
分かりやすいように、今回の設定値を以下の表にまとめています。

設定項目 設定値
Location of python c:\venvs\build_tf1131\Scripts\python.exe
Python Library path c:\venvs\build_tf1131\lib\site-packages
XLA JIT support N
ROCm support N
CUDA support Y
CUDA SDK version 10.1
CUDA location C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1
cuDNN version 7.5
cuDNN location C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1
CUDA CC version 7.5
optimization flags /arch:AVX2
override eigen inline Y

 

不要:Bazel関連の不具合修正

TensorFlow 1.13.1の場合は、.bazelrcファイルの修正は不要です。

TensorFlow 1.13.1のビルド

セキュリティソフトの一時無効化

ビルド時に必要なパッケージのダウンロードが行われるのですが、Kaspersky Internet Securityなどのセキュリティソフトを導入している場合、対象のパッケージがダウンロードできずにビルドエラーになる場合があります。

そのため、このタイミングでセキュリティソフトを一時的に無効化します。

ビルドの実行

これまで作業してきたコンソールで以下のコマンドを実行し、Bazelを使ったTensorFlowのビルドを行います。TensorFlow 1.13.1の場合は、ビルドに指定するオプションが増えているので注意してください。(cpuやcompilerの指定が必要でした)

なお、ビルドが完了するまで1時間くらいかかります。

> cd /d C:\build\tf1131\tensorflow
> pwd
/c/build/tf1131/tensorflow

rem ビルド実行
> bazel build --config=opt --copt=-nvcc_options=disable-warnings //tensorflow/tools/pip_package:build_pip_package --cpu=x64_windows --compiler=msvc-cl

rem ビルドが完了すると以下のようなメッセージが表示されます
INFO: Elapsed time: 3497.204s, Critical Path: 508.66s, Remote (0.00% of the time): [queue: 0.00%, setup: 0.00%, process: 0.00%]
INFO: 4654 processes: 4654 local.
INFO: Build completed successfully, 6211 total actions

Bazelの作業ファイルは%USERPROFILE%\_bazel_%USERNAME%というフォルダに作成されます。(%USERPROFILE%%USERNAME%は環境変数名)

例えば、ユーザー名がTaroの場合、C:\Users\Taro\_bazel_Taroというフォルダが作成され、そこに各パッケージや中間ファイルが格納されます。そこそこ大きなファイルサイズになるのでパッケージ作成後は、このフォルダを削除しても問題ありません

バックグラウンドでBazelが起動しているとフォルダの削除ができないので、その場合はコマンドプロンプトからbazel shutdownと入力してBazelをシャットダウンしてからフォルダの削除を行ってください。

 

セキュリティソフトの有効化

セキュリティソフトを無効化した場合は、ここでセキュリティソフトを有効にします。

 

wheelパッケージの作成

これまで作業してきたコンソール画面でwheelパッケージを作成します。
エラー無くパッケージが作成できた場合は問題ありませんが、おそらくTensorFlow 1.13.1の場合はパッケージ作成でエラーが発生すると思われます

> cd /d C:\build\tf1131\tensorflow
> pwd
/c/build/tf1131/tensorflow

rem 出力フォルダの作成
> mkdir ..\out

rem wheelパッケージの作成
> .\bazel-bin\tensorflow\tools\pip_package\build_pip_package ..\out

rem 次のようなエラーが出ると思われる
Fri Mar 1 00:09:18 2019 : === Preparing sources in dir: /tmp/tmp.onArZ4HmJE
Unzipping simple_console_for_windows.zip to create runfiles tree...
[./bazel-bin/tensorflow/tools/pip_package/simple_console_for_windows.zip]
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of ./bazel-bin/tensorflow/tools/pip_package/simple_console_for_windows.zip or
        ./bazel-bin/tensorflow/tools/pip_package/simple_console_for_windows.zip.zip, and cannot find ./bazel-bin/tensorflow/tools/pip_package/simple_console_for_windows.zip.ZIP, period.

 

wheelパッケージの作成でエラーが発生する件は既知の内容なので、以下の手順でパッケージの作成作業を続けます。(エラーにならなかった場合は、以下の作業はスキップしてかまいません)

simple_console_for_windows.zipファイルの削除

C:\build\tf1131\tensorflow\bazel-out\x64_windows-opt\bin\tensorflow\tools\pip_package\simple_console_for_windows.zip ファイルを削除します。(途中のパスは作業しているパスに合わせて読み替えてください)

wheelパッケージの作成に失敗する場合、おそらく、このsimple_console_for_windows.zipファイルが0バイトになっていると思います。

 

simple_console_for_windows.zip-0.paramsファイルの編集

C:\build\tf1131\tensorflow\bazel-out\x64_windows-opt\bin\tensorflow\tools\pip_package\simple_console_for_windows.zip-0.params をテキストエディタで開いて、ファイル名の最後が~.zipになっている行を全て削除して保存します。今回私が削除した行数は、21箇所でした。

サクラエディタやEmEditorなど正規表現の置換が利用できるエディタを利用している場合、正規表現で^.+\.zip\nを一括置換すれば、全ての~.zipの行を削除できます。(改行コード\nの正規表現は、ソフトによって異なる場合があります)

 

simple_console_for_windows.zipファイルの作成

ビルドで利用しているコンソールで以下コマンドを入力し、simple_console_for_windows.zipファイルを作成します。なお、コマンドを実行するパスが違うとエラーになるので、以下のパスにcdコマンドで移動して作業を行う必要があります。

> cd /d c:\build\tf1131\tensorflow\bazel-tensorflow
> .\external\bazel_tools\tools\zip\zipper\zipper.exe vcC bazel-out/x64_windows-opt/bin/tensorflow/tools/pip_package/simple_console_for_windows.zip @bazel-out/x64_windows-opt/bin/tensorflow/tools/pip_package/simple_console_for_windows.zip-0.params

 

wheelパッケージ作成の再実行

これで、通常通りwheelパッケージが作成可能な状態に戻ったので、再度以下のコマンドでwheelパッケージを作成します。(上の操作でカレントディレクトリを移動しているので、再度元の場所に戻して作業を行います)

> cd /d c:\build\tf1131\tensorflow
> .\bazel-bin\tensorflow\tools\pip_package\build_pip_package ..\out

 

パッケージの作成が完了すると、C:\build\tf1131\outフォルダにtensorflow-1.13.1-cp36-cp36m-win_amd64.whlが作成されます。

 

ビルド作業の終了

これでGPU版TensorFlow 1.13.1 CUDA 10.1 + cuDNN 7.5.0のビルド作業が完了です。この後はBazelも使わないので、以下コマンドでBazelとコンソール画面を終了させます。

> bazel shutdown
> exit

 

CUDA 10.1ファイルの別名作成

TensorFlow 1.13.1では、CUDA関連のdllをロードする時に、ファイル名の後ろにCUDAのバージョン番号(CUDA10.1だと101)を付けたファイル名をロードするようになっています。
しかし、CUDA 10.1に含まれるdllファイルは、ファイル名の後ろが*_10.dllと*_101.dllが混在した状態になっているため、ファイル名が*_10.dllの場合に正しくロードできません。(以下のコマンドで、CUDA関連のファイル名が確認できます)

> where *_10.dll | find "CUDA"
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cublas64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cublasLt64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cufft64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cufftw64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\curand64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cusolver64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cusparse64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppc64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppial64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppicc64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppicom64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppidei64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppif64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppig64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppim64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppist64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppisu64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppitc64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\npps64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvblas64_10.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvgraph64_10.dll

> where *_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cudart32_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cudart64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cuinj64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvrtc-builtins64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64\cupti64_101.dll

 

CUDAの_101.dllファイル(シンボリックリンク)作成

ファイル名が*_101.dllとなっていないdllファイルは、*_10.dllをコピーしてファイル名を変えてもいいのですが、ファイルの内容は同じで良いので、以下の手順でシンボリックリンク(ショートカットのような物)を作成します。こうしておけば、容量を無駄に消費しなくて良いのでおすすめです。

コマンドプロンプトを管理者権限で起動し、以下のコマンドを実行してください。このコマンドで、*_101.dllというシンボリックリンクが作成されます。

> cd /d "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\"

> mklink cublas64_101.dll   cublas64_10.dll
> mklink cublasLt64_101.dll cublasLt64_10.dll
> mklink cufft64_101.dll    cufft64_10.dll
> mklink cufftw64_101.dll   cufftw64_10.dll
> mklink curand64_101.dll   curand64_10.dll
> mklink cusolver64_101.dll cusolver64_10.dll
> mklink cusparse64_101.dll cusparse64_10.dll
> mklink nppc64_101.dll     nppc64_10.dll
> mklink nppial64_101.dll   nppial64_10.dll
> mklink nppicc64_101.dll   nppicc64_10.dll
> mklink nppicom64_101.dll  nppicom64_10.dll
> mklink nppidei64_101.dll  nppidei64_10.dll
> mklink nppif64_101.dll    nppif64_10.dll
> mklink nppig64_101.dll    nppig64_10.dll
> mklink nppim64_101.dll    nppim64_10.dll
> mklink nppist64_101.dll   nppist64_10.dll
> mklink nppisu64_101.dll   nppisu64_10.dll
> mklink nppitc64_101.dll   nppitc64_10.dll
> mklink npps64_101.dll     npps64_10.dll
> mklink nvblas64_101.dll   nvblas64_10.dll
> mklink nvgraph64_101.dll  nvgraph64_10.dll

 

シンボリックリンクが作成されたかどうかは、以下コマンドで確認できます。

> C:\>where *_101.dll | find "CUDA"
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cublas64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cublasLt64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cudart32_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cudart64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cufft64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cufftw64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cuinj64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\curand64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cusolver64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cusparse64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppc64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppial64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppicc64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppicom64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppidei64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppif64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppig64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppim64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppist64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppisu64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppitc64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\npps64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvblas64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvgraph64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvrtc-builtins64_101.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64\cupti64_101.dll

 

なお、cuDNNもビルド設定では7.5と入力していて、実際のファイル名はcudnn64_7.dllになっているので心配になるかもしれませんが、cuDNNは対応不要です。(その理由は以下参照)

CUDAのdllファイルを読み込む仕組み

TensorFlow 1.13.1で、どのようにCUDAのdllをロードしているか気になったので、生成されたソースコードを少し調べてみました。(CUDAのバージョンに10.1、cuDNNのバージョンに7.5を指定したときのソースです)

// cuda_config.h
#define TF_CUDA_VERSION "64_101"
#define TF_CUDNN_VERSION "64_7"

// dso_loader.cc
string GetCudaVersion() { return TF_CUDA_VERSION; }
string GetCudnnVersion() { return TF_CUDNN_VERSION; }

/* static */ port::Status DsoLoader::GetCublasDsoHandle(void** dso_handle) {
  return GetDsoHandle(FindDsoPath(port::Env::Default()->FormatLibraryFileName(
                                      "cublas", GetCudaVersion()),
                                  GetCudaLibraryDirPath()),
                      dso_handle);
}

/* static */ port::Status DsoLoader::GetCudnnDsoHandle(void** dso_handle) {
  // libcudnn is versioned differently than the other libraries and may have a
  // different version number than other CUDA libraries.  See b/22397368 for
  // some details about the complications surrounding this.
  return GetDsoHandle(FindDsoPath(port::Env::Default()->FormatLibraryFileName(
                                      "cudnn", GetCudnnVersion()),
                                  GetCudaLibraryDirPath()),
                      dso_handle);
}

ポイントになる部分だけを抜き出しましたが、CUDA系ファイルの場合は”64_101″、cuDNN系のファイルは”64_7″(75ではない)という名称を付けてdllファイルをロードするようになっています。(ここでは省略していますが、他のCUDA系ファイルも同様にロードするコードが生成されています)

そのため、CUDA 10.1に含まれている「cublas64_10.dll」のような「ファイル名の最後が*_10.dll」になっているファイルはTensorFlowで正しくロードできないため、「cublas64_101.dll」のようなシンボリックリンクを意図的に作成する必要があります。

cuDNNは上記ソースのコメントにも書いてありますが、命名ルールが違っているのでファイル名を変えなくても問題ありません。

 

TensorFlow 1.13.1のインストール

仮想環境の作成

独自にビルドしたTensorFlowを利用するため、専用の仮想環境を作成します。このあたりは、TensorFlow向け…というよりも、Pythonを利用する時の一般的な流れになります。

今回は、C:\venvs\配下にtf1131という仮想環境を作成します。
コマンドプロンプト(普通のコマンドプロンプトでOK)を開いて以下のコマンドを実行します。

> python -m venv C:\venvs\tf1131

rem 仮想環境のActivateとpipのバージョンアップ
> C:\venvs\tf1131\Scripts\activate.bat
> python -m pip install --upgrade pip

rem 導入されたパッケージ
> pip3 list
Package    Version
---------- -------
pip        19.0.3
setuptools 40.6.2

 

作成したwheelパッケージの導入

続けて、以下のコマンドで作成したwheelパッケージからTensorFlowを導入します。

> pip3 install C:\build\tf1131\out\tensorflow-1.13.1-cp36-cp36m-win_amd64.whl

rem 導入されたパッケージ
> pip3 list
Package             Version
------------------- -------
absl-py              0.7.0
astor                0.7.1
gast                 0.2.2
grpcio               1.19.0
h5py                 2.9.0
Keras-Applications   1.0.7
Keras-Preprocessing  1.0.9
Markdown             3.0.1
mock                 2.0.0
numpy                1.16.2
pbr                  5.1.2
pip                  19.0.3
protobuf             3.6.1
setuptools           40.6.2
six                  1.12.0
tensorboard          1.13.0
tensorflow           1.13.1
tensorflow-estimator 1.13.0
termcolor            1.1.0
Werkzeug             0.14.1
wheel                0.33.1

 

TensorFlowの動作確認

最後に、導入したTensorFlowの動作確認を簡単に行います。
上で利用したコンソールを引き続き利用し、以下コマンドでTensorFlowの動作確認を行います。

> python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"

 

正しくビルドできていれば以下のようにTensorFlowが動作します。Anaconda経由で導入したtensorflow-gpuの時に表示されていたAVX2に関するメッセージも表示されなくなります。(下のログは一部見やすいように編集しています)

2019-03-01 : Found device 0 with properties:
name       : TITAN RTX major: 7 minor: 5 memoryClockRate(GHz): 1.77
pciBusID   : 0000:01:00.0
totalMemory: 24.00GiB freeMemory: 20.00GiB
2019-02-25 : Adding visible gpu devices: 0
2019-02-25 : Device interconnect StreamExecutor with strength 1 edge matrix:
2019-02-25 :      0
2019-02-25 : 0:   N
2019-02-25 : Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 19380 MB memory) -> physical GPU (device: 0, name: TITAN RTX, pci bus id: 0000:01:00.0, compute capability: 7.5)
tf.Tensor(-910.0499, shape=(), dtype=float32)

 

これで、独自にビルドしたTensorFlowを利用する環境が整いました。後はjupyter-labなど好みに応じてパッケージを追加してご利用ください。