Pytorch: BrokenPipeError : [Errno 32] Tuyau cassé

Créé le 8 août 2017  ·  35Commentaires  ·  Source: pytorch/pytorch

Salut, j'utilise Pytorch pour exécuter un réseau triplet (GPU), mais quand j'ai des données, il y avait toujours une BrokenPipeError:[Errno 32] Broken pipe.

Je pensais que quelque chose n'allait pas dans les codes suivants:

pour batch_idx, (data1, data2, data3) dans énumérer (test_loader):
si args.cuda :
data1, data2, data3 = data1.cuda(), data2.cuda(), data3.cuda()
données1, données2, données3 = Variable(données1), Variable(données2), Variable(données3)

Peut-tu me faire des suggestions? Merci beaucoup.

Commentaire le plus utile

@mjchen611 Vous pouvez définir num_workers sur 0 pour voir l'erreur réelle. Votre plotter correctement configuré ?

Tous les 35 commentaires

Seriez-vous en mesure de publier un extrait de code pouvant reproduire cela ?

@alykhantejani

1) Le lien du code était : https://github.com/andreasveit/triplet-network-pytorch/blob/master/train.py

2) L'erreur s'est produite dans train.py -- 136

3) L'erreur était :

runfile('G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py', wdir='G:/researchWork2/pytorch/triplet-network-pytorch-master')
Modules rechargés : triplet_mnist_loader, triplet_image_loader, tripletnet

Nombre de paramètres : 21840
Traceback (appel le plus récent en dernier) :
Fichier "", ligne 1, dans
runfile('G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py', wdir='G:/researchWork2/pytorch/triplet-network-pytorch-master')

Fichier "D:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", ligne 880, dans le fichier d'exécution
execfile(nom de fichier, espace de noms)

Fichier "D:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", ligne 102, dans le fichier execfile
exec(compile(f.read(), nom de fichier, 'exec'), espace de noms)

Fichier "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", ligne 258, dans
principale()

Fichier "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", ligne 116, dans main
train(train_loader, tnet, critère, optimiseur, époque)

Fichier "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", ligne 137, en train
pour batch_idx, (data1, data2) dans énumérer (train_loader):

Fichier "D:\Anaconda3\lib\site-packages\torch\utils\data\dataloader.py", ligne 303, dans iter
retourner DataLoaderIter(self)

Fichier "D:\Anaconda3\lib\site-packages\torch\utils\data\dataloader.py", ligne 162, dans init
w.start()

Fichier "D:\Anaconda3\lib\multiprocessing\process.py", ligne 105, au début
self._popen = self._Popen(self)

Fichier "D:\Anaconda3\lib\multiprocessing\context.py", ligne 223, dans _Popen
return _default_context.get_context().Process._Popen(process_obj)

Fichier "D:\Anaconda3\lib\multiprocessing\context.py", ligne 322, dans _Popen
retourner Popen(process_obj)

Fichier "D:\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", ligne 65, dans init
réduction.dump(process_obj, to_child)

Fichier "D:\Anaconda3\lib\multiprocessing\reduction.py", ligne 60, en dump
ForkingPickler(fichier, protocole).dump(obj)

BrokenPipeError : [Errno 32] Tuyau cassé

4) Une partie des codes liés au train comme suit :
def train(train_loader, tnet, critère, optimiseur, époque):
pertes = AverageMeter()
accs = AverageMeter()
emb_norms = AverageMeter()

passer en mode train

tnet.train()
pour batch_idx, (data1, data2, data3) dans énumérer (train_loader):
si args.cuda :
data1, data2, data3 = data1.cuda(), data2.cuda(), data3.cuda()
données1, données2, données3 = Variable(données1), Variable(données2), Variable(données3)

# compute output
dista, distb, embedded_x, embedded_y, embedded_z = tnet(data1, data2, data3)
# 1 means, dista should be larger than distb
target = torch.FloatTensor(dista.size()).fill_(1)
if args.cuda:
    target = target.cuda()
target = Variable(target)

loss_triplet = criterion(dista, distb, target)
loss_embedd = embedded_x.norm(2) + embedded_y.norm(2) + embedded_z.norm(2)
loss = loss_triplet + 0.001 * loss_embedd

# measure accuracy and record loss
acc = accuracy(dista, distb)
losses.update(loss_triplet.data[0], data1.size(0))
accs.update(acc, data1.size(0))
emb_norms.update(loss_embedd.data[0]/3, data1.size(0))

# compute gradient and do optimizer step
optimizer.zero_grad()
loss.backward()
optimizer.step()

