Pytorch застрял в середине обучения

#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(), а затем повторяется много раз, не возвращая значения