μλ νμΈμ, μ λ 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)
λͺ κ°μ§ μ μμ ν΄μ£Όμ€ μ μλμ? μ λ§ κ³ λ§μ΅λλ€.
μ΄κ²μ μ¬νν μ μλ μ½λ μ‘°κ°μ κ²μν μ μμ΅λκΉ?
@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μ μ¬μ©νκ³ μμ΅λλ€.
if __name__ == '__main__':
μ½λλ₯Ό λνν©λλ€.λ¬Έμ κ° μ¬μ ν μ‘΄μ¬νμ§λ§ μ¬μ©μ μ μ 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μμ λ€μ€ μ²λ¦¬ λ°μ΄ν° λ‘λλ₯Ό μμ νλ €λ λ Έλ ₯μ΄ μμ΅λκΉ? νμ¬ λ΄κ° μλ ν λ κ°μ§ μ΅μ μ΄ μμ΅λλ€.
if __name__ == '__main__':
κ°μΈμμμ€. νμ μλνμ§λ μμ΅λλ€.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)
κ°μ₯ μ μ©ν λκΈ
@mjchen611 μ€μ μ€λ₯λ₯Ό λ³΄λ €λ©΄ num_workersλ₯Ό 0μΌλ‘ μ€μ ν μ μμ΅λλ€.
plotter
μ¬λ°λ₯΄κ² ꡬμ±νμ΅λκΉ?