Tensorflow'un bir GPU belleğinin toplamını ayırmasını nasıl önleyebilirim?


282

Hesaplamalı kaynakların paylaşıldığı bir ortamda çalışıyorum, yani her biri birkaç Nvidia Titan X GPU ile donatılmış birkaç sunucu makinemiz var.

Küçük ve orta boy modeller için, 12 GB Titan X genellikle 2-3 kişinin aynı GPU'da aynı anda eğitim alması için yeterlidir. Modeller, tek bir modelin GPU'nun tüm hesaplama birimlerinden tam olarak yararlanamayacak kadar küçükse, bu aslında bir eğitim sürecini birbiri ardına yürütmeye kıyasla hızlanmaya neden olabilir. GPU'ya eşzamanlı erişimin bireysel eğitim süresini yavaşlattığı durumlarda bile, birden fazla kullanıcının aynı anda GPU üzerinde eğitim alma esnekliğine sahip olmak hala iyidir.

TensorFlow ile ilgili sorun, varsayılan olarak, başlatıldığında kullanılabilir GPU belleğinin tamamını ayırmasıdır. Küçük bir iki katmanlı sinir ağı için bile, 12 GB'lık GPU belleğinin tamamının tükendiğini görüyorum.

TensorFlow'un, örneğin belirli bir model için bunun yeterli olduğunu biliyorsanız, 4 GB GPU belleği ayırmasını sağlamanın bir yolu var mı?

Yanıtlar:


292

İsteğe bağlı argümanın tf.Sessionbir tf.GPUOptionsparçası olarak a ileterek, oluşturduğunuzda ayrılacak GPU belleğinin bir kısmını ayarlayabilirsiniz config:

# Assume that you have 12GB of GPU memory and want to allocate ~4GB:
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)

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

İşlem per_process_gpu_memory_fractiontarafından aynı makinedeki her GPU'da kullanılacak GPU belleği miktarında kesin bir üst sınır görevi görür. Şu anda, bu fraksiyon aynı makinedeki tüm GPU'lara eşit olarak uygulanmaktadır; bunu GPU'ya göre ayarlamanın bir yolu yoktur.


3
Çok teşekkür ederim. Bu bilgi mevcut dokümanda oldukça gizli. Ben kendim asla bulamazdım :-) Eğer cevap verebilir, ben iki ek bilgi istemek istiyorum: 1- Bu şimdiye kadar kullanılan bellek miktarını sınırlamak, ya da sadece başlangıçta tahsis bellek? (yani, hesaplama grafiğine ihtiyaç duyulması halinde daha fazla bellek ayıracaktır) 2- Bunu GPU'ya göre ayarlamanın bir yolu var mı?
Fabien

15
İlgili not: TUsorFlow'u tek bir GPU ile sınırlamak için CUDA_VISIBLE_DEVICES ayarının yapılması benim için çalışıyor. Bkz. Acceleware.com/blog/cudavisibledevices-masking-gpus
rd11

2
bellek ayırma istek üzerine biraz gider gibi görünüyor, e..g 24443MiB gpu üzerinde per_process_gpu_memory_fraction = 0.0909 istedi ve 2627MiB alarak süreçler var
jeremy_rutman 23:17

2
Bunu çalışmak için alamıyorum gibiMonitoredTrainingSession
Anjum Sayed

2
@jeremy_rutman Bunun cudnn ve cublas bağlamının başlatılmasından kaynaklandığını düşünüyorum. Bu, yalnızca bu kütüphaneleri kullanan çekirdekleri yürütüyorsanız geçerlidir.
Daniel

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

https://github.com/tensorflow/tensorflow/issues/1578


13
Çok kullanıcılı bir ortamda, kodun kendisinde saklanacak GPU belleğinin tam miktarını belirtmek çok zordur çünkü bu tam olarak istediğim şey.
xuancong84

4
Bir TF arka uca sahip keras kullanıyorsanız Ayrıca, bu kullanabilir ve çalıştırabilir from keras import backend as Kve K.set_session(sess)önlemek hafıza sınırlamalara
Oliver

50

İşte Kitaptan bir alıntı Deep Learning with TensorFlow

