python Come impedire a tensorflow di allocare la totalità di una memoria GPU?




tensorflow cuda 10 (8)

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

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

Lavoro in un ambiente in cui sono condivise risorse computazionali, ad esempio, abbiamo alcune macchine server dotate di alcune GPU Nvidia Titan X ciascuna.

Per i modelli di dimensioni medio-piccole, i 12 GB di Titan X sono in genere sufficienti per 2-3 persone per eseguire l'allenamento contemporaneamente sulla stessa GPU. Se i modelli sono abbastanza piccoli che un singolo modello non sfrutta appieno tutte le unità computazionali di Titan X, ciò può effettivamente comportare una velocità rispetto all'esecuzione di un processo di allenamento dopo l'altro. Anche nei casi in cui l'accesso simultaneo alla GPU rallenta il tempo di formazione individuale, è comunque bello avere la flessibilità di avere più utenti che eseguono cose contemporaneamente sulle GPU.

Il problema con TensorFlow è che, per impostazione predefinita, alloca l'intera quantità di memoria disponibile sulla GPU all'avvio. Anche per una piccola rete neurale a 2 strati, vedo che i 12 GB di Titan X sono esauriti.

C'è un modo per fare in modo che TensorFlow alloca, per esempio, 4 GB di memoria GPU, se si sa che quella quantità è sufficiente per un determinato modello?



Bene, sono nuovo di Tensorflow, ho Geforce 740m o qualcosa di simile a una GPU con ram da 2 GB, stavo eseguendo un mnist tipo manoscritto di esempio per una lingua madre con dati di allenamento contenenti 38700 immagini e 4300 immagini di test e stavo cercando di ottenere precisione, richiamo, F1 usando il seguente codice come sklearn non mi dava precisioni precise. una volta aggiunto questo al mio codice esistente ho iniziato a ricevere errori GPU.

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)

inoltre il mio modello era pesante suppongo che stavo ottenendo un errore di memoria dopo 147, 148 epoche, e poi ho pensato perché non creare funzioni per le attività, quindi non so se funziona in questo modo in tensrorflow, ma ho pensato che se una variabile locale è usato e quando fuori portata può liberare memoria e ho definito gli elementi di cui sopra per l'addestramento e il test nei moduli, sono stato in grado di raggiungere 10000 epoche senza problemi, spero che questo possa aiutare.


Puoi usare

TF_FORCE_GPU_ALLOW_GROWTH=true

nelle variabili di ambiente.

Nel codice tensorflow :

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();
}

ho provato a formare unet su set di dati voc ma a causa delle enormi dimensioni dell'immagine, la memoria finisce. ho provato tutti i suggerimenti di cui sopra, anche provato con dimensioni del lotto == 1, ma senza alcun miglioramento. a volte la versione TensorFlow causa anche problemi di memoria. prova usando

pip install tensorflow-gpu == 1.8.0


Tutte le risposte sopra presuppongono l'esecuzione con una chiamata sess.run() , che sta diventando l'eccezione anziché la regola nelle versioni recenti di TensorFlow.

Quando si utilizza il framework tf.Estimator (TensorFlow 1.4 e versioni successive), il modo per passare la frazione lungo al MonitoredTrainingSession creato implicitamente è,

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)

Allo stesso modo in modalità Eager (TensorFlow 1.5 e versioni successive),

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

Modifica: 11-04-2018 Ad esempio, se si desidera utilizzare tf.contrib.gan.train , è possibile utilizzare qualcosa di simile a muggito:

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

Plug senza vergogna: se installi la GPU supportata da Tensorflow, la sessione alloca prima tutte le GPU indipendentemente dal fatto che tu lo imposti per utilizzare solo CPU o GPU. Posso aggiungere il mio suggerimento che anche tu imposti il ​​grafico per utilizzare solo la CPU, dovresti impostare la stessa configurazione (come indicato sopra :)) per evitare l'occupazione indesiderata della GPU.

E nell'interfaccia interattiva come IPython dovresti anche impostare tale configurazione, altrimenti allocherà tutta la memoria e non ne lascerà quasi nessuna per gli altri. Questo a volte è difficile da notare.






nvidia-titan