Pytorch: BrokenPipeError: [Errno 32] Pipa rusak

Dibuat pada 8 Agu 2017  ·  35Komentar  ·  Sumber: pytorch/pytorch

Hai, saya menggunakan Pytorch untuk menjalankan jaringan triplet (GPU), tetapi ketika saya mendapatkan data , selalu ada BrokenPipeError:[Errno 32] Pipa rusak.

Saya pikir ada yang salah dalam kode berikut:

untuk batch_idx, (data1, data2, data3) di enumerate(test_loader):
jika args.cuda:
data1, data2, data3 = data1.cuda(), data2.cuda(), data3.cuda()
data1, data2, data3 = Variabel(data1), Variabel(data2), Variabel(data3)

Bisakah Anda memberi saya beberapa saran? Terima kasih banyak.

Komentar yang paling membantu

@ mjchen611 Anda dapat mengatur num_workers ke 0 untuk melihat kesalahan yang sebenarnya. Apakah plotter dikonfigurasi dengan benar?

Semua 35 komentar

Apakah Anda dapat memposting cuplikan kode yang dapat mereproduksi ini?

@allykhantejani

1) Tautan kodenya adalah: https://github.com/andreasveit/triplet-network-pytorch/blob/master/train.py

2) Kesalahan terjadi di train.py -- 136

3) Kesalahannya adalah:

runfile('G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py', wdir='G:/researchWork2/pytorch/triplet-network-pytorch-master')
Modul yang dimuat ulang: triplet_mnist_loader, triplet_image_loader, tripletnet

Jumlah parameter: 21840
Traceback (panggilan terakhir terakhir):
File "", baris 1, di
runfile('G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py', wdir='G:/researchWork2/pytorch/triplet-network-pytorch-master')

File "D:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", baris 880, di runfile
execfile (nama file, namespace)

File "D:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", baris 102, di execfile
exec(compile(f.read(), nama file, 'exec'), namespace)

File "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", baris 258, di
utama()

File "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", baris 116, di utama
kereta(train_loader, tnet, kriteria, pengoptimal, zaman)

File "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", baris 137, di kereta
untuk batch_idx, (data1, data2) di enumerate(train_loader):

File "D:\Anaconda3\lib\site-packages\torch\utils\data\dataloader.py", baris 303, di iter
kembalikan DataLoaderIter(sendiri)

File "D:\Anaconda3\lib\site-packages\torch\utils\data\dataloader.py", baris 162, di init
w.mulai()

File "D:\Anaconda3\lib\multiprocessing\process.py", baris 105, di awal
self._popen = self._Popen(self)

File "D:\Anaconda3\lib\multiprocessing\context.py", baris 223, di _Popen
kembalikan _default_context.get_context().Process._Popen(process_obj)

File "D:\Anaconda3\lib\multiprocessing\context.py", baris 322, di _Popen
kembalikan Popen(process_obj)

File "D:\Anaconda3\lib\multiprocessing\popen_spawn_win32.py", baris 65, di init
reduksi.dump(process_obj, to_child)

File "D:\Anaconda3\lib\multiprocessing\reduction.py", baris 60, di dump
ForkingPickler(file, protokol).dump(obj)

BrokenPipeError: [Errno 32] Pipa rusak

4) Beberapa bagian dari kode terkait kereta api sebagai berikut:
def train(train_loader, tnet, kriteria, pengoptimal, zaman):
kerugian = AverageMeter()
accs = Rata-RataMeter()
emb_norms = AverageMeter()

beralih ke mode kereta

tnet.kereta()
untuk batch_idx, (data1, data2, data3) di enumerate(train_loader):
jika args.cuda:
data1, data2, data3 = data1.cuda(), data2.cuda(), data3.cuda()
data1, data2, data3 = Variabel(data1), Variabel(data2), Variabel(data3)

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

log nilai rata-rata ke suatu tempat

plotter.plot('acc', 'train', epoch, accs.avg)
plotter.plot('kerugian', 'kereta api', zaman, kerugian.avg)
plotter.plot('emb_norms', 'train', epoch, emb_norms.avg)

Terima kasih banyak.

@allykhantejani
Dan saya menggunakannya di Windows8.1 dengan Cuda

kami belum mendukung windows secara resmi. Mungkin @peterjc123 tahu apa yang salah.

@ mjchen611 Anda dapat mengatur num_workers ke 0 untuk melihat kesalahan yang sebenarnya. Apakah plotter dikonfigurasi dengan benar?