if batch_idx % args.log_interval == 0:
    print('Train Epoch: {} [{}/{}]\t'
          'Loss: {:.4f} ({:.4f}) \t'
          'Acc: {:.2f}% ({:.2f}%) \t'
          'Emb_Norm: {:.2f} ({:.2f})'.format(
        epoch, batch_idx * len(data1), len(train_loader.dataset),
        losses.val, losses.avg, 
        100. * accs.val, 100. * accs.avg, emb_norms.val, emb_norms.avg))

consigner les valeurs moyennes quelque part

traceur.plot('acc', 'train', époque, accs.avg)
plotter.plot('perte', 'train', époque, pertes.avg)
plotter.plot('emb_norms', 'train', époque, emb_norms.avg)

Merci beaucoup.

@alykhantejani
Et je l'utilise sous Windows8.1 avec Cuda

nous ne prenons pas encore officiellement en charge Windows. Peut-être que @ peterjc123 sait ce qui ne va pas.

@mjchen611 Vous pouvez définir num_workers sur 0 pour voir l'erreur réelle. Votre plotter correctement configuré ?

Je peux en fait vérifier que le réglage du num_workers à 0 ou 1 aidé. Quel que soit le cas, DataLoader a toujours échoué avec moi, quel que soit l'ensemble de données avec une valeur plus élevée. L'erreur est liée au multitraitement avec DataLoader :

  File "D:/Opiskelu/PyTorch Tutorials/cnn_transfer_learning_cuda.py", line 76, in <module>
    inputs, classes = next(iter(dataloaders['train']))

  File "C:\Anaconda3\envs\ml\lib\site-packages\torch\utils\data\dataloader.py", line 301, in __iter__
    return DataLoaderIter(self)

  File "C:\Anaconda3\envs\ml\lib\site-packages\torch\utils\data\dataloader.py", line 158, in __init__
    w.start()

  File "C:\Anaconda3\envs\ml\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)

  File "C:\Anaconda3\envs\ml\lib\multiprocessing\context.py", line 212, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)

  File "C:\Anaconda3\envs\ml\lib\multiprocessing\context.py", line 313, in _Popen
    return Popen(process_obj)

  File "C:\Anaconda3\envs\ml\lib\multiprocessing\popen_spawn_win32.py", line 66, in __init__
    reduction.dump(process_obj, to_child)

  File "C:\Anaconda3\envs\ml\lib\multiprocessing\reduction.py", line 59, in dump
    ForkingPickler(file, protocol).dump(obj)

BrokenPipeError: [Errno 32] Broken pipe

@ karmus89 En fait, cette erreur ne se produit que lorsque vous essayez de faire du multitraitement sur un code contenant des erreurs. Il est inattendu que vous soyez confronté à ce problème lorsque votre code est correct. Je ne sais pas quelle version vous utilisez. Pouvez-vous envoyer un petit morceau de code qui peut reproduire votre problème ?

Ça ira! Et rappelez-vous, j'utilise une machine Windows. Le code est directement copié à partir du tutoriel PyTorch : Transfer Learning Tutorial . Cela signifie que l'ensemble de données doit être téléchargé et extrait comme indiqué.

Le code pour reproduire l'erreur :

import torch
import torchvision
from torchvision import datasets, models, transforms
import os

data_transforms = {
    'train': transforms.Compose([
        transforms.RandomSizedCrop(224),
        transforms.RandomHorizontalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        transforms.Scale(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

data_dir = 'hymenoptera_data'
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
                                          data_transforms[x])
                  for x in ['train', 'val']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
                                             shuffle=True, num_workers=4)
              for x in ['train', 'val']}

# The code fill fail here trying to iterate over the DataLoader with multiple num_workers (Windows only)
inputs, classes = next(iter(dataloaders['train']))

Et je viens de faire quelques messages sur le forum PyTorch à ce sujet. Le problème réside dans multiprocessing Python et Windows. S'il vous plaît voir cette réponse de discussion PyTorch car je ne veux pas trop copier coller des trucs ici.

Éditer:

Voici le code qui ne plante pas, qui est en même temps conforme aux directives de programmation multitraitement de Python pour les machines Windows :

import torch
import torchvision
from torchvision import datasets, models, transforms
import os

if __name__ == "__main__":

    data_transforms = {
        'train': transforms.Compose([
            transforms.RandomSizedCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ]),
        'val': transforms.Compose([
            transforms.Scale(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ]),
    }

    data_dir = 'hymenoptera_data'
    image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
                                              data_transforms[x])
                      for x in ['train', 'val']}
    dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
                                                 shuffle=True, num_workers=4)
                  for x in ['train', 'val']}

    inputs, classes = next(iter(dataloaders['train']))

@ karmus89 Eh bien, je pense l'avoir indiqué le paquet a été publié. Je suis tellement triste que vous ayez installé le paquet sans lire l'avis.

