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
根本的な解決策はわかりませんでしたが、とりあえずドライバをアップデートをするといいみたいです。
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だと、そもそもキツイって話ですね。。。