Bewährte Methoden für Torch.multiprocessing

Der virtuelle Speicher ist jedoch nur eine Seite der Geschichte. Was ist, wenn das Downside nach dem Anpassen der Auslagerungsdiskette nicht behoben wird?

Die andere Seite der Geschichte sind die zugrunde liegenden Probleme des Moduls torch.multiprocessing. Auf der offiziellen Webseite finden Sie eine Reihe von Greatest-Observe-Empfehlungen:

Darüber hinaus sollten jedoch noch drei weitere Ansätze berücksichtigt werden, insbesondere im Hinblick auf die Speichernutzung.

Das erste ist ein gemeinsam genutzter Speicherverlust. Leckage bedeutet, dass der Speicher nach jedem Durchlauf des Youngster-Employees nicht richtig freigegeben wird. Dieses Phänomen können Sie beobachten, wenn Sie die Nutzung des virtuellen Speichers zur Laufzeit überwachen. Der Speicherverbrauch steigt weiter an und erreicht den Punkt, an dem „kein Speicher mehr vorhanden ist“. Dies ist ein sehr typischer Speicherverlust.

Was additionally verursacht das Leck?

Werfen wir einen Blick auf die DataLoader-Klasse selbst:

https://github.com/pytorch/pytorch/blob/predominant/torch/utils/knowledge/dataloader.py

Wenn wir uns DataLoader genauer ansehen, sehen wir, dass _MultiProcessingDataLoaderIter aufgerufen wird, wenn nums_worker > 0 ist. Innerhalb von _MultiProcessingDataLoaderIter erstellt Torch.multiprocessing die Employee-Warteschlange. Torch.multiprocessing verwendet zwei verschiedene Strategien für die Speicherfreigabe und das Caching: Dateideskriptor Und Dateisystem. Während Dateisystem erfordert kein Zwischenspeichern von Dateideskriptoren, ist aber anfällig für Lecks im gemeinsam genutzten Speicher.

Um zu prüfen, welche Freigabestrategie Ihr Laptop verwendet, fügen Sie einfach das Skript hinzu:

torch.multiprocessing.get_sharing_strategy()

Um Ihr Systemdateideskriptorlimit (Linux) zu ermitteln, führen Sie den folgenden Befehl im Terminal aus:

ulimit -n

Um Ihre Freigabestrategie zu ändern auf Dateideskriptor:

torch.multiprocessing.set_sharing_strategy(‘file_descriptor’)

Um die Anzahl der geöffneten Dateideskriptoren zu zählen, führen Sie den folgenden Befehl aus:

ls /proc/self/fd | wc -l

Sofern das System dies zulässt, Dateideskriptor Strategie wird empfohlen.

Die zweite ist die Multiprocessing-Employee-Startmethode. Einfach ausgedrückt geht es um die Debatte, ob man als Methode zum Starten des Employees Fork oder Spawn verwenden soll. Fork ist die Standardmethode zum Starten von Multiprocessing in Linux und kann bestimmte Dateikopien vermeiden, ist additionally viel schneller, kann aber Probleme beim Umgang mit CUDA-Tensoren und Drittanbieterbibliotheken wie OpenCV in Ihrem DataLoader haben.

Um die Spawn-Methode zu verwenden, können Sie einfach das Argument übergeben multiprocessing_context= „laichen“. zum DataLoader.

Drittens: Machen Sie die Dataset-Objekte auswählbar/serialisierbar

Es gibt einen tremendous netten Beitrag, der den „Copy-on-Learn“-Effekt beim Prozess-Folding näher bespricht: https://ppwwyyxx.com/weblog/2022/Demystify-RAM-Utilization-in-Multiprocess-DataLoader/

Einfach gesagt, es ist kein guter Ansatz mehr um eine Liste mit Dateinamen zu erstellen und diese in die Methode __getitem__ zu laden. Erstellen Sie ein Numpy-Array oder einen Panda-Dataframe, um die Liste mit Dateinamen für Serialisierungszwecke zu speichern. Und wenn Sie mit HuggingFace vertraut sind, ist die Verwendung eines CSV/Dataframes die empfohlene Methode zum Laden eines lokalen Datensatzes: https://huggingface.co/docs/datasets/v2.19.0/en/package_reference/loading_methods#datasets.load_dataset.example-2

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert