Python

Keras / TensorFlow-GPU環境の作成(Windows編)

Windows 10に、GPU版のTensorFlowを利用するKeras環境を構築する方法を載せておきます。これは2018/12/31時点における手順になります。

使用環境

KerasとTensorFlow-GPUを導入する環境は次の通りです。なお、Anacondaなど基本的なソフトウェアはインストールが完了していることを前提にした手順になっています。

  • CPU: Intel Core i7-7700K
  • GPU: nVIDIA GeForce GTX 1080(最新のドライバもインストール済み)
  • Windows 10 Pro (64bit)
  • Anaconda 2018.12 Python 3.7 version (64bit)

GPU版のTensorFlowを利用するには、CUDAが利用できるGPUカードが必要になります。対応したGPUカードが無い場合は、GPUを利用しない通常のTensorFlowを利用する事になります。(以下手順の tensorflow-gpu を tensorflow と読み替えていただけると、CPU版のKeras & TensorFlow環境を構築できます)

TensorFlowの公式なインストール手順はpipを使ってありますが、今回はAnacondaを利用しているためcondaを使って環境を作成しています。
Anacondaでもpipは利用可能ですが、pipとcondaで競合する可能性があるため、可能であればcondaの利用をお勧めします。

 

Keras / TensorFlow-GPU の導入方法

Pythonでは仮想環境を作成して作業することが一般的なので、この手順でもKeras/TensorFlow-GPU専用の仮想環境を作成し、そこにTensorFlow-GPUとKerasを導入する流れで作業を進めます。

仮想環境の作成

まずはKeras/TensorFlow-GPU用の仮想環境を作成します。仮想環境は個別に名前を付けて管理しますが、ここでは「keras」という名前で仮想環境を作成しました。
現時点でTensorFlowは、Python3系だとPython 3.4~3.6までの対応になるため、利用するPythonのバージョンは3.6を指定しています。

> conda create -n keras python=3.6

 

TensorFlow-GPUの導入

仮想環境が作成できたら、以下のコマンドでGPU版のTensorFlowを導入します。
CPU版とGPU版のパッケージ名は異なるので、間違わないように注意してください。

  • CPU版: tensorflow
  • GPU版: tensorflow-gpu
> conda activate keras
> conda install tensorflow-gpu

2018/12/31時点では、依存パッケージの「mkl 2019.1」の導入時に、mklに関するdllファイルのサイズが違っていることによる警告メッセージ(SafetyError)が複数表示されます。これはscikit-learnを導入したときにも表示されていましたが、問題無く利用できています。

 

TensorFlowでGPUを使うには、本家サイトの要件にも書いてあるとおり、CUDA ToolkitやcuDNNなどが必要になるのですが、conda経由でtensorflow-gpuをインストールするとCUDA Toolkit 9.0やcuDNNなどが仮想環境配下に自動で導入されます。
そのため、個別にCUDA Toolkitなどをインストールする必要はありません。また、ここで導入されるCUDA Toolkitなどは、全て仮想環境配下に導入されるため、他の環境には影響を与えません

TensorFlowが登場した頃は導入が複雑だった気がしますが、今では拍子抜けするくらい簡単にGPU版のTensorFlowが導入できるようになっています。

私の環境では、TensorFlowとは関係の無い要件でCUDA Toolkit 10やcuDNNなどをOSに直接インストールしているのですが、conda経由で導入されたCUDA Toolkit 9.0は、お互いに競合すること無く動作しています。

 

TensorFlow-GPUの動作確認

次のコマンドでTensorFlow-GPUの簡単な動作確認が行えます。

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

 

実行結果(見やすいように少し編集しています)

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
Found device 0 with properties:
name: GeForce GTX 1080 major: 6 minor: 1 memoryClockRate(GHz): 1.8225
pciBusID: 0000:01:00.0
totalMemory: 8.00GiB freeMemory: 6.60GiB
Adding visible gpu devices: 0
Device interconnect StreamExecutor with strength 1 edge matrix:
     0
0:   N
Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 6361 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0, compute capability: 6.1)
tf.Tensor(1388.9957, shape=(), dtype=float32)

 

サンプルコードを実行したときに「Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2」というメッセージが表示されています。

これは、使っているCPUはAVXやAVX2の命令に対応していても、TensorFlowはAVXやAVX2を使うようになっていない…という参考情報なので、無視しても問題ありません。もし、少しでもパフォーマンスを良くするためにAVXやAVX2を使いたいのであれば、TensorFlowをソースからビルドする必要があります。

ビルド方法の詳細は、公式なビルド方法のサイトを参照してください。

 

Kerasの導入

TensorFlow-GPUの導入が完了したら、Kerasを導入します。
Kerasもcondaに対応しているため、以下のコマンドでインストールを行います。

> conda activate keras
> conda install keras

 

これで、Kerasのインストールが完了しました。
次のコマンドを実行してKerasとTensorFlowの連携が確認できます。正しくTensorFlowが利用されていれば「Using TensorFlow backend.」と表示されます。

python -c "from keras.models import Sequential; model = Sequential()"

 

導入されたパッケージ一覧(2018/12/31時点)

最後に、今回導入されたパッケージの一覧を参考までに載せておきます。
主要なパッケージとして、python=3.6.7、keras=2.2.4、tensorflow-gpu=1.12.0、cudatoolkit=9.0、cudnn=7.1.4になっています。(TensorFlowのGPU要件として、cuDNNは7.2以上…となっていたのが少し気にはなりますが、とりあえず問題無く利用できているようです)

> conda activate keras
> conda list
# packages in environment at C:\Users\Kurozumi\Anaconda3\envs\keras:
#
# Name                    Version                   Build  Channel
_tflow_select             2.1.0                       gpu
absl-py                   0.6.1                    py36_0
astor                     0.7.1                    py36_0
blas                      1.0                         mkl
ca-certificates           2018.03.07                    0
certifi                   2018.11.29               py36_0
cudatoolkit               9.0                           1
cudnn                     7.1.4                 cuda9.0_0
gast                      0.2.0                    py36_0
grpcio                    1.16.1           py36h351948d_1
h5py                      2.9.0            py36h5e291fa_0
hdf5                      1.10.4               h7ebc959_0
icc_rt                    2019.0.0             h0cc432a_1
intel-openmp              2019.1                      144
keras                     2.2.4                         0
keras-applications        1.0.6                    py36_0
keras-base                2.2.4                    py36_0
keras-preprocessing       1.0.5                    py36_0
libprotobuf               3.6.1                h7bd577a_0
markdown                  3.0.1                    py36_0
mkl                       2019.1                      144
mkl_fft                   1.0.6            py36h6288b17_0
mkl_random                1.0.2            py36h343c172_0
numpy                     1.15.4           py36h19fb1c0_0
numpy-base                1.15.4           py36hc3f5095_0
openssl                   1.1.1a               he774522_0
pip                       18.1                     py36_0
protobuf                  3.6.1            py36h33f27b4_0
pyreadline                2.1                      py36_1
python                    3.6.7                h9f7ef89_2
pyyaml                    3.13             py36hfa6e2cd_0
scipy                     1.1.0            py36h29ff71c_2
setuptools                40.6.3                   py36_0
six                       1.12.0                   py36_0
sqlite                    3.26.0               he774522_0
tensorboard               1.12.1           py36h33f27b4_0
tensorflow                1.12.0          gpu_py36ha5f9131_0
tensorflow-base           1.12.0          gpu_py36h6e53903_0
tensorflow-gpu            1.12.0               h0d30ee6_0
termcolor                 1.1.0                    py36_1
vc                        14.1                 h0510ff6_4
vs2015_runtime            14.15.26706          h3a45250_0
werkzeug                  0.14.1                   py36_0
wheel                     0.32.3                   py36_0
wincertstore              0.2              py36h7fe50ca_0
yaml                      0.1.7                hc54c509_2
zlib                      1.2.11               h62dcd97_3