DataLoader de PyTorch dispose d'un mécanisme de chargement de données multi-processus. Quand j'ai essayé de l'utiliser sous Windows, cela ne fonctionnait pas avec la même erreur que here. J'ai enquêté sur diverses choses et je l'ai résolu, je vais donc noter la méthode.
Citation de Documents officiels
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.
Et cela. En gros, si la valeur de la variable «num_workers» de la classe DataLoader est définie sur 1 ou plus, la lecture des données peut être parallélisée.
BrokenPipeError
Ainsi, lorsque je règle num_workers
sur une valeur de 1 ou plus et que je la déplace,
BrokenPipeError: [Errno 32] Broken pipe
Cela n'a pas fonctionné avec une erreur.
Même si vous définissez Dataset
dans un autre fichier en vous référant à Erreur lorsque vous voulez charger Pytorch Dataset en parallèle avec DataLoader (Windows) Une erreur similaire s'est produite.
Si vous vous référez à here, il semble que lors de l'exécution de plusieurs processus sous Windows, ʻif name == "main" `doit exécuter une fonction qui exécute plusieurs processus.
Avant correction
train.py
from torch.utils.data import DataLoader
from dataloader import MyDataset #Ensemble de données créé
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()
modifié
train.py
from torch.utils.data import DataLoader
from dataloader import MyDataset #Ensemble de données créé
def train(train_loader):
for batch in train_loader:
#do some process...
if __name__ == "__main__":
#dataset,Déplacer DataLoader
dataset = MyDataset()
train_loader = DataLoader(dataset, num_workers=2, shuffle=True,
batch_size=4,
pin_memory=True,
drop_last=True)
train(train_loader)
Dans le cas de DataLoader, si l'instance a été créée dans ʻif name == "main" `, le multi-processus fonctionnait même si la lecture des données elle-même était exécutée dans une autre fonction.
J'ai écrit un mémo pour paralléliser DataLoader dans l'environnement Windows. En matière d'apprentissage en profondeur, il existe de nombreuses tâches qui ne fonctionnent pas sous Windows ou qui ne peuvent être effectuées sans une certaine ingéniosité. Par conséquent, j'aimerais écrire régulièrement des articles sur les erreurs qui se produisent autour de Windows.
Recommended Posts