Wie kann verhindert werden, dass Tensorflow den gesamten GPU-Speicher zuweist?

Lesezeit: 6 Minuten

Benutzer-Avatar
Fabien C.

Ich arbeite in einer Umgebung, in der Rechenressourcen gemeinsam genutzt werden, dh wir haben ein paar Servermaschinen, die jeweils mit ein paar 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 der GPU voll ausnutzt, kann dies sogar zu einer Beschleunigung im Vergleich zum Ausführen eines Trainingsvorgangs nach dem anderen führen. 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, mehrere Benutzer gleichzeitig auf der GPU trainieren zu lassen.

Das Problem mit TensorFlow ist, dass es standardmäßig die volle Menge an verfügbarem GPU-Speicher zuweist, wenn es gestartet wird. Selbst für ein kleines zweischichtiges neuronales Netzwerk sehe ich, dass alle 12 GB des GPU-Speichers aufgebraucht sind.

Gibt es eine Möglichkeit, TensorFlow dazu zu bringen, nur beispielsweise 4 GB GPU-Speicher zuzuweisen, wenn man weiß, dass dies für ein bestimmtes Modell ausreicht?

Benutzer-Avatar
Herr

Sie können den Anteil des zuzuweisenden GPU-Speichers festlegen, wenn Sie a erstellen tf.Session durch Passieren von a tf.GPUOptions als Teil der optionalen config Streit:

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

Das per_process_gpu_memory_fraction fungiert als feste Obergrenze für die Menge an GPU-Speicher, die vom Prozess auf jeder GPU auf demselben Computer verwendet wird. Derzeit wird dieser Bruchteil einheitlich auf alle GPUs auf demselben Computer angewendet; Es gibt keine Möglichkeit, dies pro GPU festzulegen.

  • Vielen Dank. Diese Informationen sind im aktuellen Dokument ziemlich versteckt. Ich hätte es nie alleine gefunden 🙂 Wenn Sie antworten können, möchte ich Sie um zwei zusätzliche Informationen bitten: 1- Begrenzt dies die Menge des jemals verwendeten Speichers oder nur den ursprünglich zugewiesenen Speicher? (dh wird es immer noch mehr Speicher zuweisen, wenn es vom Berechnungsgraphen benötigt wird) 2- Gibt es eine Möglichkeit, dies pro GPU festzulegen?

    – Fabien C.

    11. Dezember 2015 um 1:29 Uhr

  • Zugehöriger Hinweis: Das Festlegen von CUDA_VISIBLE_DEVICES zum Beschränken von TensorFlow auf eine einzelne GPU funktioniert für mich. Sehen acceleware.com/blog/cudavisibledevices-masking-gpus

    – rd11

    12. Januar 2016 um 15:54 Uhr

  • Es scheint, dass die Speicherzuweisung etwas über die Anforderung hinausgeht, z

    – jeremy_rutman

    23. September 2017 um 17:15 Uhr


  • Ich kann das anscheinend nicht zum Laufen bringen MonitoredTrainingSession

    – Anjum Sayed

    13. Oktober 2017 um 5:34 Uhr

  • @jeremy_rutman Ich glaube, das liegt an der Kontextinitialisierung von cudnn und cublas. Dies ist jedoch nur relevant, wenn Sie Kernel ausführen, die diese Bibliotheken verwenden.

    – dbep

    20. Februar 2019 um 23:26 Uhr


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

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

  • Dies ist genau das, was ich möchte, da es in einer Mehrbenutzerumgebung sehr unpraktisch ist, die genaue Menge an zu reservierendem GPU-Speicher im Code selbst anzugeben.

    – xuancong84

    3. Oktober 2016 um 1:07 Uhr

  • Wenn Sie Keras mit einem TF-Backend verwenden, können Sie dies auch verwenden und ausführen from keras import backend as K und K.set_session(sess) Speicherbeschränkungen zu vermeiden

    – Oliver

    1. Juli 2019 um 4:52 Uhr

Benutzer-Avatar
Das Ö

Für TensorFlow 2.0 und 2.1 (Dokumente):

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

Für TensorFlow 2.2+ (Dokumente):

import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
  tf.config.experimental.set_memory_growth(gpu, True)

Die Dokumentation listet auch einige weitere Methoden auf:

  • Umgebungsvariable setzen TF_FORCE_GPU_ALLOW_GROWTH zu true.
  • Verwenden tf.config.experimental.set_virtual_device_configuration um ein hartes Limit für ein virtuelles GPU-Gerät festzulegen.

  • @AkshayLAradhya nein, das gilt nur für TF 2.0 und höher. Die anderen Antworten hier funktionieren gut für 1.13 und früher.

    – Das Ö

    1. Mai 2019 um 21:19 Uhr

  • Nicht darüber hinaus. Für TF 2.2 ist es ‘tf.config.experimental.set_memory_growth’

    – Begoodpy

    25. Juli 2020 um 16:41 Uhr


  • Da dies eine hoch bewertete Antwort ist, habe ich auf die neueste Version von TF aktualisiert.

    – Mateen Ulhaq

    28. September 2020 um 19:56 Uhr

  • @MateenUlhaq hier ist ein Link zu der Tensorflow-Dokumentation, die Sie wahrscheinlich verwendet haben: tensorflow.org/api_docs/python/tf/config/experimental/…

    – Bruststimme

    8. Oktober 2020 um 13:01 Uhr

  • Der erste Teil “Für TensorFlow 2.0 und 2.1 …” ist nicht genau. Es ist nicht in der Dokumentationsquelle referenziert und ich habe TF2.0 und als ich es getestet habe, habe ich einen Fehler bekommen. Der zweite Teil funktioniert jedoch sowohl auf TF2.0 als auch auf TF2.2+

    – saluri

    13. Oktober 2020 um 5:31 Uhr


Hier 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 zuordnet oder die Speichernutzung nur so weit erhöht, wie sie vom Prozess benötigt wird. TensorFlow bietet zwei Konfiguration Optionen in der Sitzung, um dies zu steuern. Die erste ist die allow_growth Option, die versucht, nur so viel GPU-Speicher basierend auf Laufzeitzuweisungen zuzuweisen, beginnt mit der Zuweisung von sehr wenig Speicher, und wenn Sitzungen ausgeführt werden und mehr GPU-Speicher benötigt wird, erweitern wir den vom TensorFlow-Prozess benötigten GPU-Speicherbereich.

1) Wachstum zulassen: (flexibler)

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

Die zweite Methode ist per_process_gpu_memory_fraction Option, die den Bruchteil der Gesamtspeichermenge bestimmt each sichtbare GPU sollte zugewiesen werden. Notiz: Es ist keine Freigabe von Speicher erforderlich, es kann sogar die Speicherfragmentierung verschlimmern, wenn dies erledigt ist.

2) Ordnen Sie festen Speicher zu:

Nur zuzuordnen 40% des Gesamtspeichers jeder GPU durch:

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

Notiz:
Das ist jedoch nur nützlich, wenn Sie wirklich die Menge an verfügbarem GPU-Speicher für den TensorFlow-Prozess binden möchten.

Benutzer-Avatar
Anurag

Verwenden Sie für Tensorflow Version 2.0 und 2.1 das folgende Snippet:

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

Für frühere Versionen folgendes Snippet hat bei mir funktioniert:

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

Benutzer-Avatar
GVielleicht

Alle obigen Antworten gehen von der Ausführung mit a aus sess.run() aufrufen, was in neueren Versionen von TensorFlow eher zur Ausnahme als zur Regel wird.

Bei Verwendung der tf.Estimator Framework (TensorFlow 1.4 und höher) die Möglichkeit, den Bruch an den implizit erstellten weiterzugeben MonitoredTrainingSession ist,

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)

Änderung: 04.11.2018
Als Beispiel, wenn Sie verwenden sollen tf.contrib.gan.traindann können Sie etwas Ähnliches wie unten verwenden:

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

Sie können verwenden

TF_FORCE_GPU_ALLOW_GROWTH=true

in deinen Umgebungsvariablen.

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

1092820cookie-checkWie kann verhindert werden, dass Tensorflow den gesamten GPU-Speicher zuweist?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy