Pytorch: BrokenPipeError: [Errno 32] 깨진 νŒŒμ΄ν”„

에 λ§Œλ“  2017λ…„ 08μ›” 08일  Β·  35μ½”λ©˜νŠΈ  Β·  좜처: pytorch/pytorch

μ•ˆλ…•ν•˜μ„Έμš”, μ €λŠ” Pytorchλ₯Ό μ‚¬μš©ν•˜μ—¬ 삼쀑 λ„€νŠΈμ›Œν¬(GPU)λ₯Ό μ‹€ν–‰ν•˜μ§€λ§Œ 데이터λ₯Ό μ–»μ—ˆμ„ λ•Œ 항상 BrokenPipeError:[Errno 32] Broken pipeκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ½”λ“œμ—μ„œ λ¬Έμ œκ°€ μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

enumerate(test_loader)의 batch_idx, (data1, data2, data3):
args.cuda인 경우:
data1, data2, data3 = data1.cuda(), data2.cuda(), data3.cuda()
data1, data2, data3 = λ³€μˆ˜(data1), λ³€μˆ˜(data2), λ³€μˆ˜(data3)

λͺ‡ 가지 μ œμ•ˆμ„ ν•΄μ£Όμ‹€ 수 μžˆλ‚˜μš”? 정말 κ³ λ§™μŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@mjchen611 μ‹€μ œ 였λ₯˜λ₯Ό 보렀면 num_workersλ₯Ό 0으둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. plotter μ˜¬λ°”λ₯΄κ²Œ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  35 λŒ“κΈ€

이것을 μž¬ν˜„ν•  수 μžˆλŠ” μ½”λ“œ 쑰각을 κ²Œμ‹œν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

@alykhantejani

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
역좔적(κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰):
파일 "", 1ν–‰,
runfile('G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py', wdir='G:/researchWork2/pytorch/triplet-network-pytorch-master')

μ‹€ν–‰ 파일의 "D:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py" 파일, 880ν–‰
execfile(파일λͺ…, λ„€μž„μŠ€νŽ˜μ΄μŠ€)

execfile의 "D:\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py" 파일, 102ν–‰
exec(compile(f.read(), 파일 이름, 'exec'), λ„€μž„μŠ€νŽ˜μ΄μŠ€)

파일 "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", 258ν–‰, in
κΈ°λ³Έ()

파일 "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", 116ν–‰, 메인
train(train_loader, tnet, κΈ°μ€€, μ΅œμ ν™” ν”„λ‘œκ·Έλž¨, 에포크)

파일 "G:/researchWork2/pytorch/triplet-network-pytorch-master/train.py", 137ν–‰, κΈ°μ°¨
enumerate(train_loader)의 batch_idx, (data1, data2):

파일 "D:\Anaconda3\lib\site-packages\torch\utils\data\dataloader.py", 쀄 303, iter
DataLoaderIter(자체) λ°˜ν™˜

파일 "D:\Anaconda3\lib\site-packages\torch\utils\data\dataloader.py", 162ν–‰, init
w.start()

파일 "D:\Anaconda3\lib\multiprocessing\process.py", 105ν–‰, μ‹œμž‘ μ‹œ
self._popen = self._Popen(self)

파일 "D:\Anaconda3\lib\multiprocessing\context.py", 223ν–‰, _Popen
λ°˜ν™˜ _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
reduction.dump(process_obj, to_child)

파일 "D:\Anaconda3\lib\multiprocessing\reduction.py", 60ν–‰, 덀프
ForkingPickler(파일, ν”„λ‘œν† μ½œ).dump(obj)

BrokenPipeError: [Errno 32] 깨진 νŒŒμ΄ν”„

4) λ‹€μŒκ³Ό 같은 μ—΄μ°¨ κ΄€λ ¨ μ½”λ“œμ˜ 일뢀:
def train(train_loader, tnet, κΈ°μ€€, μ΅œμ ν™” ν”„λ‘œκ·Έλž¨, epoch):
손싀 = AverageMeter()
accs = AverageMeter()
emb_norms = AverageMeter()

κΈ°μ°¨ λͺ¨λ“œλ‘œ μ „ν™˜

tnet.train()
enumerate(train_loader)의 batch_idx, (data1, data2, data3):
args.cuda인 경우:
data1, data2, data3 = data1.cuda(), data2.cuda(), data3.cuda()
data1, data2, data3 = λ³€μˆ˜(data1), λ³€μˆ˜(data2), λ³€μˆ˜(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))

μ–΄λ”˜κ°€μ— 평균 값을 기둝

