Windows10でTensorflow 1.7をマルチGPUで動かす方法を書きます。

Installing TensorFlow on Windows を参考にインストールします。

環境

  • Windows 10
  • Intel Core i7 7700K
  • メモリ 32GB
  • NVIDIA GeForce GTX 1070 8GB * 5
  • NVIDIA GeForce GTX 1060 6GB * 1

注意点???

tensorflow-gpu はCPUの拡張命令セットが使われているので、CPUが古いと実行できないかも。(未確認) AVX2あたりに対応していれば問題ないはず。

実行時に CUDA_ERROR_OUT_OF_MEMORY (メモリのアロケートに失敗した的なエラー)が出る場合は、マシンのメモリが不足しているかも。GPUと同じ量のメモリを割り当てる必要がある?46GB-32GB=14GB分の仮想メモリを設定したらエラーが出なくなった。

ディスプレイはグラボに繋がずにマザボード側に繋げておくこと。tensorflowを実行するとGPUからディスプレイへの出力がなくなるので、マザーボードのチップセット側から出力することをオススメします。

Windows10の制約かNvidiaのドライバの制約かどちらかはわからないが、接続できるGPUは最大8台までらしい。

CUDAインストール

まず、CUDAとか必要なものをインストールします。バージョンは結構シビアなのか指定されたものをインストールしないと動かないみたいです。

Visual C++ 15.0

CUDA Toolkit 9.0をインストールするために必要なのでインストールします。

https://www.visualstudio.com/downloads/ からVisual Studio Community 2017のインストーラをダウンロードして VC++ 15.0 をインストールします。

2GBくらいのファイルのダウンロードが必要で、更にダウンロードスピードが100KB/sくらいしか出ないので、かなり時間がかかります。

CUDA Toolkit 9.0

9.0をインストールします。現時点では9.1がありますがtensorflowのimportでDLLのロードに失敗するので9.0をインストールする必要がありました。

CUDA Toolkit 9.0 download からダウンロードしてインストールします。

これも、1GB以上のファイルのダウンロードが必要です。

Patchもダウンロードしてインストールします。

Driverがインストールされていない場合は、Toolkitをインストールすると自動的に385.54がインストールされるので、必要があれば別途ダウンロードしてアップデートすると良いかも。

cuDNN 7.0

https://developer.nvidia.com/rdp/cudnn-download から cuDNN をダウンロードします。
※ユーザ登録が必要です。

cuDNN v7.0.5 (Dec 5, 2017), for CUDA 9.0 をダウンロードして解凍します。解凍したらパスを通すか、 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0 の下にある同じフォルダにコピーします。

動作確認

nvccとGPUが認識されているか確認します。

C:\Users\ishiis>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:32_Central_Daylight_Time_2017
Cuda compilation tools, release 9.0, V9.0.176
C:\Users\ishiis>"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"
Sat Apr 07 13:57:24 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 391.35 Driver Version: 391.35 |
|-------------------------------+----------------------+----------------------+
| GPU Name TCC/WDDM | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 1070 WDDM | 00000000:02:00.0 Off | N/A |
| 30% 30C P8 7W / 150W | 111MiB / 8192MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 1070 WDDM | 00000000:03:00.0 Off | N/A |
| 0% 34C P8 5W / 195W | 111MiB / 8192MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 2 GeForce GTX 1070 WDDM | 00000000:04:00.0 Off | N/A |
| 0% 33C P8 5W / 195W | 111MiB / 8192MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 3 GeForce GTX 1070 WDDM | 00000000:06:00.0 Off | N/A |
| 0% 39C P8 5W / 151W | 111MiB / 8192MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 4 GeForce GTX 1070 WDDM | 00000000:07:00.0 Off | N/A |
| 0% 33C P8 4W / 151W | 111MiB / 8192MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 5 GeForce GTX 106... WDDM | 00000000:08:00.0 Off | N/A |
| 27% 28C P8 5W / 120W | 98MiB / 6144MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+

よさそう。

tensorflow-gpuインストール

Anacondaを使っても良いですが、今回はpythonのみインストールします。

Python3.6 からインストーラをダウンロードしてインストール。

$ python --version
Python 3.6.2

$ python -m ensurepip --upgrade
$ pip3 -V
pip 9.0.1

最後に tensorflow-gpu をインストールします。

$ pip3 install --upgrade tensorflow

$ pip3 freeze | grep tensorflow-gpu
tensorflow-gpu==1.7.0

動作確認

サンプルを実行してみる。

$ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'

正しくインストールされてない場合はimportでエラーが出ると思います。

マルチGPUで動かしてみる。

https://github.com/tensorflow/models.git のcifar10にマルチGPUのサンプルがあるのでそれを実行してみる。

$ git clone https://github.com/tensorflow/models.git
$ cd models
$ git checkout remotes/origin/r1.8.0 -b r1.8.0

$ python tutorials/image/cifar10/cifar10_multi_gpu_train.py \
--num_gpus=6 --max_steps=5000 --train_dir=./cifar10_train
(...)
2018-04-07 09:07:54.550640: step 4980, loss = 0.94 (7021.0 examples/sec; 0.018 sec/batch)
2018-04-07 09:07:55.425736: step 4990, loss = 0.91 (9829.0 examples/sec; 0.013 sec/batch)

正しく動いていそうなので終わり。

参考

  1. https://www.tensorflow.org/versions/r1.7/install/install_windows
  2. http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/