Pytorch: BrokenPipeError: [Errno 32] أنبوب مكسور

تم إنشاؤها على ٨ أغسطس ٢٠١٧  ·  35تعليقات  ·  مصدر: pytorch/pytorch

مرحبًا ، أستخدم Pytorch لتشغيل شبكة ثلاثية (GPU) ، ولكن عندما أحصل على البيانات ، كان هناك دائمًا خطأ BrokenPipe: [Errno 32] أنبوب مكسور.

اعتقدت أنه شيء خاطئ في الأكواد التالية :

بالنسبة إلى batch_idx ، (data1 ، data2 ، data3) في التعداد (test_loader):
إذا args.cuda:
data1، data2، data3 = data1.cuda ()، data2.cuda () ، data3.cuda ()
data1، data2، data3 = متغير (بيانات 1) ، متغير (بيانات 2) ، متغير (بيانات 3)

هل يمكن أن تعطيني بعض الاقتراحات؟ شكرا جزيلا.

التعليق الأكثر فائدة

@ mjchen611 يمكنك ضبط num_workers على 0 لرؤية الخطأ الفعلي. هل قمت بتكوين plotter بشكل صحيح؟

ال 35 كومينتر

هل ستكون قادرًا على نشر مقتطف من التعليمات البرمجية يمكنه إعادة إنتاج هذا؟

تضمين التغريدة

1) كان رابط الكود: https://github.com/andreasveit/triplet-network-pytorch/blob/master/train.py

2) الخطأ الذي وقع في train.py - 136

3) الخطأ كان:

runfile ('G: /researchWork2/pytorch/triplet-network-pytorch-master/train.py' ، wdir = 'G: / ResearchWork2 / pytorch / triplet-network-pytorch-master')
الوحدات المعاد تحميلها: triplet_mnist_loader ، triplet_image_loader ، tripletnet

عدد البارامترات: 21840
Traceback (آخر مكالمة أخيرة):
ملف "" ، السطر 1 ، بتنسيق
runfile ('G: /researchWork2/pytorch/triplet-network-pytorch-master/train.py' ، wdir = 'G: / ResearchWork2 / pytorch / triplet-network-pytorch-master')

ملف "D: \ Anaconda3 \ lib \ site -pack \ spyder \ utils \ site \ sitecustomize.py" ، السطر 880 ، في ملف runfile
execfile (اسم الملف ، مساحة الاسم)

ملف "D: \ Anaconda3 \ lib \ site -pack \ spyder \ utils \ site \ sitecustomize.py" ، السطر 102 ، في execfile
exec (compile (f.read () ، filename ، 'exec') ، مساحة الاسم)

ملف "G: /researchWork2/pytorch/triplet-network-pytorch-master/train.py" ، السطر 258 ، في
الأساسية()

ملف "G: /researchWork2/pytorch/triplet-network-pytorch-master/train.py" ، السطر 116 ، بشكل رئيسي
القطار (أداة تحميل القطار ، tnet ، معيار ، محسن ، حقبة)

ملف "G: /researchWork2/pytorch/triplet-network-pytorch-master/train.py" ، السطر 137 ، في القطار
بالنسبة إلى batch_idx ، (data1 ، data2) في التعداد (train_loader):

ملف "D: \ Anaconda3 \ lib \ site -pack \ torch \ utils \ data \ dataloader.py" ، السطر 303 ، في iter
إرجاع DataLoaderIter (ذاتي)

ملف "D: \ Anaconda3 \ lib \ site -pack \ torch \ utils \ data \ dataloader.py" ، السطر 162 ، في init
w.start ()

ملف "D: \ Anaconda3 \ lib \ multiprocessing \ process.py" ، السطر 105 ، في البداية
self._popen = self._Popen (ذاتي)

ملف "D: \ Anaconda3 \ lib \ multiprocessing \ Context.py" ، السطر 223 ، في _Popen
return _default_context.get_context (). Process._Popen (process_obj)

ملف "D: \ Anaconda3 \ lib \ multiprocessing \ Context.py" ، السطر 322 ، في _Popen
عودة Popen (process_obj)

