#python #python-3.x #multithreading #pytorch
#python #python-3.x #многопоточность #pytorch
Вопрос:
У меня есть этот код:
my_model.py:
num_workers = 1
classes = ('plane', 'car', 'bird', 'cat',
'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=num_workers)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=num_workers)
model_tuils.py:
def train_network(net, number_of_epoch, trainloader, optimizer, criterion):
for epoch in range(number_of_epoch): # loop over the dataset multiple times
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]
inputs, labels = data
# zero the parameter gradients
optimizer.zero_grad()
# forward backward optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# print statistics
running_loss = loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print('[%d, ]] loss: %.3f' %
(epoch 1, i 1, running_loss / 2000))
running_loss = 0.0
print('Finished Training')
Когда я запускаю свой код, он складывается внутри цикла обучения на первой итерации в этой строке:
for i, data in enumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]
inputs, labels = data <----------------------------this line
# zero the parameter gradients
optimizer.zero_grad()
Когда я пытаюсь найти, что мешает программе, я получаю этот файл:
/Users/user/.pyenv/versions/3.7.8/lib/python3.7/multiprocessing/queues.py:
def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe,
onerror, queue_sem):
debug('starting thread to feed data to pipe')
nacquire = notempty.acquire
nrelease = notempty.release
nwait = notempty.wait
bpopleft = buffer.popleft
sentinel = _sentinel
if sys.platform != 'win32':
wacquire = writelock.acquire
wrelease = writelock.release
else:
wacquire = None
while 1:
try:
nacquire()
try:
if not buffer:
nwait() <------------------------------ This line
finally:
nrelease()
Что я делаю не так?
Мой num_workers равен 1, поэтому у него не должно быть нескольких потоков
Комментарии:
1. «Застрял», вы имеете в виду, что ваш код выдает ошибку, верно? Если да, можете ли вы показать нам сообщение об ошибке со строкой в вашем коде, которая его выдает (не код PyTorch src).
2. Он не выдает ошибку. Он просто возвращается к nwait() (как будто он не имеет значения)
3. «он стекается внутри цикла обучения на первой итерации» и «возвращается к», что вы имеете в виду под этим?
4. Что код выполняется до строки nwait(), а затем повторяется много раз, не возвращая значения