plotter.plot('acc', 'κΈ°μ°¨', 에포크, accs.avg)
plotter.plot('손싀', 'κΈ°μ°¨', 에포크, loss.avg)
plotter.plot('emb_norms', 'κΈ°μ°¨', 신기원, emb_norms.avg)

정말 κ³ λ§™μŠ΅λ‹ˆλ‹€.

@alykhantejani
그리고 Cuda와 ν•¨κ»˜ Windows8.1μ—μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.

아직 κ³΅μ‹μ μœΌλ‘œ 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 ν† λ‘  νšŒμ‹ μ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.

νŽΈμ§‘ν•˜λ‹€:

λ‹€μŒμ€ μΆ©λŒν•˜μ§€ μ•ŠλŠ” μ½”λ“œμ΄λ©° λ™μ‹œμ— Windows μ‹œμŠ€ν…œμ— λŒ€ν•œ Python의 닀쀑 처리 ν”„λ‘œκ·Έλž˜λ° 지침을 μ€€μˆ˜ν•©λ‹ˆλ‹€.

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 DataLoader의 num_workerλ₯Ό 0으둜 μ„€μ •ν•˜λŠ” 것은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

@peterjc123
λΉ λ₯Έ λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€! λ‚˜λŠ” μ™„μ „νžˆ λͺ…ν™•ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μ£„μ†‘ν•©λ‹ˆλ‹€. jupyter λ…ΈνŠΈλΆμ˜ Windowsμ—μ„œ pytorchλ₯Ό μ‹€ν–‰ν•˜κ³  μž‘μ—…μž κΈ°λŠ₯을 계속 μ‚¬μš©ν•˜λ―€λ‘œ 0으둜 μ„€μ •ν•˜μ§€ μ•ŠλŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ? ν™•μ‹€νžˆ λ³‘λ ¬ν™”λœ μ „μ²˜λ¦¬κ°€ ν•„μš”ν•©λ‹ˆλ‹€. μ‹œκ°„ λ‚΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

μž¬ν˜„ν•  수 μžˆλ„λ‘ μ΅œμ†Œν•œμ˜ μ½”λ“œλ₯Ό 보여 μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

@peterjc123
μ›”μš”μΌμ— 이 κ²Œμ‹œλ¬Όλ‘œ μˆ˜μ •ν•˜κ² μŠ΅λ‹ˆλ‹€. μ§€κΈˆμ€ μ½”λ“œμ— μ•‘μ„ΈμŠ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!

μ•½μ†ν•œ λŒ€λ‘œ λ‚΄κ°€ μ‚¬μš©ν•˜λŠ” μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

`
__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 데이터 μ„ΈνŠΈ ν΄λž˜μŠ€μ—μ„œ μƒμ†ν•©λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ 같은 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. num_workers λ₯Ό 0으둜 μ„€μ •ν•˜λ©΄ 였λ₯˜κ°€ λ‹€μ‹œ λ‚˜νƒ€λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ num_workers λ₯Ό 1둜 μ„€μ •ν•˜λ©΄ 였λ₯˜κ°€ 계속 λ°œμƒν•©λ‹ˆλ‹€.

num_workersλ₯Ό 0으둜 μ„€μ •ν•˜λ©΄ 였λ₯˜κ°€ μ—†μŠ΅λ‹ˆλ‹€.

이 였λ₯˜μ— λŒ€ν•œ 도움이 ν•„μš”ν•©λ‹ˆλ‹€. "BrokenPipeError: [Errno 32] Broken pipe"
μ½”λ“œ: https://github.com/higgsfield/np-hard-deep-reinforcement-learning/blob/master/Neural%20Combinatorial%20Optimization.ipynb
λ‚˜λŠ” μœˆλ„μš° 10을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

  1. if __name__ == '__main__': μ½”λ“œλ₯Ό λž˜ν•‘ν•©λ‹ˆλ‹€.
    κ·ΈλŸ¬λ‚˜ λ‚˜λ₯Ό μœ„ν•΄ κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  였λ₯˜κ°€ λ•Œλ•Œλ‘œ λ‹€μ‹œ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. μ–΄λ¦¬μ„κ²Œ λ“€λ¦°λ‹€λŠ” 것을 μ•Œμ§€λ§Œ, λ‚˜λ₯Ό λ•λŠ” 것은
  2. 컴퓨터 μž¬λΆ€νŒ….
    여기에 μœˆλ„μš° 10

λ¬Έμ œκ°€ μ—¬μ „νžˆ μ‘΄μž¬ν•˜μ§€λ§Œ μ‚¬μš©μž μ •μ˜ collate_fn μ‚¬μš©ν•  λ•Œλ§Œ λ°œκ²¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λ₯Ό μœ„ν•΄ num_workersλ₯Ό 2μ—μ„œ 0으둜 λ³€κ²½ν•˜λ©΄ μ½”λ“œκ°€ μ œλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€...

PyTorch 데이터 λ‘œλ“œ 및 처리 μžμŠ΅μ„œλ₯Ό μ‹€ν–‰ν•  λ•Œλ„ λ™μΌν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. num_workersλ₯Ό 2μ—μ„œ 0으둜 λ³€κ²½ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμ§€λ§Œ num_workers = 2λŠ” λ‹€λ₯Έ 데이터 μ„ΈνŠΈμ—μ„œ 잘 μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. Windowsλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

num_workers > 0은 Windowsμ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
μƒˆλ‘œμš΄ IterableDataset을 μ‚¬μš©ν•˜λ”λΌλ„.

λ‚˜λŠ”μ΄ 같은 였λ₯˜λ₯Ό λ§Œλ‚¬λ‹€. 그리고 이 문제λ₯Ό ν•΄κ²°ν•  방법을 찾으렀고 ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ 계속 μžλ™μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€(μ•½ 10λΆ„ λŒ€κΈ°).

λ‚˜λŠ” λ‹€λ₯Έ 결과둜 λ˜‘κ°™μ€ μ½”λ“œλ₯Ό μ—¬λŸ¬ 번 μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 깨진 νŒŒμ΄ν”„λ₯Ό λ°œμƒμ‹œν‚€λŠ” μ½”λ“œλ₯Ό μƒˆ 파일(λ‚΄μš©μ΄ μ •ν™•νžˆ 동일함)에 λ³΅μ‚¬ν–ˆλŠ”λ° μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” μ™ΈλΆ€ μš”μΈμ΄ μž‘μš©ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 더 이상 버그λ₯Ό μž¬ν˜„ν•  수 μ—†μ§€λ§Œ __pycache__ 디렉토리가 있으면 μ‚­μ œν•΄ λ³΄μ‹­μ‹œμ˜€.

Windows10에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄μœ λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ λ¬Έμ œλŠ” 데이터 λ‘œλ”(num_workersλ₯Ό 0으둜 섀정해도 도움이 λ˜μ§€ μ•ŠμŒ) 및 닀쀑 처리라고 μƒκ°ν•©λ‹ˆλ‹€.

Windows10에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄μœ λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ λ¬Έμ œλŠ” 데이터 λ‘œλ”(num_workersλ₯Ό 0으둜 섀정해도 도움이 λ˜μ§€ μ•ŠμŒ) 및 닀쀑 처리라고 μƒκ°ν•©λ‹ˆλ‹€.

quire에 Ubuntuλ₯Ό μ‚¬μš©ν•œ ν›„ μ΅œκ·Όμ— Windows-10을 μ‹œλ„ν•˜κ³ (ν΄λŸ¬μŠ€ν„° μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜κΈ° 전에 ν”„λ‘œν† νƒ€μ΄ν•‘μ„ μœ„ν•΄) λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ num_workersλ₯Ό 0으둜 μ„€μ •ν•˜λŠ” 데 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  데이터 λ‘œλ”λ₯Ό μ„€μ •ν•˜κ³  ν•™μŠ΅, ν…ŒμŠ€νŠΈ 및 κ²€μ¦ν•˜λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

Win10μ—μ„œλ„ λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. num_workersλ₯Ό 0보닀 크게 μ„€μ •ν•˜λ©΄ ' [Errno 32] Broken pipe ' 였λ₯˜ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
그리고 λ‚΄ μ½”λ“œλŠ” Pytorch 곡식 μžμŠ΅μ„œμ—μ„œ λ‹€μš΄λ‘œλ“œν•©λ‹ˆλ‹€.

λ‚˜λŠ” 그것이 Win10의 버그라고 μƒκ°ν•˜κ³  λ‹€μŒ λ¦΄λ¦¬μŠ€μ—μ„œ μˆ˜μ •λœ 버전을 보기λ₯Ό κ³ λŒ€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ™μΌν•œ 였λ₯˜, num_workers=0이 μž‘λ™ν–ˆμ§€λ§Œ 닀쀑 처리λ₯Ό 톡해 데이터 λ‘œλ“œ 속도λ₯Ό 높이고 μ‹ΆμŠ΅λ‹ˆλ‹€.

λ™μΌν•œ 였λ₯˜, num_workers=0이 μž‘λ™ν–ˆμ§€λ§Œ 닀쀑 처리λ₯Ό 톡해 데이터 λ‘œλ“œ 속도λ₯Ό 높이고 μ‹ΆμŠ΅λ‹ˆλ‹€.

이것이 μž‘λ™ν•˜λŠ” μœ μΌν•œ 방법은 Linuxλ₯Ό μ‚¬μš©ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μž…μ„ μœ„ν•΄ Windows-10을 μ‚¬μš©ν•˜κ³  Linux 기반 ν΄λŸ¬μŠ€ν„°μ— λͺ¨λ“  것을 ν‘Έμ‹œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

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

λ˜ν•œ λ‚΄ μ‚¬μš©μž 지정 ν† μΉ˜λΉ„μ „ 데이터 μ„ΈνŠΈλ₯Ό μ •μ˜ν•˜κ³  jupyter labμ—μ„œ μ‹€ν–‰ν•˜λ €κ³  ν•  λ•Œ Windows 10μ—μ„œ μœ μ‚¬ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λΆ„λͺ…νžˆ μ‚¬μš©μž μ •μ˜ 데이터 μ„ΈνŠΈλŠ” multiprocessing.py\spawn.py νŒŒμΌμ—μ„œ DataLoader에 μ˜ν•΄ ν˜ΈμΆœλ˜λŠ” __main__ λͺ¨λ“ˆμ— λŒ€ν•œ μ†μ„±μœΌλ‘œ λ“±λ‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 데이터 μ„ΈνŠΈλ₯Ό λͺ¨λ“ˆμ— μž‘μ„±ν•œ λ‹€μŒ 여기에 μ–ΈκΈ‰λœ λŒ€λ‘œ κ°€μ Έμ™€μ„œ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

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 μ˜¬λ°”λ₯΄κ²Œ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆκΉŒ?

num_workersλ₯Ό 0으둜 μ„€μ •ν•˜λ©΄ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. 이것이 μ™œ 였λ₯˜λ₯Ό μΌμœΌν‚€λŠ”μ§€ μ„€λͺ…ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

이 λ¬Έμ œκ°€ μ’…λ£Œλœ κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μ§€λ§Œ ν•΄κ²°λ˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€. Windowsμ—μ„œ 닀쀑 처리 데이터 λ‘œλ”λ₯Ό μˆ˜μ •ν•˜λ €λŠ” λ…Έλ ₯이 μžˆμŠ΅λ‹ˆκΉŒ? ν˜„μž¬ λ‚΄κ°€ μ•„λŠ” ν•œ 두 가지 μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

  1. if __name__ == '__main__': κ°μ‹Έμ‹­μ‹œμ˜€. 항상 μž‘λ™ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
  2. Windowsμ—μ„œ 닀쀑 처리λ₯Ό μ‚¬μš©ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€: if platform.system()=='Windows': n_cpu= 0

λ”°λΌμ„œ 첫 λ²ˆμ§ΈλŠ” λΆˆμ™„μ „ν•œ μˆ˜μ •μ΄κ³  두 λ²ˆμ§ΈλŠ” κ·Έλƒ₯ ν¬κΈ°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ν˜„μž¬ λ‹€λ₯Έ κ³³μ—μ„œ 진행 쀑인 μ°½μ—μ„œ 닀쀑 처리 데이터 λ‘œλ”©μ„ μˆ˜μ •ν•˜λ €λŠ” λ…Έλ ₯이 μžˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ λ‹€μ‹œ μ—΄μ–΄μ•Ό ν•©λ‹ˆκΉŒ?

μ‚¬μš©ν•˜λ‹€
if __name__ == '__main__' and '__file__' in globals(): λŒ€μ‹  if __name__ == '__main__':
그것은 λ‚˜λ₯Ό μœ„ν•΄ μž‘λ™ν•©λ‹ˆλ‹€. Jupyter λ…ΈνŠΈλΆκ³Ό Windows 10을 μ‚¬μš©ν•©λ‹ˆλ‹€.

이것은 μ°Έμ‘°μž…λ‹ˆλ‹€

λ‚΄ μ‚¬μš©μž 지정 Coco 데이터 μ„ΈνŠΈ(κΈ°λ³Έ CocoDetection Pytorch ν΄λž˜μŠ€μ™€ μ•½κ°„ 닀름)λ₯Ό ν•™μŠ΅ν•˜λ €κ³  ν•  λ•Œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ params collate_fn=utils.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 λ“±κΈ‰