Κοινή χρήση τεχνολογίας

Ένας πρακτικός οδηγός για την αποτελεσματική διαχείριση της μνήμης GPU TensorFlow 2

2024-07-08

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

Πρόλογος

Όταν χρησιμοποιείτε το TensorFlow 2 για εκπαίδευση ή πρόβλεψη, η σωστή διαχείριση της μνήμης GPU είναι ζωτικής σημασίας. Η αποτυχία αποτελεσματικής διαχείρισης και αποδέσμευσης της μνήμης GPU μπορεί να οδηγήσει σε διαρροές μνήμης, οι οποίες μπορεί να επηρεάσουν τις επόμενες εργασίες υπολογιστών. Σε αυτό το άρθρο, θα εξερευνήσουμε διάφορους τρόπους για να ελευθερώσετε αποτελεσματικά τη μνήμη GPU, τόσο συμβατικά όσο και όταν μια εργασία αναγκαστεί να τερματιστεί.

1. Συμβατικές μέθοδοι διαχείρισης μνήμης βίντεο
1. Επαναφέρετε την προεπιλεγμένη εικόνα

Κάθε φορά που εκτελείτε ένα νέο γράφημα TensorFlow, καλώντας tf.keras.backend.clear_session() για να διαγράψετε το τρέχον γράφημα TensorFlow και την ελεύθερη μνήμη.

import tensorflow as tf
tf.keras.backend.clear_session()
2. Περιορίστε τη χρήση μνήμης GPU

Ορίζοντας την πολιτική χρήσης μνήμης βίντεο, μπορείτε να αποτρέψετε την υπερβολική κατάληψη της μνήμης βίντεο της GPU.

  • Αυξήστε τη χρήση της μνήμης βίντεο κατά παραγγελία

    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)
    
  • Περιορίστε τη χρήση μνήμης βίντεο

    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. Απελευθερώστε με μη αυτόματο τρόπο τη μνήμη GPU

Μετά την προπόνηση ή την πρόβλεψη, χρησιμοποιήστε gc Η μονάδα και οι λειτουργίες διαχείρισης μνήμης του TensorFlow απελευθερώνουν με μη αυτόματο τρόπο τη μνήμη GPU.

import tensorflow as tf
import gc

tf.keras.backend.clear_session()
gc.collect()
4. Χρήση with πλαίσιο διαχείρισης δηλώσεων

Χρησιμοποιείται σε κώδικα εκπαίδευσης ή πρόβλεψης with δήλωση για την αυτόματη διαχείριση της απελευθέρωσης πόρων.

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. Διαχείριση μνήμης βίντεο κατά τον αναγκαστικό τερματισμό εργασιών

Μερικές φορές χρειάζεται να τερματίσουμε αναγκαστικά την εργασία TensorFlow για να απελευθερώσουμε τη μνήμη GPU.Σε αυτήν την περίπτωση, χρησιμοποιήστε Python'smultiprocessing ενότητα ήos Οι ενότητες μπορούν να διαχειριστούν αποτελεσματικά τους πόρους.

1. Χρήση multiprocessing μονάδα μέτρησης

Εκτελώντας εργασίες TensorFlow σε ξεχωριστές διεργασίες, ολόκληρη η διαδικασία μπορεί να σβήσει για να ελευθερωθεί μνήμη βίντεο όταν χρειάζεται.

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. Χρήση os η μονάδα τερματίζει τη διαδικασία

Λαμβάνοντας το αναγνωριστικό διαδικασίας και χρησιμοποιώντας os Μονάδα που μπορεί να τερματίσει αναγκαστικά τη διαδικασία 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()

Συνοψίζω

Όταν χρησιμοποιείτε το TensorFlow 2 για εκπαίδευση ή πρόβλεψη, είναι σημαντικό να διαχειρίζεστε και να απελευθερώνετε σωστά τη μνήμη GPU.Με την επαναφορά του προεπιλεγμένου χάρτη, τον περιορισμό της χρήσης της μνήμης βίντεο, την μη αυτόματη απελευθέρωση της μνήμης βίντεο και τη χρήσηwith Το πλαίσιο διαχείρισης δηλώσεων μπορεί να αποφύγει αποτελεσματικά προβλήματα διαρροής μνήμης.Όταν χρειάζεται να τερματίσετε αναγκαστικά μια εργασία, χρησιμοποιήστεmultiprocessing ενότητες καιos Η μονάδα μπορεί να διασφαλίσει ότι η μνήμη βίντεο απελευθερώνεται εγκαίρως. Μέσω αυτών των μεθόδων, μπορεί να εξασφαλιστεί η αποτελεσματική χρήση των πόρων της GPU και να βελτιωθεί η σταθερότητα και η απόδοση των εργασιών υπολογιστών.