Saya benar-benar dapat memverifikasi bahwa pengaturan num_workers ke 0 atau 1 membantu. Apa pun masalahnya, DataLoader selalu gagal dengan saya terlepas dari kumpulan data dengan nilai yang lebih tinggi. Kesalahan ada hubungannya dengan multiprocessing dengan 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 Sebenarnya kesalahan ini hanya terjadi ketika Anda mencoba melakukan multiprocessing pada beberapa kode dengan kesalahan di dalamnya. Tidak terduga Anda menghadapi masalah ini ketika kode Anda benar. Saya tidak tahu versi mana yang Anda gunakan. Bisakah Anda mengirim sepotong kecil kode yang dapat mereproduksi masalah Anda?

Akan melakukan! Dan ingat, saya menggunakan mesin Windows. Kode disalin langsung dari tutorial PyTorch: Transfer Learning Tutorial . Ini berarti bahwa kumpulan data harus diunduh dan diekstraksi seperti yang diinstruksikan.

Kode untuk mereproduksi kesalahan:

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

Dan saya baru saja membuat beberapa posting forum PyTorch tentang ini. Masalahnya terletak pada multiprocessing Python dan Windows. Silakan lihat balasan diskusi PyTorch ini karena saya tidak ingin terlalu menyalin hal-hal di sini.

Sunting:

Berikut kode yang tidak mogok, yang pada saat yang sama sesuai dengan panduan pemrograman multiprosesor Python untuk mesin 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 Yah, saya pikir saya telah menyatakannya di mana paket itu diterbitkan. Saya sangat sedih Anda menginstal paket tanpa membaca pemberitahuan.

@peterjc123 Silakan lihat tanggapan saya yang diedit di mana saya melakukan hal itu. Persyaratan untuk membungkus kode di dalam kode if __name__ == '__main__' tidak langsung jelas, karena hanya diperlukan untuk mesin Windows.

__Edit__:
Soal penegasan syarat, saya memang melewatkannya. Saya menggunakan conda untuk menginstal paket secara langsung, jadi saya tidak pernah menemukan persyaratan pengantar apa pun. Tapi Terimakasih! Dan maaf telah membuatmu sedih!

__Sunting 2__:
Wow, tidak tahu bahkan di mana mencarinya 👍

Sebuah pertanyaan tentang hal di atas. Saya mengalami masalah di atas dalam notebook jupyter. Bagaimana Anda menyelesaikan ini di notebook jupyter? Membungkus kode dalam "if __name__ == '__main__' " tidak mengubah apa pun. Adakah yang tahu cara menerjemahkan ini ke notebook jupyter?

@Dehde Bagaimana dengan pengaturan num_worker dari DataLoader ke nol?

@peterjc123
Terima kasih atas balasan cepatnya! Saya tidak sepenuhnya menjelaskan, maaf: Apakah ada cara untuk menjalankan pytorch di windows di notebook jupyter dan masih menggunakan fungsionalitas pekerja, jadi tidak menyetelnya ke nol? Saya benar-benar membutuhkan prapemrosesan paralel.. Terima kasih atas waktu Anda!

Bisakah Anda menunjukkan kepada saya kode minimal sehingga saya bisa mereproduksi?

@peterjc123
Saya akan mengeditnya menjadi posting ini di sini pada hari Senin, tidak memiliki akses ke kode sekarang. Terima kasih!

Seperti yang dijanjikan, kode yang saya gunakan:

