[PYTHON] So vermeiden Sie BrokenPipeError mit PyTorchs DataLoader Hinweis

Der DataLoader von PyTorch verfügt über einen Mechanismus zum Laden von Daten mit mehreren Prozessen. Als ich versuchte, es unter Windows zu verwenden, funktionierte es nicht mit demselben Fehler wie hier. Ich habe verschiedene Dinge untersucht und gelöst, daher werde ich die Methode notieren.

DataLoader Multi-Prozess

Zitat aus Official Docs

A DataLoader uses single-process data loading by default.

Within a Python process, the Global Interpreter Lock (GIL) prevents true fully parallelizing Python code across threads. To avoid blocking computation code with data loading, PyTorch provides an easy switch to perform multi-process data loading by simply setting the argument num_workers to a positive integer.

Und das. Grob gesagt kann das Lesen von Daten parallelisiert werden, wenn der Wert der Variablen "num_workers" in der DataLoader-Klasse auf 1 oder mehr festgelegt ist. BrokenPipeError Wenn ich also "num_workers" auf einen Wert von 1 oder mehr setze und ihn verschiebe,

BrokenPipeError: [Errno 32] Broken pipe

Es hat nicht mit einem Fehler funktioniert. Auch wenn Sie "Datensatz" in einer anderen Datei definieren, indem Sie auf [Fehler beim parallelen Laden von Pytorch-Datensatz mit DataLoader (Windows)] verweisen (https://qiita.com/fmfm_mdk/items/726aeacf8f6efe10009e). Ein ähnlicher Fehler ist aufgetreten.

Lösung

Wenn Sie auf [hier] verweisen (https://discourse.pymc.io/t/multiprocessing-windows-10-brokenpipeerror-errno-32-broken-pipe/2259), scheint es, als ob bei der Ausführung von Multiprozessen unter Windows if __name__ == "__main__" muss eine Funktion ausführen, die mehrere Prozesse ausführt.

Vor der Korrektur

train.py


from torch.utils.data import DataLoader
from dataloader import MyDataset #Datensatz erstellt

def train():
    dataset = MyDataset()
    train_loader = DataLoader(dataset, num_workers=2, shuffle=True,
                              batch_size=4,
                              pin_memory=True,
                              drop_last=True)

    for batch in train_loader:
        #do some process...

if __name__ == "__main__":
    train()

Überarbeitet

train.py


from torch.utils.data import DataLoader
from dataloader import MyDataset #Datensatz erstellt

def train(train_loader):
    for batch in train_loader:
        #do some process...

if __name__ == "__main__":
    #dataset,Verschieben Sie den DataLoader
    dataset = MyDataset()
    train_loader = DataLoader(dataset, num_workers=2, shuffle=True,
                              batch_size=4,
                              pin_memory=True,
                              drop_last=True)

    train(train_loader)

Im Fall von DataLoader funktionierte der Multiprozess, selbst wenn das Lesen der Daten selbst in einer anderen Funktion ausgeführt wurde, wenn die Instanz in if __name__ ==" __main__ " erstellt wurde.

Zusammenfassung

Ich habe ein Memo zum Parallelisieren von DataLoader in der Windows-Umgebung geschrieben. Beim Deep Learning gibt es viele Aufgaben, die unter Windows nicht funktionieren oder nicht ohne Einfallsreichtum ausgeführt werden können. Daher möchte ich regelmäßig Artikel über Fehler schreiben, die unter Windows auftreten.

Recommended Posts

So vermeiden Sie BrokenPipeError mit PyTorchs DataLoader Hinweis
So zeigen Sie Bilder kontinuierlich mit matplotlib Memo an
Wie aktualisiere ich mit SQLAlchemy?
[Hinweis] Verwendung von virtualenv
Wie man mit Theano besetzt
Wie mit SQLAlchemy ändern?
So trennen Sie Zeichenfolgen mit ','
Wie man RDP auf Fedora31 macht
Wie lösche ich mit SQLAlchemy?
Python: So verwenden Sie Async mit
So verwenden Sie virtualenv mit PowerShell
So installieren Sie Python-Pip mit Ubuntu20.04LTS
Umgang mit unausgeglichenen Daten
Wie fange ich mit Scrapy an?
Erste Schritte mit Python
Umgang mit dem DistributionNotFound-Fehler
Wie fange ich mit Django an?
So berechnen Sie das Datum mit Python
So installieren Sie den MySQL-Connector mit pip3
So verbinden Sie INNER mit SQL Alchemy
So installieren Sie Anaconda mit pyenv
[Hinweis] So ändern Sie DocumentRoot nach der SSL-Konvertierung mit Let's Encrypt
So führen Sie eine arithmetische Verarbeitung mit der Django-Vorlage durch
Wie man mit matplotlib mehrere Figuren betitelt
So erhalten Sie die Eltern-ID mit sqlalchemy
So fügen Sie ein Paket mit PyCharm hinzu
Verwendung von OpenVPN mit Ubuntu 18.04.3 LTS
Verwendung von Cmder mit PyCharm (Windows)
So verhindern Sie Paketaktualisierungen mit apt
So arbeiten Sie mit BigQuery in Python
Wie man Ass / Alembic mit HtoA benutzt
Umgang mit Enum-Kompatibilitätsfehlern
Verwendung von Japanisch mit NLTK-Plot
Wie man einen Taschentest mit Python macht
So suchen Sie in Google Colaboratory nach Google Drive
So zeigen Sie Python-Japanisch mit Lolipop an
So laden Sie YouTube-Videos mit youtube-dl herunter
Verwendung des Jupyter-Notebooks mit ABCI
Versuch, SQLite3 mit Python zu handhaben [Hinweis]
So schalten Sie Linux unter Ultra96-V2 aus
Verwendung des CUT-Befehls (mit Beispiel)
Wie man mit Python-Flüchen Japanisch eingibt
So installieren Sie zsh (mit .zshrc-Anpassung)
Wie man Problemdaten mit Paiza liest
Verwendung von SQLAlchemy / Connect mit aiomysql
So gruppieren Sie Volumes mit LVM
So installieren Sie Python3 mit Docker Centos
Verwendung des JDBC-Treibers mit Redash
Checkliste, wie Sie vermeiden können, die Elemente des Numpy-Arrays mit for zu drehen
Hinweis: So erhalten Sie den letzten Tag des Monats mit Python (hinzugefügt am ersten Tag des Monats)
So löschen Sie vergangene Tweets mit Tweepy selektiv
Hochladen mit Heroku, Flask, Python, Git (4)
Umgang mit Speicherlecks in matplotlib.pyplot