ملف "D: \ Anaconda3 \ lib \ multiprocessing \ popen_spawn_win32.py" ، السطر 65 ، في init
الحد من التفريغ (process_obj ، to_child)

ملف "D: \ Anaconda3 \ lib \ multiprocessing \ Reduce.py" ، السطر 60 ، في التفريغ
ForkingPickler (ملف ، بروتوكول). تفريغ (obj)

BrokenPipeError: [Errno 32] أنبوب مكسور

4) بعض الرموز المتعلقة بالقطارات على النحو التالي:
تدريب def (train_loader ، tnet ، معيار ، محسن ، عصر):
الخسائر = متوسط ​​القياس ()
accs = AverageMeter ()
emb_norms = AverageMeter ()

التبديل إلى وضع التدريب

tnet.train ()
بالنسبة إلى batch_idx ، (data1 ، data2 ، data3) في التعداد (train_loader):
إذا args.cuda:
data1، data2، data3 = data1.cuda ()، data2.cuda () ، data3.cuda ()
data1، data2، data3 = متغير (بيانات 1) ، متغير (بيانات 2) ، متغير (بيانات 3)

# 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))

سجل القيم المتوسطة إلى مكان ما

plotter.plot ('acc'، 'train'، epoch، accs.avg)
plotter.plot ("الخسارة" ، "القطار" ، الحقبة ، الخسائر.avg)
plotter.plot ('emb_norms'، 'train'، epoch، emb_norms.avg)

شكرا جزيلا.

تضمين التغريدة
وأنا أستخدمه في Windows8.1 مع Cuda

لا ندعم windows رسميًا بعد. ربما يعرف @ peterjc123 ما هو الخطأ.

@ mjchen611 يمكنك ضبط num_workers على 0 لرؤية الخطأ الفعلي. هل قمت بتكوين plotter بشكل صحيح؟

يمكنني بالفعل التحقق من أن تعيين num_workers إلى 0 أو 1 ساعدني. بغض النظر عن الحالة ، فشلت DataLoader معي دائمًا بغض النظر عن مجموعة البيانات ذات القيمة الأعلى. الخطأ يتعلق بالمعالجة المتعددة باستخدام 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 في الواقع يحدث هذا الخطأ فقط عندما تحاول القيام

سوف تفعل! وتذكر ، أنا أستخدم جهاز Windows. يتم نسخ الكود مباشرة من البرنامج التعليمي PyTorch: Transfer Learning Tutorial . هذا يعني أنه يجب تنزيل مجموعة البيانات واستخراجها حسب التعليمات.

الكود المراد إعادة إنتاج الخطأ:

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']))

ولقد قمت للتو بعمل بعض مشاركات منتدى PyTorch بخصوص هذا الموضوع. تكمن المشكلة في Python multiprocessing و Windows. يرجى الاطلاع على هذه المناقشة PyTorch الرد وأنا لا أريد أن أكثر من اللازم نسخ لصق الاشياء هنا.

يحرر:

إليك الكود الذي لم يتعطل ، والذي يتوافق في نفس الوقت مع إرشادات البرمجة متعددة المعالجات في Python لأجهزة 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 حسنًا ، أعتقد أنني ذكرت ذلك حيث تم نشر الحزمة. أنا حزين جدًا لأنك قمت بتثبيت الحزمة دون قراءة الإشعار.

@ peterjc123 الرجاء الاطلاع على if __name__ == '__main__' ليست واضحة على الفور ، لأنها مطلوبة فقط لأجهزة Windows.

__يحرر__:
فيما يتعلق بذكر المطلب ، فقد فاتني حقًا. لقد استخدمتُ conda لتثبيت الحزمة مباشرةً ، لذلك لم أواجه أي متطلبات تمهيدية مطلقًا. لكن شكرا على أي حال! وآسف لجعلك حزين!

__تعديل 2__:
واو ، لم أكن أعرف حتى أين تبحث عن ذلك 😄 👍