Bazı durumlarda, işlemin yalnızca kullanılabilir belleğin bir alt kümesini tahsis etmesi ya da yalnızca işlemin gerektirdiği şekilde bellek kullanımını büyütmesi istenir. TensorFlow bunu kontrol etmek için oturumda iki yapılandırma seçeneği sunar. Birincisi allow_growth, yalnızca çalışma zamanı ayırmalarına göre çok fazla GPU belleği ayırmaya çalışan seçenek, çok az bellek ayırmaya başlar ve oturumlar çalıştıkça ve daha fazla GPU belleği gerektiğinde, TensorFlow'un ihtiyaç duyduğu GPU bellek bölgesini genişletiriz süreci.

1) Büyümeye izin verin: (daha esnek)

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

İkinci yöntem, görünür GPU'nun tahsis edilmesi gereken per_process_gpu_memory_fractiontoplam bellek miktarının kısmını belirleyen seçenektir each. Not: Belleğin serbest bırakılması gerekmez, bittiğinde bellek parçalanmasını daha da kötüleştirebilir.

2) Sabit bellek ayırın :

40%Her GPU'nun toplam belleğini yalnızca şu şekilde ayırmak için:

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

Not: Bu, yalnızca TensorFlow işleminde kullanılabilir GPU belleği miktarını gerçekten bağlamak istiyorsanız yararlıdır.


Sorunuz söz konusu olduğunda, 2. seçenek sizin için yararlı olabilir. Genel olarak GPU ve dinamik ağlarda çalışan birden fazla uygulamanız yoksa 'Büyümeye izin ver' seçeneğini kullanmak mantıklıdır.
aniket


19

Yukarıdaki tüm cevaplar sess.run(), TensorFlow'un son sürümlerinde kural yerine istisna haline gelen bir çağrı ile yürütüldüğünü varsayar.

tf.EstimatorÇerçeveyi (TensorFlow 1.4 ve üzeri) kullanırken kesriyi dolaylı olarak oluşturulan kısma geçirmenin yolu MonitoredTrainingSession,

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
conf = tf.ConfigProto(gpu_options=opts)
trainingConfig = tf.estimator.RunConfig(session_config=conf, ...)
tf.estimator.Estimator(model_fn=..., 
                       config=trainingConfig)

Benzer şekilde Eager modunda (TensorFlow 1.5 ve üstü),

opts = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)
conf = tf.ConfigProto(gpu_options=opts)
tfe.enable_eager_execution(config=conf)

Düzenleme: 11-04-2018 Örnek olarak, eğer kullanacaksanız tf.contrib.gan.train, aşağıdakine benzer bir şey kullanabilirsiniz:

tf.contrib.gan.gan_train(........, config=conf)

16

Tensorflow sürüm 2.0 ve 2.1 için aşağıdaki snippet'i kullanın :

 import tensorflow as tf
 gpu_devices = tf.config.experimental.list_physical_devices('GPU')
 tf.config.experimental.set_memory_growth(gpu_devices[0], True)

Önceki sürümlerde , aşağıdaki snippet benim için çalışırdı:

import tensorflow as tf
tf_config=tf.ConfigProto()
tf_config.gpu_options.allow_growth=True
sess = tf.Session(config=tf_config)

10

Tensorflow 2.0 Beta ve (muhtemelen) ötesinde

API tekrar değişti. Artık şurada bulunabilir:

tf.config.experimental.set_memory_growth(
    device,
    enable
)

Takma adlar:

  • tf.compat.v1.config.experimental.set_memory_growth
  • tf.compat.v2.config.experimental.set_memory_growth

Referanslar:

Ayrıca bakınız: Tensorflow - GPU kullanın : https://www.tensorflow.org/guide/gpu

Tensorflow 2.0 Alpha için bakınız: bu cevap


9

Kullanabilirsiniz

TF_FORCE_GPU_ALLOW_GROWTH=true

ortam değişkenlerinizde.

In tensorflow kod:

bool GPUBFCAllocator::GetAllowGrowthValue(const GPUOptions& gpu_options) {
  const char* force_allow_growth_string =
      std::getenv("TF_FORCE_GPU_ALLOW_GROWTH");
  if (force_allow_growth_string == nullptr) {
    return gpu_options.allow_growth();
}

5

Utanmaz fiş: GPU destekli Tensorflow'u yüklerseniz, oturum ilk olarak tüm CPU'yu yalnızca CPU veya GPU kullanacak şekilde ayarlasanız da ayırır. Grafiği yalnızca CPU kullanacak şekilde ayarlasanız bile, istenmeyen GPU işgalini önlemek için aynı yapılandırmayı (yukarıda cevaplandığı gibi :) ayarlamanız gerektiğini ekleyebilirim.

IPython gibi etkileşimli arayüzlerde de bu yapılandırmayı ayarlamanız gerekir, aksi takdirde tüm belleği tahsis eder ve diğerleri için neredeyse hiç bırakmaz. Bunu fark etmek bazen zor olabilir.


3

For Tensorflow 2.0 Bu bu çözüm benim için çalıştı. (TF-GPU 2.0, Windows 10, GeForce RTX 2070)

physical_devices = tf.config.experimental.list_physical_devices('GPU')
assert len(physical_devices) > 0, "Not enough GPU hardware devices available"
tf.config.experimental.set_memory_growth(physical_devices[0], True)

1
TF-GPU 2.0, Ubuntu 16.04.6, Tesla K80 kullanıyorum.
azar

@azar - Paylaştığınız için teşekkürler. Hem Ubuntu hem de Windows için aynı sorun ilginç. Her nasılsa, donanıma yaklaşırken sorunların her zaman farklı olduğunu düşünüyorum. Belki bu zaman geçtikçe daha az oluyor - belki iyi bir şey.
Sunsetquest

3

Tensorflow 2 kullanıyorsanız aşağıdakileri deneyin:

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

Tensorflow 2 için çalışma
mobin alhassan

1

Voc veri seti üzerinde unet eğitmeye çalıştım ama büyük görüntü boyutu nedeniyle bellek bitiyor. i bile hiçbir gelişme toplu boyutu == 1 ile çalıştı yukarıdaki tüm ipuçlarını çalıştı. bazen TensorFlow sürümü de bellek sorunlarına neden olur. kullanarak dene

pip install tensorflow-gpu == 1.8.0


1

Tensorflow'da yeniyim, Geforce 740m veya 2GB ram ile GPU'um var, 38700 görüntü ve 4300 test görüntüsü içeren eğitim verileri ile yerel bir dil için mnist el yazısı türünü çalıştırıyordum ve hassas, hatırlamaya çalışıyordum, Aşağıdaki kodu sklearn olarak kullanan F1 bana kesin sonuçlar vermiyordu. mevcut koduma eklediğimde GPU hataları almaya başladım.

TP = tf.count_nonzero(predicted * actual)
TN = tf.count_nonzero((predicted - 1) * (actual - 1))
FP = tf.count_nonzero(predicted * (actual - 1))
FN = tf.count_nonzero((predicted - 1) * actual)

prec = TP / (TP + FP)
recall = TP / (TP + FN)
f1 = 2 * prec * recall / (prec + recall)

artı benim model ağır oldu sanırım, 147, 148 dönemden sonra bellek hatası alıyordum, ve sonra neden görevler için işlevler oluşturmuyordum, bu yüzden tensrorflow'da bu şekilde çalışıp çalışmadığını bilmiyorum, ama yerel bir değişken olup olmadığını düşündüm kullanılan ve kapsam dışı zaman bellek serbest bırakabilir ve modüllerde eğitim ve test için yukarıdaki öğeleri tanımladı, ben herhangi bir sorun olmadan 10000 dönem elde edebildi, umarım bu yardımcı olacaktır ..


TF'nin yararına hayran kaldım ama aynı zamanda bellek kullanımı ile de şaşırıyorum. CPU python üzerinde kullanılan çiçek veri kümesi üzerinde bir eğitim işi için 30 GB ya da öylesine TF örnekleri ayırabilir. Çılgın.
Eric M

1
# allocate 60% of GPU memory 
from keras.backend.tensorflow_backend import set_session
import tensorflow as tf 
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.6
set_session(tf.Session(config=config))

Sağlanan cevap, incelenmek üzere Düşük Kaliteli Yazı olarak işaretlendi. İşte için bazı kurallar vardır Ben iyi cevap yazmak nasıl? . Bu verilen cevap doğru olabilir, ancak bir açıklamadan yararlanabilir. Yalnızca kod yanıtları "iyi" yanıtlar olarak değerlendirilmez. Gönderen inceleme .
Trenton McKinney
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.