読者です 読者をやめる 読者になる 読者になる

SuprSonicJetBoy's blog

いろいろです。

TensorFlowをGPUで回すと落ちる場合の改善策

TensorFlowをGPUで回すとPCが落ちてしまうので、仕方なくCPUで回していたのですが、どうにもこうにも遅すぎるし、せっかく対応しているGPUがあるので、ちゃんと回るように対策をしてみました。

症状

TensorFlowのチュートリアルCIFAR-10」をGPUで回すと、パソコンが落ちる。
ただし、数枚のCNNだと回る。

改善策

先に改善策だけ。
ドライバのアップデート。
これがすべてでした。。。

環境

OS: Windows 10
GPU: NVIDIA Quadro K2000D (Compute Capability 3.0)
Python: 3.5.2
TensorFlow: tensorflow (1.0.1)、tensorflow-gpu (1.1.0rc1)
CUDA: 8.0.61
cuDNN: 5.1.5

原因を探る

まず、落ちた原因を探ってみます。
Windowsであればイベントビューアーで探せるのですが、エラーイベントが多すぎて探すのが面倒なので、コントロール パネル\システムとセキュリティ\セキュリティとメンテナンス\解決策の確認で、重大なエラーのみが出るのでこちらで見てみます。

こんな感じでありました。

説明
ハードウェアの問題により、Windows は正しく動作しなくなりました。

問題の署名
問題イベント名:  LiveKernelEvent
コード:  ab
パラメーター 1:   a
パラメーター 2:   1d0
パラメーター 3:   1d0
パラメーター 4:   300000003
OS バージョン: 10_0_14393
Service Pack:   0_0
製品: 768_1
OS バージョン: 10.0.14393.2.0.0.768.101
ロケール ID:    1041

LiveKernelEventをググると、 answers.microsoft.com なので、ほぼほぼGPUが原因です。

GPUの状態を確認する

搭載されているGPUの状態を、nvidia-smi.exe で確認します。

C:\>"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"
Sun Apr 23 16:25:36 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 369.30                 Driver Version: 369.30                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro K2000D      WDDM  | 0000:01:00.0      On |                  N/A |
| 30%   27C    P8    N/A /  N/A |    270MiB /  2048MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

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

ちなみに、数枚のCNNで起動するとこのような感じで使用量が増えます。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 369.30                 Driver Version: 369.30                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro K2000D      WDDM  | 0000:01:00.0      On |                  N/A |
| 30%   35C    P0    N/A /  N/A |   1796MiB /  2048MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

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

この状態だと、約88%のGPUメモリを使用しています。
Volatile GPU-Utilは0%のままですが、これは一定期間、GPUがどれだけアクティブだったかを示すみたいです。
nvidia-smi.exe -l 5とかやると、5秒間隔で更新されるので、増減は確認できます。 stackoverflow.com

しかし、GPUは間違いなく認識されていますが、GPUで回しているはずが「No running processes found」と出ています。
使用量があるのに、プロセスが立っていません。
もしかすると、これがなんらかの問題を誘発しているのかもしれません。

ただ、TensorFlowをGPUで回すと認識はされています。

2017-04-23 16:37:28.231018: I c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:887] Found device 0 with properties:
name: Quadro K2000D
major: 3 minor: 0 memoryClockRate (GHz) 0.954
pciBusID 0000:01:00.0
Total memory: 2.00GiB
Free memory: 1.67GiB
2017-04-23 16:37:28.231128: I c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:908] DMA: 0
2017-04-23 16:37:28.232202: I c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:918] 0:   Y
2017-04-23 16:37:28.232667: I c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:977] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Quadro K2000D, pci bus id: 0000:01:00.0)

No running processes found

serverfault.com github.com

根本的な解決策はわかりませんでしたが、とりあえずドライバをアップデートをするといいみたいです。
CUDA 7.5であれば、ドライバのバージョンが、352.xxかそれ以上の必要があるようです。(この情報は公式サイトでは探せませんでした)
nvidia-smi: No running processes found · Issue #8877 · tensorflow/tensorflow · GitHub
いま使用しているCUDAは8.0.xxなので、要件がわかりませんがとりあえず上げてみます。

念のため、PCを再起動。

Sun Apr 23 17:43:01 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 377.11                 Driver Version: 377.11                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Quadro K2000D      WDDM  | 0000:01:00.0      On |                  N/A |
| 30%   29C    P8    N/A /  N/A |    264MiB /  2048MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0      3700  C+G   ...ost_cw5n1h2txyewy\ShellExperienceHost.exe N/A      |
|    0      4008  C+G   ...am Files (x86)\Microsoft VS Code\Code.exe N/A      |
|    0      7044  C+G   Insufficient Permissions                     N/A      |
|    0      8956  C+G   C:\Windows\explorer.exe                      N/A      |
|    0      9096  C+G   ...indows.Cortana_cw5n1h2txyewy\SearchUI.exe N/A      |
|    0      9760  C+G   ...le Japanese Input\GoogleIMEJaRenderer.exe N/A      |
|    0      9824  C+G   ...x86)\Google\Chrome\Application\chrome.exe N/A      |
|    0      9932  C+G   ...pple\Internet Services\iCloudServices.exe N/A      |
+-----------------------------------------------------------------------------+

プロセスが表示されました!
「Insufficient Permissions」がありますが、これは「dwm.exe」のようです。

GPU Memory Usageは、N/Aが出ています。
nvidia-smi.exe -qで詳細を見てみると、WDDMでは、メモリの使用量を把握できないようなので無視してOKです。

    Processes
        Process ID                  : 3700
            Type                    : C+G
            Name                    : C:\Windows\SystemApps\ShellExperienceHost_cw5n1h2txyewy\ShellExperienceHost.exe
            Used GPU Memory         : Not available in WDDM driver model
        Process ID                  : 7044
            Type                    : Insufficient Permissions
            Name                    : Insufficient Permissions
            Used GPU Memory         : Not available in WDDM driver model
        Process ID                  : 8956
            Type                    : C+G
            Name                    : C:\Windows\explorer.exe
            Used GPU Memory         : Not available in WDDM driver model
        Process ID                  : 9096
            Type                    : C+G
            Name                    : C:\Windows\SystemApps\Microsoft.Windows.Cortana_cw5n1h2txyewy\SearchUI.exe
            Used GPU Memory         : Not available in WDDM driver model
        Process ID                  : 9760
            Type                    : C+G
            Name                    : C:\Program Files (x86)\Google\Google Japanese Input\GoogleIMEJaRenderer.exe
            Used GPU Memory         : Not available in WDDM driver model
        Process ID                  : 9824
            Type                    : C+G
            Name                    : C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
            Used GPU Memory         : Not available in WDDM driver model
        Process ID                  : 9932
            Type                    : C+G
            Name                    : C:\Program Files (x86)\Common Files\Apple\Internet Services\iCloudServices.exe
            Used GPU Memory         : Not available in WDDM driver model

この状態で、TensorFlowを動かすと、

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0      3700  C+G   ...ost_cw5n1h2txyewy\ShellExperienceHost.exe N/A      |
|    0      4008  C+G   ...am Files (x86)\Microsoft VS Code\Code.exe N/A      |
|    0      7044  C+G   Insufficient Permissions                     N/A      |
|    0      8064    C   ...Local\Programs\Python\Python35\python.exe N/A      |
|    0      8956  C+G   C:\Windows\explorer.exe                      N/A      |
|    0      9096  C+G   ...indows.Cortana_cw5n1h2txyewy\SearchUI.exe N/A      |
|    0      9760  C+G   ...le Japanese Input\GoogleIMEJaRenderer.exe N/A      |
|    0      9824  C+G   ...x86)\Google\Chrome\Application\chrome.exe N/A      |
|    0      9932  C+G   ...pple\Internet Services\iCloudServices.exe N/A      |
+-----------------------------------------------------------------------------+

Pythonのプロセスが起動!
CIFAR-10のチュートリアルも問題なくGPUで動くようになりました!

試しに、画像128x128のバッチサイズ128で、400枚で試してみたところ、

2017-04-23 19:34:37.489835: I c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:908] DMA: 0
2017-04-23 19:34:37.491576: I c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:918] 0:   Y
2017-04-23 19:34:37.492104: I c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\gpu\gpu_device.cc:977] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Quadro K2000D, pci bus id: 0000:01:00.0)
2017-04-23 19:34:42.443068: W c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\bfc_allocator.cc:217] Allocator (GPU_0_bfc) ran out of memory trying to allocate 3.02GiB. The caller indicates that this is not a failure, but may mean that there could be performance gains if more memory is available.
2017-04-23 19:34:52.936364: W c:\tf_jenkins\home\workspace\nightly-win\device\gpu\os\windows\tensorflow\core\common_runtime\bfc_allocator.cc:273] Allocator (GPU_0_bfc) ran out of memory trying to allocate 96.00MiB.  Current allocation summary follows.

GPUのメモリ不足で「正常」に終了してしまいました。。。
こればっかりはGPUのスコアの問題なので仕方ないですが、PCが落ちること無く終了してくれるようになりました。
一応問題は解決です。

結論

ドライバのアップデートで、今まで回すとPC自体が落ちてしまうCIFAR-10を回すことに成功しました。 (もしかすると、バージョンを落とすのがいい場合もあるかもしれませんが )
一応、CIFAR-10は、1000ステップまで試しましたが問題なく進み、CPUの3倍くらい速く処理しています。

あとは、処理中はGPUの使用率を上げないために、ChromeとかVS Codeとか閉じれるものは閉じて回すようにしてみました。
これだけで、100MBは違うので。

低火力で回らないのは、画像サイズやバッチサイズのチューニングでなんとかなるかもしれません。
128x128の画像も、400枚程度だと96x96のバッチサイズ34ぐらいに変えると回ります。
これを1000枚、10000枚となると微妙ですが、Compute Capability 3.0のGPUだと、そもそもキツイって話ですね。。。