wake-up-neo.net

Wie kann man verhindern, dass der Tensorflow die Gesamtheit eines GPU-Speichers zuweist?

Ich arbeite in einer Umgebung, in der Rechenressourcen gemeinsam genutzt werden, d. H., Wir haben einige Server-Computer, die jeweils mit einigen Nvidia Titan X-GPUs ausgestattet sind.

Bei kleinen bis mittelgroßen Modellen reichen die 12 GB des Titan X normalerweise aus, damit 2-3 Personen gleichzeitig auf derselben GPU trainieren können. Wenn die Modelle so klein sind, dass ein einzelnes Modell nicht alle Recheneinheiten des Titan X voll ausnutzt, kann dies tatsächlich zu einer Beschleunigung führen, wenn ein Trainingsvorgang nach dem anderen ausgeführt wird. Selbst in Fällen, in denen der gleichzeitige Zugriff auf die GPU die individuelle Trainingszeit verlangsamt, ist es immer noch schön, die Flexibilität zu haben, dass mehrere Benutzer gleichzeitig auf den GPUs laufen.

Das Problem mit TensorFlow besteht darin, dass standardmäßig der GPU den gesamten verfügbaren Speicherplatz auf der GPU zuweist, wenn sie gestartet wird. Selbst für ein kleines 2-Layer-Neural-Netzwerk sehe ich, dass die 12 GB des Titan X verbraucht sind.

Gibt es eine Möglichkeit, TensorFlow nur etwa 4 GB GPU-Speicher zuweisen zu lassen, wenn man weiß, dass diese Menge für ein bestimmtes Modell ausreicht?

193
Fabien C.

Sie können den Anteil des GPU-Speichers festlegen, der beim Erstellen eines tf.Session zugewiesen werden soll, indem Sie einen tf.GPUOptions als Teil des optionalen config-Arguments übergeben:

# 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))

per_process_gpu_memory_fraction fungiert als harte Obergrenze für den GPU-Arbeitsspeicher, der vom Prozess auf jeder GPU auf demselben Computer verwendet wird. Derzeit wird diese Fraktion einheitlich auf alle GPUs auf derselben Maschine angewendet. Es gibt keine Möglichkeit, dies auf GPU-Basis festzulegen.

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

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

142
Sergey Demyanov

Hier ist ein Auszug aus dem Buch Deep Learning with TensorFlow 

In einigen Fällen ist es wünschenswert, dass der Prozess nur eine Teilmenge des verfügbaren Speichers zuweist oder nur die Speicherverwendung erhöht, wie sie von dem Prozess benötigt wird. TensorFlow bietet zwei KonfigurationsOptionen für die Sitzung, um dies zu steuern. Die erste ist die allow_growth-Option, mit der versucht wird, nur so viel GPU-Speicher auf der Grundlage von Laufzeitzuweisungen zuzuordnen. Zunächst wird sehr wenig Speicher zugewiesen. Wenn Sitzungen ausgeführt werden und mehr GPU-Speicher erforderlich ist, erweitern wir den von der TensorFlow-Prozess.

1) Wachstum zulassen: (flexibler)

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

Die zweite Methode ist die per_process_gpu_memory_fraction-Option, mit der der Bruchteil der Gesamtspeichermenge festgelegt wird, der die each visible GPU zugewiesen werden soll. Hinweis: Keine Speicherfreigabe erforderlich, kann die Speicherfragmentierung sogar verschlimmern, wenn dies erfolgt ist.

2) Festen Speicher zuweisen :

Um nur 40% des Gesamtspeichers jeder GPU zuzuordnen, geben Sie Folgendes ein:

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

Hinweis: Dies ist jedoch nur nützlich, wenn Sie wirklich die Menge des verfügbaren GPU-Speichers für den TensorFlow-Prozess binden möchten.

28
user1767754

Aktualisiert für TensorFlow 2.0 Alpha und höher

Von den 2.0 Alpha-Dokumenten ist die Antwort jetzt nur eine Zeile, bevor Sie etwas mit TensorFlow tun:

import tensorflow as tf
tf.config.gpu.set_per_process_memory_growth(True)
10
Theo

Alle obigen Antworten setzen die Ausführung mit einem Aufruf von sess.run() voraus, der zur Ausnahme und nicht zur Regel in den letzten Versionen von TensorFlow wird.

Bei Verwendung des tf.Estimator-Frameworks (TensorFlow 1.4 und höher) können Sie den Bruchteil an die implizit erstellte MonitoredTrainingSession übergeben,

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)

Ähnlich im Eager-Modus (TensorFlow 1.5 und höher), 

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

Edit: 11-04-2018 Wenn Sie tf.contrib.gan.train verwenden, können Sie beispielsweise Folgendes verwenden:

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

Shameless Plug: Wenn Sie den von der GPU unterstützten Tensorflow installieren, weist die Sitzung zunächst alle GPU zu, unabhängig davon, ob Sie nur CPU oder GPU verwenden. Ich kann meinen Tipp hinzufügen, dass Sie selbst das Diagramm so einstellen, dass nur CPU verwendet wird. Sie sollten dieselbe Konfiguration (wie oben beantwortet :)) festlegen, um die unerwünschte GPU-Belegung zu verhindern. 

In der interaktiven Benutzeroberfläche wie IPython sollten Sie auch diese Konfiguration festlegen, da sonst der gesamte Speicher zugewiesen wird und der andere fast keinen Speicher mehr hat. Das ist manchmal schwer zu bemerken. 

3
lerner

Tensorflow 2.0 Beta und (wahrscheinlich) darüber hinaus

Die API wurde erneut geändert. Es kann jetzt gefunden werden in:

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

Aliase:

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

https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/config/experimental/set_memory_growthhttps://www.tensorflow.org/beta/ guide/using_gpu #limited_gpu_memory_growth

1
mx_muc

Sie können verwenden

TF_FORCE_GPU_ALLOW_GROWTH=true

in Ihren Umgebungsvariablen.

In Tensorflow Code:

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

ich habe versucht, das unet auf Voc-Daten zu trainieren, aber aufgrund der großen Bildgröße wird der Speicher beendet. ich habe alle oben genannten tipps ausprobiert, auch mit chargengröße == 1, jedoch ohne verbesserung. Manchmal verursacht die TensorFlow-Version auch Speicherprobleme. versuchen Sie es mit 

pip install tensorflow-gpu == 1.8.0

0
Khan

Nun, ich bin neu im Tensorflow, ich habe Geforce 740m oder etwas GPU mit 2 GB RAM, ich habe mnist handgeschriebene Art von Beispiel für eine Muttersprache mit Trainingsdaten mit 38700 Bildern und 4300 Testbildern ausgeführt und versuchte, Präzision zu erhalten. F1, der folgenden Code als sklearn verwendet, gab mir keine genauen Ergebnisse. Nachdem ich dies zu meinem vorhandenen Code hinzugefügt hatte, bekam ich GPU-Fehler.

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)

außerdem war mein Modell schwer, ich glaube, nach 147, 148 Epochen bekam ich einen Gedächtnisfehler, und dann dachte ich mir, warum er keine Funktionen für die Aufgaben erstellt. Ich weiß nicht, ob es in Tensrorflow auf diese Weise funktioniert, aber ich dachte, ob eine lokale Variable ist Wenn es außerhalb des Geltungsbereichs Speicher freigibt und ich die oben genannten Elemente für das Training und Testen in Modulen definiert habe, konnte ich 10000 Epochen ohne Probleme erreichen. Ich hoffe, das hilft.

0
Imran Ud Din