python - tensorflow cuda 10




Come impedire a tensorflow di allocare la totalità di una memoria GPU? (7)

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.


Ecco un estratto dal libro Deep Learning with TensorFlow

In alcuni casi è desiderabile che il processo alloca solo un sottoinsieme della memoria disponibile o aumenti l'utilizzo della memoria solo quando è necessario al processo. TensorFlow fornisce due opzioni di configurazione sulla sessione per controllarlo. La prima è l'opzione allow_growth , che tenta di allocare solo la quantità di memoria GPU basata sulle allocazioni di runtime, inizia allocando pochissima memoria e man mano che le sessioni vengono eseguite e è necessaria più memoria GPU, estendiamo l'area di memoria GPU necessaria per Processo TensorFlow.

1) Consentire la crescita: (più flessibile)

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

Il secondo metodo è per_process_gpu_memory_fraction opzione per_process_gpu_memory_fraction , che determina la frazione della quantità complessiva di memoria che each GPU visibile dovrebbe essere allocata. Nota: non è necessario il rilascio di memoria, al termine può persino peggiorare la frammentazione della memoria.

2) Allocare memoria fissa :

Per allocare solo il 40% della memoria totale di ciascuna GPU:

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

Nota: è utile solo se si desidera veramente associare la quantità di memoria GPU disponibile sul processo TensorFlow.


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

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)





nvidia-titan