Technologieaustausch

Eine praktische Anleitung zur effizienten Verwaltung des TensorFlow 2-GPU-Speichers

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Vorwort

Wenn Sie TensorFlow 2 für Training oder Vorhersagen verwenden, ist die ordnungsgemäße Verwaltung des GPU-Speichers von entscheidender Bedeutung. Wenn der GPU-Speicher nicht effektiv verwaltet und freigegeben wird, kann es zu Speicherlecks kommen, die sich auf nachfolgende Rechenaufgaben auswirken können. In diesem Artikel untersuchen wir verschiedene Möglichkeiten, GPU-Speicher effektiv freizugeben, sowohl auf herkömmliche Weise als auch wenn eine Aufgabe zwangsweise beendet werden muss.

1. Konventionelle Methoden zur Videospeicherverwaltung
1. Standardbild zurücksetzen

Jedes Mal, wenn Sie ein neues TensorFlow-Diagramm ausführen, rufen Sie auf tf.keras.backend.clear_session() um das aktuelle TensorFlow-Diagramm zu löschen und Speicher freizugeben.

import tensorflow as tf
tf.keras.backend.clear_session()
2. Begrenzen Sie die GPU-Speichernutzung

Durch Festlegen der Videospeicher-Nutzungsrichtlinie können Sie verhindern, dass der GPU-Videospeicher zu stark belegt wird.

  • Erhöhen Sie die Videospeichernutzung nach Bedarf

    import tensorflow as tf
    
    gpus = tf.config.experimental.list_physical_devices('GPU')
    if gpus:
        try:
            for gpu in gpus:
                tf.config.experimental.set_memory_growth(gpu, True)
        except RuntimeError as e:
            print(e)
    
  • Beschränken Sie die Nutzung des Videospeichers

    import tensorflow as tf
    
    gpus = tf.config.experimental.list_physical_devices('GPU')
    if gpus:
        try:
            tf.config.experimental.set_virtual_device_configuration(
                gpus[0],
                [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=4096)])  # 限制为 4096 MB
        except RuntimeError as e:
            print(e)
    
3. Geben Sie den GPU-Speicher manuell frei

Nach dem Training oder der Vorhersage verwenden gc Module und die Speicherverwaltungsfunktionen von TensorFlow geben GPU-Speicher manuell frei.

import tensorflow as tf
import gc

tf.keras.backend.clear_session()
gc.collect()
4. Verwendung with Kontext der Anweisungsverwaltung

Wird im Trainings- oder Vorhersagecode verwendet with Anweisung zur automatischen Verwaltung der Ressourcenfreigabe.

import tensorflow as tf

def train_model():
    with tf.device('/GPU:0'):
        model = tf.keras.models.Sequential([
            tf.keras.layers.Dense(64, activation='relu', input_shape=(32,)),
            tf.keras.layers.Dense(10, activation='softmax')
        ])
        model.compile(optimizer='adam', loss='categorical_crossentropy')
        # 假设 X_train 和 y_train 是训练数据
        model.fit(X_train, y_train, epochs=10)

train_model()
2. Videospeicherverwaltung beim erzwungenen Beenden von Aufgaben

Manchmal müssen wir die TensorFlow-Aufgabe zwangsweise beenden, um GPU-Speicher freizugeben.Verwenden Sie in diesem Fall Pythonsmultiprocessing Modul bzwos Module können Ressourcen effizient verwalten.

1. Verwendung multiprocessing Modul

Durch die Ausführung von TensorFlow-Aufgaben in separaten Prozessen kann der gesamte Prozess abgebrochen werden, um bei Bedarf Videospeicher freizugeben.

import multiprocessing as mp
import tensorflow as tf
import time

def train_model():
    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(64, activation='relu', input_shape=(32,)),
        tf.keras.layers.Dense(10, activation='softmax')
    ])
    model.compile(optimizer='adam', loss='categorical_crossentropy')
    # 假设 X_train 和 y_train 是训练数据
    model.fit(X_train, y_train, epochs=10)

if __name__ == '__main__':
    p = mp.Process(target=train_model)
    p.start()
    time.sleep(60)  # 例如,等待60秒
    p.terminate()
    p.join()  # 等待进程完全终止
2. Verwendung os Modul beendet Prozess

Durch Abrufen der Prozess-ID und Verwenden os Modul, das den TensorFlow-Prozess erzwingen kann.

import os
import signal
import tensorflow as tf
import multiprocessing as mp

def train_model():
    pid = os.getpid()
    with open('pid.txt', 'w') as f:
        f.write(str(pid))

    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(64, activation='relu', input_shape=(32,)),
        tf.keras.layers.Dense(10, activation='softmax')
    ])
    model.compile(optimizer='adam', loss='categorical_crossentropy')
    # 假设 X_train 和 y_train 是训练数据
    model.fit(X_train, y_train, epochs=10)

if __name__ == '__main__':
    p = mp.Process(target=train_model)
    p.start()
    time.sleep(60)  # 例如,等待60秒
    with open('pid.txt', 'r') as f:
        pid = int(f.read())
    os.kill(pid, signal.SIGKILL)
    p.join()

Zusammenfassen

Wenn Sie TensorFlow 2 für Training oder Vorhersagen verwenden, ist es entscheidend, den GPU-Speicher ordnungsgemäß zu verwalten und freizugeben.Durch Zurücksetzen der Standardkarte, Begrenzen der Videospeichernutzung, manuelles Freigeben von Videospeicher und Verwendenwith Der Anweisungsverwaltungskontext kann Speicherverlustprobleme wirksam vermeiden.Wenn Sie eine Aufgabe zwangsweise beenden müssen, verwenden Siemultiprocessing Module undos Das Modul kann dafür sorgen, dass der Videospeicher rechtzeitig freigegeben wird. Durch diese Methoden kann eine effiziente Nutzung der GPU-Ressourcen sichergestellt und die Stabilität und Leistung von Rechenaufgaben verbessert werden.