Python

TensorFlow 2.0 Alpha0(GPU版)の環境をWindowsで作る方法

TensorFlow 2.0 Alpha版が公開されているので、GPU版のTensorFlow 2.0.0 Alpha0の環境をWindowsで作成する方法を載せておきます。
なお、既にWindows向けにビルドしてあるパッケージを使用する方法で環境を作成するので、TensorFlow 2.0 Alphaのビルド方法については載せていません。

インストール手順

事前準備

公式サイトでもTensorFlow 2.0 Alpha(GPU版)のインストール手順が公開されていますが、GPU版を動かすためには、CUDA 10.0とcuDNN 7.4.1以上が必要になります。(CUDAとcuDNNの導入方法の詳細はnVIDIA CUDA Toolkit 10 のインストールを参考にしてください)

また、以下のCUDAとCUPTIのパスを、環境変数PATHに追加してください。

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

公開されているビルド済みのパッケージは、CUDA 10.0を利用する前提でビルドしてあります。そのため、CUDA 10.1など異なるバージョンのCUDAを利用している場合は、そのままでは動きません。CUDA 10.1で動かしたい場合は、後半に載せている追加の手順を参考にしてください。

仮想環境の作成とTensorFlow 2.0 Alphaのインストール

以下の手順で仮想環境tf2a0を作成し、TensorFlow 2.0 Alpha0を導入します。なお、Python.orgの純粋なPython 3.6.8を利用しています。

> python -m venv C:\venvs\tf2a0
> C:\venvs\tf2a0\Scripts\activate.bat

> python -m pip install --upgrade pip
> pip install tensorflow-gpu==2.0.0-alpha0

 

これでTensorFlow 2.0 Alpha 0の導入が完了です。導入されたパッケージは次のようになります。

(tf2a0) >pip list
Package              Version
-------------------- --------------------
absl-py              0.7.0
astor                0.7.1
gast                 0.2.2
google-pasta         0.1.4
grpcio               1.19.0
h5py                 2.9.0
Keras-Applications   1.0.7
Keras-Preprocessing  1.0.9
Markdown             3.0.1
numpy                1.16.2
pip                  19.0.3
protobuf             3.7.0
setuptools           40.6.2
six                  1.12.0
tb-nightly           1.14.0a20190301
tensorflow-gpu       2.0.0a0
termcolor            1.1.0
tf-estimator-nightly 1.14.0.dev2019030115
Werkzeug             0.14.1
wheel                0.33.1

 

コマンドプロンプトから、簡単に動作確認が可能です。

(tf2a0) C:\>python -c "import tensorflow as tf; print(tf.__version__); print(tf.keras.__version__);"
2.0.0-alpha0
2.2.4-tf

 

CUDA 10.1で利用したい場合の追加手順

TensorFlow 2.0 AlphaはCUDA 10.0向けにビルドしてあるので、CUDA 10.1を利用していると実行時に以下のようなエラーが表示されます。(要は必要なCUDAのdllファイルが見つからない…という事)

> python -c "import tensorflow as tf; print(tf.__version__); print(tf.keras.__version__);"

Traceback (most recent call last):
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
    from tensorflow.python.pywrap_tensorflow_internal import *
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 28, in <module>
    _pywrap_tensorflow_internal = swig_import_helper()
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
  File "C:\Python36\lib\imp.py", line 243, in load_module
    return load_dynamic(name, filename, file)
  File "C:\Python36\lib\imp.py", line 343, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: 指定されたモジュールが見つかりません。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\__init__.py", line 27, in <module>
    from tensorflow._api.v2 import audio
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\_api\v2\audio\__init__.py", line 8, in <module>
    from tensorflow.python.ops.gen_audio_ops import decode_wav
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\python\__init__.py", line 49, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 74, in <module>
    raise ImportError(msg)
ImportError: Traceback (most recent call last):
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
    from tensorflow.python.pywrap_tensorflow_internal import *
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 28, in <module>
    _pywrap_tensorflow_internal = swig_import_helper()
  File "c:\venvs\tf2a0\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
  File "C:\Python36\lib\imp.py", line 243, in load_module
    return load_dynamic(name, filename, file)
  File "C:\Python36\lib\imp.py", line 343, in load_dynamic
    return _load(spec)
ImportError: DLL load failed: 指定されたモジュールが見つかりません。


Failed to load the native TensorFlow runtime.

See https://www.tensorflow.org/install/errors

for some common reasons and solutions.  Include the entire stack trace
above this error message when asking for help.

 

CUDA 10.1のdllファイルを認識させる方法

CUDA 10.0向けにビルドされたTensorFlowの場合、*_100.dllという名前のDLLファイルをロードするようになっています。そのため、CUDA 10.1で導入されているDLLファイルに対して*_100.dllというファイル名でシンボリックリンクを作成し、DLLファイルがロードできるようにします。(DLL Hellの問題を逆手にとった対応)

なお、DLLファイルに含まれるAPIのインターフェースが変わっている場合は、DLLファイル名が一致したとしても正しく動作しません。CUDA 10.1はCUDA 10.0から変わった部分が少ないので大抵の部分は動くと思いますが、もしかすると一部の機能は正しく動かないかもしれません。

仮想環境をC:\venvs\tf2a0に作成した場合、その配下のScriptsフォルダがPATHの先頭に来るようになるので、名前を変えたDLLファイルへのシンボリックリンクも、Scriptsフォルダ配下に作成します。こうしておけば、影響範囲が今回の仮想環境の範囲内だけになり、オリジナルのCUDA 10.1環境などに影響を与えることはありません

コマンドプロンプトを管理者モードで起動し、以下コマンドでScriptsフォルダ配下にシンボリックリンクを作成します。

> cd /d "C:\venvs\tf2a0\Scripts"

> mklink nppisu64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppisu64_10.dll"
> mklink cufftw64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cufftw64_10.dll"
> mklink nppc64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppc64_10.dll"
> mklink nvblas64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvblas64_10.dll"
> mklink cudart32_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cudart32_101.dll"
> mklink cudart64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cudart64_101.dll"
> mklink nppicom64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppicom64_10.dll"
> mklink nppitc64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppitc64_10.dll"
> mklink nppicc64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppicc64_10.dll"
> mklink nvrtc-builtins64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvrtc-builtins64_101.dll"
> mklink cuinj64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cuinj64_101.dll"
> mklink nppim64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppim64_10.dll"
> mklink nppidei64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppidei64_10.dll"
> mklink npps64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\npps64_10.dll"
> mklink nppial64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppial64_10.dll"
> mklink nvrtc64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvrtc64_101_0.dll"
> mklink nppist64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppist64_10.dll"
> mklink nppig64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppig64_10.dll"
> mklink cublasLt64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cublasLt64_10.dll"
> mklink nppif64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nppif64_10.dll"
> mklink curand64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\curand64_10.dll"
> mklink cublas64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cublas64_10.dll"
> mklink cusparse64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cusparse64_10.dll"
> mklink cufft64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cufft64_10.dll"
> mklink nvgraph64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvgraph64_10.dll"
> mklink cusolver64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\cusolver64_10.dll"
> mklink cupti64_100.dll "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\CUPTI\lib64\cupti64_101.dll"

 

シンボリックリンクを作成したら、Python環境のコンソールに戻ってDLLファイル(のシンボリックリンク)が認識されているか、whereコマンドで確認します。

(tf2a0) C:\>where *_100.dll
c:\venvs\tf2a0\Scripts\cublas64_100.dll
c:\venvs\tf2a0\Scripts\cublasLt64_100.dll
c:\venvs\tf2a0\Scripts\cudart32_100.dll
c:\venvs\tf2a0\Scripts\cudart64_100.dll
c:\venvs\tf2a0\Scripts\cufft64_100.dll
c:\venvs\tf2a0\Scripts\cufftw64_100.dll
c:\venvs\tf2a0\Scripts\cuinj64_100.dll
c:\venvs\tf2a0\Scripts\cupti64_100.dll
c:\venvs\tf2a0\Scripts\curand64_100.dll
c:\venvs\tf2a0\Scripts\cusolver64_100.dll
c:\venvs\tf2a0\Scripts\cusparse64_100.dll
c:\venvs\tf2a0\Scripts\nppc64_100.dll
c:\venvs\tf2a0\Scripts\nppial64_100.dll
c:\venvs\tf2a0\Scripts\nppicc64_100.dll
c:\venvs\tf2a0\Scripts\nppicom64_100.dll
c:\venvs\tf2a0\Scripts\nppidei64_100.dll
c:\venvs\tf2a0\Scripts\nppif64_100.dll
c:\venvs\tf2a0\Scripts\nppig64_100.dll
c:\venvs\tf2a0\Scripts\nppim64_100.dll
c:\venvs\tf2a0\Scripts\nppist64_100.dll
c:\venvs\tf2a0\Scripts\nppisu64_100.dll
c:\venvs\tf2a0\Scripts\nppitc64_100.dll
c:\venvs\tf2a0\Scripts\npps64_100.dll
c:\venvs\tf2a0\Scripts\nvblas64_100.dll
c:\venvs\tf2a0\Scripts\nvgraph64_100.dll
c:\venvs\tf2a0\Scripts\nvrtc-builtins64_100.dll
c:\venvs\tf2a0\Scripts\nvrtc64_100.dll

 

Scriptsフォルダ配下の*_100.dllファイルが見つかっていれば、後は通常通りTensorFlow 2.0 Alpha 0が使用できます

(tf2a0) C:\>python -c "import tensorflow as tf; print(tf.__version__); print(tf.keras.__version__);"
2.0.0-alpha0
2.2.4-tf

 

簡単に試した感じでは、CUDA 10.1、cuDNN 7.5の組み合わせでTensorFlow 2.0 Alpha0(GPU版)を利用できていますが、全てが正しく動くかどうかは分かりません。気になる場合は、無難にCUDA 10.0を使った方が良いと思います。