سؤال بخصوص ما سبق. أنا أواجه المشكلة المذكورة أعلاه داخل دفتر jupyter. كيف تحل هذا في دفتر Jupyter؟ إن تغليف الكود بـ "if __name__ == '__main__'" لا يغير شيئًا. هل يعرف شخص ما كيفية ترجمة هذا إلى دفاتر Jupyter؟

Dehde ماذا عن تعيين num_worker من DataLoader إلى الصفر؟

يارب احفظها
شكرا على الرد السريع! لم أوضح نفسي بشكل كامل ، آسف: هل هناك طريقة لتشغيل pytorch على النوافذ في دفتر jupyter مع الاستمرار في استخدام وظيفة العامل ، لذا لا تضبطها على الصفر؟ أنا بالتأكيد بحاجة للمعالجة المسبقة parellelized .. شكرا على وقتك!

هل يمكنك أن تريني الحد الأدنى من الشفرة حتى أتمكن من إعادة إنتاجها؟

يارب احفظها
سأقوم بتحريره في هذا المنشور هنا يوم الاثنين ، ليس لدي حق الوصول إلى الكود الآن. شكرا لك!

كما وعدت ، الكود الذي أستخدمه:

"
إذا __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)`

ترث WaterbodyDataset من فئة مجموعة البيانات pytorch.

أنا أيضا حصلت على نفس الخطأ. عندما أقوم بتعيين عدد عمال التشغيل على 0 ، لا يظهر الخطأ مرة أخرى. ومع ذلك ، عندما أقوم بتعيين عدد العمال إلى 1 ، لا يزال الخطأ موجودًا.

عندما أقوم بتعيين عدد العمال على 0 ، لا يوجد خطأ.

أحتاج إلى مساعدة بخصوص هذا الخطأ "BrokenPipeError: [Errno 32] Broken pipe"
الكود من: https://github.com/higgsfield/np-hard-deep-reinforcement-learning/blob/master/Neural٪20Combinatorial٪20Optimization.ipynb
أنا أستخدم نظام التشغيل windows 10.

  1. لف الكود بـ if __name__ == '__main__':
    لكن بالنسبة لي ، مع ذلك ، يظهر الخطأ مرة أخرى في بعض الأحيان. أعلم أن الأمر يبدو سخيفًا ، لكن ما يساعدني هو فقط
  2. إعادة تشغيل الكمبيوتر.
    Windows 10 هنا

لقد اكتشفت أن المشكلة لا تزال موجودة ، ولكن فقط عندما أستخدم collate_fn مخصصًا.

بالنسبة لي ، مجرد تغيير عدد العمال من 2 إلى 0 جعل الكود يعمل بشكل صحيح ...

واجهت نفس المشكلة عندما قمت بتشغيل البرنامج التعليمي لتحميل ومعالجة بيانات PyTorch. أدى تغيير عدد العمال من 2 إلى 0 إلى حل المشكلة ، لكن عدد العمال = 2 عمل جيدًا مع مجموعات البيانات الأخرى .. أستخدم Windows

num_workers> 0 لا يعمل مع windows.
حتى مع مجموعة البيانات القابلة للتكرار الجديدة.

لقد قابلت نفس الخطأ. وعندما أحاول إيجاد طريقة لحل هذه المشكلة ، يستمر البرنامج في العمل تلقائيًا (انتظر حوالي 10 دقائق) مذهل: مرتبك:

لقد قمت بتشغيل نفس الكود عدة مرات بنتائج مختلفة. أيضًا ، لقد قمت بنسخ رمز يتسبب في وجود أنبوب مكسور إلى ملف جديد (المحتويات متطابقة تمامًا) وستعمل بشكل جيد. أعتقد أن هناك عامل خارجي يلعب هنا. لا يمكنني إعادة إنتاج الخطأ بعد الآن ، ولكن ربما أحاول حذف دليل __pycache__ إذا كان هناك أي دليل.

لديك بعض المشاكل على Windows10. لا أعرف لماذا ولكني أعتقد أن المشكلة هي أداة تحميل البيانات (عدد العمال حتى 0 لا يساعد) والمعالجة المتعددة

لديك بعض المشاكل على Windows10. لا أعرف لماذا ولكني أعتقد أن المشكلة هي أداة تحميل البيانات (عدد العمال حتى 0 لا يساعد) والمعالجة المتعددة

بعد استخدام Ubuntu لبعض الوقت ، أحاول استخدام Windows-10 مؤخرًا (فقط للنماذج الأولية قبل استخدام آلة الكتلة) واصطدمت بنفس الخطأ ، حيث ساعد تعيين عدد عمال التشغيل على 0. تأكد من أنك تقوم بتعيين جميع أدوات تحميل البيانات ، وتدريبها ، واختبارها ، والتحقق من صحتها.

لدي أيضًا نفس المشكلة في Win10. تلقيت رسالة الخطأ " [Errno 32] أنبوب مكسور " عندما قمت بتعيين عدد العمال أكبر من 0.
ويتم تنزيل الكود الخاص بي من البرنامج التعليمي الرسمي لـ Pytorch.

أعتقد أن هذا خطأ في Win10 ، وأنا أتطلع إلى رؤية إصدار ثابت في الإصدار التالي.

نفس الخطأ ، num_workers = 0 نجح ، لكني أريد المعالجة المتعددة لتسريع تحميل البيانات.

نفس الخطأ ، num_workers = 0 نجح ، لكني أريد المعالجة المتعددة لتسريع تحميل البيانات.

يبدو أن الطريقة الوحيدة لعمل هذا هي استخدام Linux ، فأنا أستخدم Windows-10 للنماذج الأولية ثم دفع كل شيء إلى المجموعة التي تعتمد على Linux.

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

واجهت أيضًا مشكلة مماثلة في نظام التشغيل windows 10 عند تحديد مجموعة بيانات torchvision المخصصة الخاصة بي ومحاولة تشغيلها في مختبر jupyter. من الواضح أن مجموعة البيانات المخصصة لا يتم تسجيلها كسمة للوحدة النمطية __main__ التي يتم استدعاؤها بواسطة DataLoader في ملف multiprocessing.py \ spawn.py. أصلحته عن طريق كتابة مجموعة البيانات في وحدة نمطية ثم استيرادها كما هو مذكور هنا:

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 يمكنك ضبط num_workers على 0 لرؤية الخطأ الفعلي. هل قمت بتكوين plotter بشكل صحيح؟

نجح تعيين عدد العمال على 0 بالنسبة لي. هل يمكن أن تشرح لماذا يتسبب هذا في حدوث خطأ؟

لقد لاحظت أن هذه المشكلة مغلقة ، لكنني لا أعتقد أن هذا قد تم إصلاحه. هل هناك أي جهد لإصلاح أداة تحميل البيانات متعددة المعالجة على Windows؟ يوجد حاليًا خياران على حد علمي:

  1. لفها بـ if __name__ == '__main__': ، والتي لا تعمل دائمًا.
  2. لا تستخدم المعالجة المتعددة على الويندوز: if platform.system()=='Windows': n_cpu= 0

لذا فإن الحل الأول هو إصلاح غير كامل ، في حين أن الثاني يرقى إلى مجرد الاستسلام. هل هناك أي جهد لإصلاح تحميل البيانات متعدد المعالجة على النوافذ التي تجري حاليًا في مكان آخر أم ينبغي إعادة فتح هذا؟

يستخدم
if __name__ == '__main__' and '__file__' in globals(): بدلاً من if __name__ == '__main__':
هذا يناسبني. أستخدم دفتر Jupyter ونظام التشغيل windows 10.

هذا هو المرجع

واجهت مشكلة عند محاولة التدريب على مجموعة بيانات Coco المخصصة الخاصة بي (والتي تختلف قليلاً عن فئة CocoDetection Pytorch الافتراضية). أضف معلمات collate_fn = uses.collate_fn عملت معي:
trainloader = torch.utils.data.DataLoader(coco_train, batch_size=2, shuffle=False, num_workers=1, collate_fn=utils.collate_fn)

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات