2016-04-29 46 views
13

'da Gpu belleğini kapatmayı nasıl çözebilirim? TensorFlow'da 2 konv katmanları ve tam conect katmanı olan MNIST demosunu çalıştırdım, '2.59GiB ayırmaya çalışırken anılarının tükendiği' mesajım var. , ama bu toplam bellek 4.69GiB olduğunu ve boş hafıza 3.22GiB olduğunu, 2.59GiB ile nasıl durabilir? Ve daha büyük ağ ile gpu belleği nasıl yönetebilirim? Sadece gpu belleğini en iyi şekilde nasıl kullanacağımı ve nasıl olduğunu bilmek istiyorum, bellek için nasıl ayrılacağını değil endişe ediyorumTensorFlow

+0

Tekrarlama olabilir: //stackoverflow.com/questions/34199233/how-to-prevent-tensorflow-from-allocating-the-totality-of-a-gpu-memory) –

+0

Daha önce gördüm, ama gpu belleği önceden ayırmak anlamına gelir, bellek eksik değil – Fangxin

cevap

7

Bununla ilgili değil. her şeyden önce, gpu'nuzu izleyerek ne zaman çalışacağını anlayabilirsiniz. Örneğin, bir nvidia gpu'nuz varsa bunu watch -n 1 nvidia-smi komutuyla kontrol edebilirsiniz. Ancak çoğu durumda, gpu belleğinin maksimum bölümünü ayarlamadıysanız, neredeyse tüm boş belleği ayırır. senin sorunun gpu için yeterli hafıza eksikliği. CNN ağları tamamen ağırdır. Ağınızı beslemeye çalışırken, tüm verilerinizi YAPMAYIN. Düşük besleme boyutlarında bu besleme prosedürünü yapın.

+4

Oldukça geniş bir ağım var (CNN + LSTM). Giriş verilerimin boyutu, batch_size = 5, (5x396x396) - bu bir 3D cilt. Yani oldukça küçük bir parti boyutu. 8GB RAM ile GTX 1070 üzerinde koşuyorum, ancak hala hafızam tükeniyor. Bildiğiniz herhangi bir geçici çözüm var mı? Geçici çözümlerin ana hatlarını veren herhangi bir eğitim var mı? –

+0

Sadece toplu boyut nedeniyle olmayabilir. Giriş partileri yapmak için herhangi bir kuyruk kullanıyor musunuz ('tf.train.shuffle_batch' gibi)? Eğer varsa, sıranın kapasitesini kontrol edin. – Nandeesh

8

Bir GTX 970 üzerinde küçük bir CNN eğitimi yaparken bellek hatalarıyla karşılaşıyordum. Bir şekilde bir fluke ile, TensorFlow'un gerektiğinde (ön taraf yerine) GPU'ya bellek ayırmasını söylemenin tüm sorunlarımı çözdüğünü keşfettim . Bu aşağıdaki Python kodu kullanarak yapılabilir:

config = tf.ConfigProto() 
    config.gpu_options.allow_growth = True 
    sess = tf.Session(config = config) 

Daha önce, TensorFlow ~ GPU belleğine% 90'ını ön tahsis edecek. Ancak, bilinmeyen bir nedenden ötürü, bu, ağın boyutunu artırdığımda daha sonra bellek hatalarıyla sonuçlanacaktır. Yukarıdaki kodu kullanarak, artık OOM hatalarım yok.

+0

Bu, keras kullanıyorum bile betiğimde çalışır – Hong

2

TensorFlow, varsayılan olarak, tüm GPU'ların (CUDA_VISIBLE_DEVICES'ye tabi) GPU belleğinin neredeyse tamamını işleme alır. Bu, bellek parçalanmasını azaltarak cihazlar üzerindeki nispeten değerli GPU bellek kaynaklarını daha verimli bir şekilde kullanmak için yapılır.

TensorFlow, bunu kontrol etmek için Oturumda iki Yapılandırma seçeneği sunar.

config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config, ...)

ikinci yöntem toplam miktar kısmını belirler per_process_gpu_memory_fraction seçenektir:

ilk çalışma zamanı tahsisleri göre sadece çok grafik işlemcisi bellek ayırmaya çalışır allow_growth seçenektir Her görünür GPU'nun ayrılması gereken bellek. Örneğin, sadece her GPU toplam belleğin% 40 ayırmak TensorFlow söyleyebilir:

config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.4 session = tf.Session(config=config, ...)

[Nasıl GPU belleğine bütünlüğünü ayırmalarına tensorflow önlemek için?] (http