Почему тренировка Pytorch в CUDA работает намного медленнее, чем в CPU? - PullRequest
0 голосов
/ 08 июня 2019

Полагаю, я сделал кое-что в следующей простой нейронной сети с PyTorch, потому что с CUDA она работает намного медленнее, чем в CPU, можете ли вы найти ошибку, пожалуйста? Использующая функция типа

    def backward(ctx, input):

        return backward_sigm(ctx, input)

кажется, не имеет реального влияния на исполнение

import torch
import torch.nn as nn
import torch.nn.functional as f


dname = 'cuda:0'
dname = 'cpu'




device = torch.device(dname)


print(torch.version.cuda)

def forward_sigm(ctx, input):

    sigm = 1 / (1 + torch.exp(-input))

    ctx.save_for_backward(sigm)

    return sigm

def forward_step(ctx, input):

    return  torch.tensor(input > 0.5, dtype = torch.float32, device = device)


def backward_sigm(ctx, grad_output):

    sigm, = ctx.saved_tensors

    return grad_output * sigm * (1-sigm)


def backward_step(ctx, grad_output):

    return grad_output




class StepAF(torch.autograd.Function):
    @staticmethod
    def forward(ctx, input):
        return forward_sigm(ctx, input)


    @staticmethod
    def backward(ctx, input):

        return backward_sigm(ctx, input)
    #else return grad_output



class StepNN(torch.nn.Module):

    def __init__(self, input_size, hidden_size, output_size):
        super(StepNN, self).__init__()
        self.linear1 = torch.nn.Linear(input_size, hidden_size)
        #self.linear1.cuda()
        self.linear2 = torch.nn.Linear(hidden_size, output_size)
        #self.linear2.cuda()

        #self.StepAF = StepAF.apply



    def forward(self,x):

        h_line_1 = self.linear1(x)

        h_thrash_1 = StepAF.apply(h_line_1)

        h_line_2 = self.linear2(h_thrash_1)

        output = StepAF.apply(h_line_2)

        return output


inputs = torch.tensor( [[1,0,1,0],[1,0,0,1],[0,1,0,1],[0,1,1,0],[1,0,0,0],[0,0,0,1],[1,1,0,1],[0,1,0,0],], dtype = torch.float32, device = device)

expected = torch.tensor( [[1,0,0],[1,0,0],[0,1,0],[0,1,0],[1,0,0],[0,0,1],[0,1,0],[0,0,1],], dtype = torch.float32, device = device)


nn = StepNN(4,8,3)


#print(*(x for x in nn.parameters()))

criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(nn.parameters(), lr=1e-3)

steps = 50000

print_steps = steps // 20

good_loss = 1e-5

for t in range(steps):

    output = nn(inputs)
    loss = criterion(output, expected)



    if t % print_steps == 0:
        print('step ',t, ', loss :' , loss.item())

    if loss < good_loss:
        print('step ',t, ', loss :' , loss.item())
        break

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()



test = torch.tensor( [[0,1,0,1],[0,1,1,0],[1,0,1,0],[1,1,0,1],], dtype = torch.float32, device=device)


print(nn(test))

1 Ответ

1 голос
/ 10 июня 2019

Если у вас недостаточно данных, вы не увидите никакого улучшения производительности при использовании графического процессора.Проблема в том, что графические процессоры используют параллельную обработку, поэтому, если у вас нет больших объемов данных, центральный процессор может обрабатывать выборки почти так же быстро, как графический процессор.

Насколько я вижу в вашем примере, вы используете8 образцов размером (4, 1).Я мог бы предположить, что, имея более сотни или тысячи образцов, вы увидите улучшение производительности на GPU.В вашем случае размер выборки (4, 1), а размер скрытого слоя - 8, поэтому процессор может выполнять вычисления довольно быстро.

Существует множество примеров ноутбуков онлайн, в которых люди используют данные MNIST (в нем около 60000 изображений для обучения), поэтому вы можете загрузить один из них, возможно, в Google Colab, а затем попробовать тренироваться на ЦП, а затем на ГП и наблюдатьвремя обучения.Например, вы можете попробовать эту ссылку .Он использует TensorFlow вместо PyTorch, но он даст вам представление об улучшении производительности графического процессора.

Примечание. Если вы ранее не использовали Google Colab, то вам нужно изменить тип среды выполнения (Нет дляCPU и GPU для GPU) в меню времени выполнения вверху.

Кроме того, я опубликую результаты этого ноутбука здесь (посмотрите на время, указанное в скобках, и если вы его запустите, вы можетепосмотрите, как быстро он работает):

на процессоре:

INFO:tensorflow:loss = 294.3736, step = 1
INFO:tensorflow:loss = 28.285727, step = 101 (23.769 sec)
INFO:tensorflow:loss = 23.518856, step = 201 (24.128 sec)

на графическом процессоре:

INFO:tensorflow:loss = 295.08328, step = 0
INFO:tensorflow:loss = 47.37291, step = 100 (4.709 sec)
INFO:tensorflow:loss = 23.31364, step = 200 (4.581 sec)
INFO:tensorflow:loss = 9.980572, step = 300 (4.572 sec)
INFO:tensorflow:loss = 17.769928, step = 400 (4.560 sec)
INFO:tensorflow:loss = 16.345463, step = 500 (4.531 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...