`
jika __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 mewarisi dari kelas dataset pytorch.

Saya juga mendapat kesalahan yang sama. Ketika saya mengatur num_workers ke 0, kesalahan tidak muncul lagi. Namun, ketika saya mengatur num_workers ke 1, kesalahannya masih ada.

Ketika saya mengatur num_workers ke 0, tidak ada kesalahan.

Tolong saya butuh bantuan dengan kesalahan ini "BrokenPipeError: [Errno 32] Pipa rusak"
kode dari: https://github.com/higgsfield/np-hard-deep-reinforcement-learning/blob/master/Neural%20Combinatorial%20Optimization.ipynb
saya menggunakan windows 10.

  1. Bungkus kode dalam if __name__ == '__main__':
    tapi bagi saya, toh, error itu kadang muncul lagi. Saya tahu kedengarannya konyol, tetapi yang membantu saya hanyalah
  2. me-reboot komputer.
    Windows 10 di sini

Saya menemukan bahwa masalahnya masih ada, tetapi hanya ketika saya menggunakan custom collate_fn .

Bagi saya, hanya mengubah num_workers dari 2 menjadi 0 membuat kode berfungsi dengan baik ...

Punya masalah yang sama ketika saya menjalankan Tutorial Pemuatan dan Pemrosesan Data PyTorch. Mengubah num_workers dari 2 ke 0 memecahkan masalah, tetapi num_workers = 2 bekerja dengan baik dengan dataset lain.. Saya menggunakan Windows

num_workers > 0 tidak berfungsi untuk windows.
Bahkan dengan IterableDataset baru.

Saya bertemu kesalahan yang sama ini. Dan ketika saya mencoba menemukan metode untuk menyelesaikan masalah ini, program terus berjalan secara otomatis (tunggu sekitar 10 menit) luar biasa :confused:

Saya telah menjalankan kode yang sama persis beberapa kali dengan hasil yang berbeda. Juga, saya telah menyalin kode yang menyebabkan pipa rusak ke file baru (isinya persis sama) dan itu akan berjalan dengan baik. Saya pikir ada faktor eksternal yang berperan di sini. Saya tidak dapat mereproduksi bug lagi, tetapi mungkin coba hapus direktori __pycache__ jika ada.

memiliki beberapa masalah pada Windows10. tidak tahu mengapa tapi saya pikir masalahnya adalah dataloader (num_workers ke 0 tidak membantu) dan multiprocessing

memiliki beberapa masalah pada Windows10. tidak tahu mengapa tapi saya pikir masalahnya adalah dataloader (num_workers ke 0 tidak membantu) dan multiprocessing

Setelah menggunakan Ubuntu untuk beberapa waktu, saya mencoba Windows-10 akhir-akhir ini (hanya untuk membuat prototipe sebelum menggunakan mesin cluster) dan menemukan kesalahan yang sama, menyetel num_workers ke 0 membantu. Pastikan Anda mengatur semua pemuat data, melatih, menguji, dan memvalidasi.

Saya juga memiliki masalah yang sama di Win10. Saya mendapat pesan kesalahan ' [Errno 32] Broken pipe ' ketika saya mengatur num_workers lebih besar dari 0.
Dan kode saya diunduh dari tutorial resmi Pytorch.

Saya kira itu adalah bug untuk Win10, dan saya menantikan untuk melihat versi tetap pada rilis berikutnya.

kesalahan yang sama, num_workers=0 bekerja, tetapi saya ingin multiprocessing untuk mempercepat pemuatan data.

kesalahan yang sama, num_workers=0 bekerja, tetapi saya ingin multiprocessing untuk mempercepat pemuatan data.

Tampaknya satu-satunya cara agar ini berfungsi adalah menggunakan Linux, saya menggunakan Windows-10 untuk membuat prototipe dan kemudian mendorong semuanya ke cluster yang berbasis Linux.

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

Saya juga mengalami masalah serupa di windows 10 ketika mendefinisikan dataset torchvision kustom saya dan mencoba menjalankannya di lab jupyter. Rupanya kumpulan data khusus tidak terdaftar sebagai atribut ke modul __main__ yang dipanggil oleh DataLoader dalam file multiprocessing.py\spawn.py. Saya memperbaikinya dengan menulis dataset ke dalam modul dan kemudian mengimpornya seperti yang disebutkan di sini:

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 Anda dapat mengatur num_workers ke 0 untuk melihat kesalahan yang sebenarnya. Apakah plotter dikonfigurasi dengan benar?

Mengatur num_workers ke 0 berhasil untuk saya. Bisakah Anda menjelaskan mengapa ini menyebabkan kesalahan?

Saya perhatikan masalah ini sudah ditutup, tetapi saya rasa ini belum diperbaiki. Apakah ada upaya untuk memperbaiki dataloader multi-pemrosesan di windows? Saat ini ada 2 opsi sejauh yang saya tahu:

  1. bungkus dalam if __name__ == '__main__': , yang tidak selalu berhasil.
  2. jangan gunakan multi-pemrosesan di windows: if platform.system()=='Windows': n_cpu= 0

Jadi yang pertama adalah perbaikan yang tidak sempurna, sedangkan yang kedua sama saja dengan menyerah. Apakah ada upaya untuk memperbaiki pemuatan data multi-proses pada windows yang saat ini terjadi di tempat lain atau haruskah kita membuka kembali yang ini?

Menggunakan
if __name__ == '__main__' and '__file__' in globals(): bukannya if __name__ == '__main__':
Itu bekerja untuk saya. Saya menggunakan notebook Jupyter dan windows 10.

ini referensinya

Saya mendapat masalah ketika mencoba melatih pada dataset Coco kustom saya (yang sedikit berbeda dari kelas CocoDetection Pytorch default). Tambahkan params collate_fn=utils.collate_fn bekerja untuk saya:
trainloader = torch.utils.data.DataLoader(coco_train, batch_size=2, shuffle=False, num_workers=1, collate_fn=utils.collate_fn)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat