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.
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.
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.
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