Condivisione della tecnologia

Una guida pratica per gestire in modo efficiente la memoria della GPU TensorFlow 2

2024-07-08

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

Prefazione

Quando si utilizza TensorFlow 2 per l'addestramento o la previsione, la corretta gestione della memoria della GPU è fondamentale. La mancata gestione e rilascio efficace della memoria della GPU può portare a perdite di memoria, che potrebbero influenzare le successive attività di elaborazione. In questo articolo esploreremo diversi modi per liberare in modo efficace la memoria della GPU, sia in modo convenzionale che quando un'attività è costretta a terminare.

1. Metodi convenzionali di gestione della memoria video
1. Ripristina l'immagine predefinita

Ogni volta che esegui un nuovo grafico TensorFlow, chiamando tf.keras.backend.clear_session() per cancellare il grafico TensorFlow corrente e liberare memoria.

import tensorflow as tf
tf.keras.backend.clear_session()
2. Limita l'utilizzo della memoria della GPU

Impostando la politica di utilizzo della memoria video, puoi evitare che la memoria video della GPU venga occupata troppo.

  • Aumenta l'utilizzo della memoria video su richiesta

    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)
    
  • Limita l'utilizzo della memoria video

    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. Rilascia manualmente la memoria della GPU

Dopo l'allenamento o la previsione, utilizzare gc I moduli e le funzioni di gestione della memoria di TensorFlow rilasciano manualmente la memoria della GPU.

import tensorflow as tf
import gc

tf.keras.backend.clear_session()
gc.collect()
4. Utilizzare with Contesto di gestione delle dichiarazioni

Utilizzato nel codice di training o di previsione with dichiarazione per gestire automaticamente il rilascio delle risorse.

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. Gestione della memoria video durante l'interruzione forzata delle attività

A volte è necessario terminare forzatamente l'attività TensorFlow per liberare la memoria della GPU.In questo caso, usa Pythonmultiprocessing modulo oos I moduli possono gestire le risorse in modo efficiente.

1. Utilizzare multiprocessing modulo

Eseguendo le attività TensorFlow in processi separati, l'intero processo può essere interrotto per liberare memoria video quando necessario.

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. Utilizzare os il modulo termina il processo

Ottenendo l'ID del processo e utilizzando os Modulo che può terminare forzatamente il processo TensorFlow.

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

Riassumere

Quando si utilizza TensorFlow 2 per l'addestramento o la previsione, è fondamentale gestire e rilasciare correttamente la memoria della GPU.Reimpostando la mappa predefinita, limitando l'utilizzo della memoria video, rilasciando manualmente la memoria video e utilizzandowith Il contesto di gestione delle istruzioni può efficacemente evitare problemi di perdita di memoria.Quando è necessario terminare forzatamente un'attività, utilizzaremultiprocessing moduli eos Il modulo può garantire che la memoria video venga rilasciata in tempo. Attraverso questi metodi è possibile garantire un utilizzo efficiente delle risorse GPU e migliorare la stabilità e le prestazioni delle attività di elaborazione.