2016-09-13 6 views
7

ニューラルネットワークを訓練し始めたとき、それはCUDA_ERROR_OUT_OF_MEMORYに合格しましたが、訓練は間違いなく続行される可能性があります。テンソルフローのCUDA_ERROR_OUT_OF_MEMORY

I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally 
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally 
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally 
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally 
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally 
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties: 
name: GeForce GTX 1080 
major: 6 minor: 1 memoryClockRate (GHz) 1.7335 
pciBusID 0000:01:00.0 
Total memory: 7.92GiB 
Free memory: 7.81GiB 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0: Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device:0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0) 
E tensorflow/stream_executor/cuda/cuda_driver.cc:965] failed to allocate 4.00G (4294967296 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY 
Iter 20, Minibatch Loss= 40491.636719 
... 

そしてnvidia-smiコマンドを使用した後、それを取得:

+-----------------------------------------------------------------------------+ 
| NVIDIA-SMI 367.27     Driver Version: 367.27        
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. 
|===============================+======================+======================| 
| 0 GeForce GTX 1080 Off | 0000:01:00.0  Off |     N/A | 
| 40% 61C P2 46W/180W | 8107MiB/8111MiB |  96%  Default | 
+-------------------------------+----------------------+----------------------+ 
| 1 GeForce GTX 1080 Off | 0000:02:00.0  Off |     N/A | 
| 0% 40C P0 40W/180W |  0MiB/8113MiB |  0%  Default | 
+-------------------------------+----------------------+----------------------+ 
                       │ 
+-----------------------------------------------------------------------------+ 
| Processes:              GPU Memory | 
| GPU  PID Type Process name        Usage  | 
|=============================================================================| 
| 0  22932 C python          8105MiB | 
+-----------------------------------------------------------------------------+ 

を私がコメントした後、私はそれが本当に必要とGPUメモリを使用していたので、私は次のようにgpu_options.allow_growth = True【選択ログがある設定しましたgpu_options.allow_growth = True、私は再びネットを訓練し、すべて正常だった。 CUDA_ERROR_OUT_OF_MEMORYの問題はありませんでした。最後に、nvidia-smiコマンドを実行し、それが取得されます。

+-----------------------------------------------------------------------------+ 
| NVIDIA-SMI 367.27     Driver Version: 367.27        
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. 
|===============================+======================+======================| 
| 0 GeForce GTX 1080 Off | 0000:01:00.0  Off |     N/A | 
| 40% 61C P2 46W/180W | 7793MiB/8111MiB |  99%  Default | 
+-------------------------------+----------------------+----------------------+ 
| 1 GeForce GTX 1080 Off | 0000:02:00.0  Off |     N/A | 
| 0% 40C P0 40W/180W |  0MiB/8113MiB |  0%  Default | 
+-------------------------------+----------------------+----------------------+ 
                       │ 
+-----------------------------------------------------------------------------+ 
| Processes:              GPU Memory | 
| GPU  PID Type Process name        Usage  | 
|=============================================================================| 
| 0  22932 C python          7791MiB | 
+-----------------------------------------------------------------------------+ 

私はそれについて2つの質問があります。なぜCUDA_OUT_OF_MEMORYが出て手続きが正常に行われたのですか?なぜコメントallow_growth = Trueのコメント後にメモリ使用量が小さくなったのですか?

答えて

5

デフォルトでは、tensorflowは、高価なメモリ管理を避けるため、GPUメモリの端数per_process_gpu_memory_fractionをプロセスに割り当てようとします。 (コメントを参照してください)。
これは、失敗して、CUDA_OUT_OF_MEMORY警告を発生させる可能性があります。 このケースでは、CPU opsまたはallow_growth=Trueを使用して、フォールバックが何かわかりません。
これは、他のプロセスが現時点でGPUを使用している場合に発生します(例えば、tensorflowを実行する2つのプロセスを起動した場合)。 デフォルトの動作は約95%のメモリを必要とします(このanswerを参照)。

allow_growth = Trueを使用すると、GPUメモリはあらかじめ割り当てられておらず、必要に応じて拡張できます。これによりメモリ使用量が少なくなります(デフォルトのオプションはメモリ全体を使用するためです)が、CPU/GPUインタラクションの最も効率的な部分ではないメモリのより複雑なハンドリングが必要なため、 )。

+0

私は1つのプロセスのみを起動します。私は 'allow_growth = True'とコメントした後、テンソルフローはデフォルトオプションのためにメモリ全体を使用するべきですが、実際には' allow_growth = True'を使ったときに8107Mを超えない7793Mメモリしか使用しませんでした)。そのトレーニングでは、実際にはあまりにも多くのメモリが必要ないことが示されます。 – luohao

+0

デフォルトでは、tensorflowはメモリ全体のgpuメモリの95%しか考慮しないので、7793MBが正しいように見えます(余分なリンクを参照)。 'allow_growth'でより多くのメモリを使用することは、あなたのネットワークのサイズに関連しているはずです(私はそれについての情報源はまだ見つかりませんでした...)。たとえば、GPUに2つの4GB変数を割り当てると、 'allow_growth'(〜8GB)に収まるが、あらかじめ割り当てられたメモリには収まらないので、' CUDA_ERROR_OUT_OF_MEMORY'警告が発生します –

4

誰かにとっても関係がある場合は、最初の実行が中止された後、Keras/Tensorflowを2回目に実行しようとしたときにこの問題が発生しました。 GPUメモリはまだ割り当てられているため、再度割り当てることはできません。これは、GPUを使用するすべてのPythonプロセスを手動で終了するか、既存のターミナルを閉じて、新しいターミナルウィンドウで再度実行することによって解決されました。

関連する問題