@ peterjc123 Veuillez voir ma réponse modifiée où j'ai fait exactement cela. L'exigence d'encapsuler le code à l'intérieur du code if __name__ == '__main__' n'est pas immédiatement évidente, car elle n'est requise que pour les machines Windows.

__Éditer__:
En ce qui concerne l'énoncé de l'exigence, je l'ai effectivement manqué. J'ai utilisé conda pour installer le package directement, je n'ai donc jamais rencontré d'exigences d'introduction. Mais merci quand même! Et désolé de t'avoir rendu triste !

__Modifier 2__ :
Wow, je ne pouvais même pas savoir où chercher ça 😄 👍

Une question concernant ce qui précède. Je rencontre le problème ci-dessus dans un ordinateur portable jupyter. Comment résolvez-vous cela dans un cahier jupyter? Envelopper le code dans "if __name__ == '__main__' " ne change rien. Est-ce que quelqu'un sait comment traduire cela dans les cahiers jupyter?

@Dehde Qu'en est-il de la définition du num_worker du DataLoader à zéro ?

@ peterjc123
Merci pour la réponse rapide! Je n'ai pas été tout à fait clair, désolé : existe-t-il un moyen d'exécuter pytorch sur Windows dans jupyter notebook et d'utiliser toujours la fonctionnalité de travail, afin de ne pas les mettre à zéro ? J'ai définitivement besoin d'un prétraitement parallélisé. Merci pour votre temps !

Pourriez-vous me montrer le code minimal pour que je puisse reproduire ?

@ peterjc123
Je vais le modifier dans ce post ici lundi, je n'ai pas accès au code pour le moment. Merci!

Comme promis, le code que j'utilise :

`
if __name__ == '__main__' :

batch_size = 256

size = (128, 128)
image_datasets = {}
image_datasets["train"] = WaterbodyDataset(masks=train_masks, images=train_imgs,
                                            transform_img=transforms.Compose([
                                                RandomCrop(size),
                                                transforms.ToTensor(),
                                            ]),
                                            transform_mask=transforms.Compose([
                                                RandomCrop(size),
                                                transforms.ToTensor(),
                                            ]))

image_datasets["val"] = WaterbodyDataset(masks=val_masks, images=val_imgs,
                                            transform_img=transforms.Compose([
                                                transforms.ToTensor(),
                                            ]),
                                            transform_mask=transforms.Compose([
                                                transforms.ToTensor()
                                            ]))

dataloaders = {'train': torch.utils.data.DataLoader(image_datasets['train'], batch_size=batch_size, 
                                                    shuffle=True, num_workers=1),
               'val' : torch.utils.data.DataLoader(image_datasets['val'], batch_size=batch_size, 
                                                   shuffle=False, num_workers=1)}

dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}

hps = HyperParams()
hps.update("name=resnet34_128_deconv_pret00rained_bs32_adam_lr0.0001_wd0_pat5,"
           "arch=resnet34,input_channel=4,freeze=0,deconv=1,opt=adam,debug=0,"
           "weight_decay=0.0,patience=100,pretrained=1,lr=0.0001,print_freq=10,every_x_epoch_eval=1")
pprint(attr.asdict(hps))

model = Model(hps)
model.train(dataloaders)`

Le WaterbodyDataset hérite de la classe de jeu de données pytorch.

J'ai aussi eu la même erreur. Lorsque j'ai défini num_workers sur 0, l'erreur n'apparaît plus. Cependant, lorsque je définis num_workers sur 1, l'erreur est toujours là.

Lorsque je mets num_workers à 0, il n'y a pas d'erreur.

S'il vous plaît, j'ai besoin d'aide avec cette erreur "BrokenPipeError: [Errno 32] Tuyau cassé"
code de : https://github.com/higgsfield/np-hard-deep-reinforcement-learning/blob/master/Neural%20Combinatorial%20Optimization.ipynb
j'utilise windows 10.

  1. Enveloppez le code dans if __name__ == '__main__':
    mais pour moi, néanmoins, l'erreur réapparaît parfois. Je sais que ça a l'air idiot, mais ce qui m'aide c'est juste
  2. redémarrage de l'ordinateur.
    Windows 10 ici

J'ai constaté que le problème est toujours présent, mais uniquement lorsque j'utilise un collate_fn .

Pour moi, il suffit de changer num_workers de 2 à 0 pour que le code fonctionne correctement...

J'ai eu le même problème lorsque j'ai exécuté le didacticiel de chargement et de traitement des données PyTorch. Changer num_workers de 2 à 0 a résolu le problème, mais num_workers = 2 a bien fonctionné avec d'autres ensembles de données. J'utilise Windows

num_workers > 0 ne fonctionne pas pour Windows.
Même avec le nouveau IterableDataset.

J'ai rencontré cette même erreur. Et quand j'essaie de trouver une méthode pour résoudre ce problème, le programme continue de s'exécuter automatiquement (attendez environ 10 minutes) incroyable :confused:

J'ai exécuté exactement le même code plusieurs fois avec des résultats différents. De plus, j'ai copié le code qui cause un tuyau cassé vers un nouveau fichier (le contenu étant exactement le même) et il fonctionnerait bien. Je pense qu'il y a un facteur externe en jeu ici. Je ne peux plus reproduire le bogue, mais essayez peut-être de supprimer votre répertoire __pycache__ s'il y en a.

avoir un problème sur Windows10. Je ne sais pas pourquoi mais je pense que le problème est le chargeur de données (num_workers à 0 n'aide pas) et le multitraitement

avoir un problème sur Windows10. Je ne sais pas pourquoi mais je pense que le problème est le chargeur de données (num_workers à 0 n'aide pas) et le multitraitement

Après avoir utilisé Ubuntu pendant un certain temps, j'ai récemment essayé Windows-10 (juste pour le prototypage avant d'utiliser la machine en cluster) et j'ai rencontré la même erreur, la définition de num_workers sur 0 m'a aidé. Assurez-vous que vous configurez tous les chargeurs de données, entraînez, testez et validez.

J'ai aussi le même problème sur Win10. J'ai reçu le message d'erreur ' [Errno 32] Broken pipe ' lorsque j'ai défini num_workers supérieur à 0.
Et mon code est à télécharger depuis le tutoriel officiel de Pytorch.

Je suppose que c'est un bogue pour Win10, et j'ai hâte de voir une version corrigée sur la prochaine version.

même erreur, num_workers=0 a fonctionné, mais je veux que le multitraitement accélère le chargement des données.

même erreur, num_workers=0 a fonctionné, mais je veux que le multitraitement accélère le chargement des données.

Il semble que la seule façon pour que cela fonctionne soit d'utiliser Linux, j'utilise Windows-10 pour le prototypage, puis je pousse tout vers le cluster basé sur Linux.

if platform.system()=='Windows': n_cpu= 0

J'ai également rencontré un problème similaire dans Windows 10 lors de la définition de mon ensemble de données de torche personnalisé et en essayant de l'exécuter dans le laboratoire jupyter. Apparemment, l'ensemble de données personnalisé n'est pas enregistré en tant qu'attribut du module __main__ qui est appelé par le DataLoader dans le fichier multiprocessing.py\spawn.py. Je l'ai corrigé en écrivant l'ensemble de données dans un module, puis en l'important comme mentionné ici :

https://stackoverflow.com/questions/41385708/multiprocessing-example-giving-attributeerror

  File "C:\Users\johndoe\Anaconda3\envs\PyTorch15\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "C:\Users\johndoe\Anaconda3\envs\PyTorch15\lib\multiprocessing\spawn.py", line 115, in _main
    self = reduction.pickle.load(from_parent)
AttributeError: Can't get attribute 'RandomPatchExtractor' on <module '__main__' (built-in)>

@mjchen611 Vous pouvez définir num_workers sur 0 pour voir l'erreur réelle. Votre plotter correctement configuré ?

La définition de num_workers sur 0 a fonctionné pour moi. Pourriez-vous expliquer pourquoi cela provoque une erreur?

J'ai remarqué que ce problème est fermé, mais je ne pense pas que ce soit résolu. Y a-t-il des efforts pour réparer le chargeur de données multi-traitement sur Windows ? A ma connaissance il y a actuellement 2 options :

  1. enveloppez-le dans if __name__ == '__main__': , ce qui ne fonctionne pas toujours.
  2. ne pas utiliser le multi-traitement sous windows : if platform.system()=='Windows': n_cpu= 0

Le premier est donc une solution imparfaite, tandis que le second revient à abandonner. Y a-t-il des efforts pour réparer le chargement de données multi-traité sur Windows en cours ailleurs ou devrions-nous rouvrir celui-ci?

Utilisation
if __name__ == '__main__' and '__file__' in globals(): au lieu de if __name__ == '__main__':
Ça marche pour moi. J'utilise le notebook Jupyter et Windows 10.

c'est la référence

J'ai eu un problème en essayant de m'entraîner sur mon ensemble de données Coco personnalisé (ce qui est un peu différent de la classe CocoDetection Pytorch par défaut). Ajouter les paramètres collate_fn=utils.collate_fn a fonctionné pour moi :
trainloader = torch.utils.data.DataLoader(coco_train, batch_size=2, shuffle=False, num_workers=1, collate_fn=utils.collate_fn)

Cette page vous a été utile?
0 / 5 - 0 notes