Факел выделяет нулевую память GPU на PyTorch - PullRequest
1 голос
/ 27 марта 2019

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

Моя модель - RNN, построенная на PyTorch

device = torch.device('cuda: 0' if torch.cuda.is_available() else "cpu")

rnn = RNN(n_letters, n_hidden, n_categories_train)
rnn.to(device)
criterion = nn.NLLLoss()
criterion.to(device)
optimizer = torch.optim.SGD(rnn.parameters(), lr=learning_rate, weight_decay=.9)
class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()

        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size

        self.i2h = nn.Linear(input_size + hidden_size, hidden_size)
        self.i2o = nn.Linear(input_size + hidden_size, output_size)

        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, input, hidden):
        input = input.cuda()
        hidden = hidden.cuda()

        combined = torch.cat((input, hidden), 1)
        hidden = self.i2h(combined)
        output = self.i2o(combined)
        output = self.softmax(output)

        output = output.cuda()
        hidden = hidden.cuda()

        return output, hidden

    def init_hidden(self):
        return Variable(torch.zeros(1, self.hidden_size).cuda())

Функция обучения:

def train(category_tensor, line_tensor, rnn, optimizer, criterion):
    rnn.zero_grad()
    hidden = rnn.init_hidden()

    for i in range(line_tensor.size()[0]):
        output, hidden = rnn(line_tensor[i], hidden)

    loss = criterion(output, category_tensor)
    loss.backward()

    optimizer.step()

    return output, loss.item()

Функция для получения category_tensor и line_tensor:

def random_training_pair(category_lines, n_letters, all_letters):
    category = random.choice(all_categories_train)
    line = random.choice(category_lines[category])
    category_tensor = Variable(torch.LongTensor([all_categories_train.index(category)]).cuda())
    line_tensor = Variable(process_data.line_to_tensor(line, n_letters, all_letters)).cuda()

    return category, line, category_tensor, line_tensor

Я запустил следующий код:

 print(torch.cuda.get_device_name(0))
 print('Memory Usage:')
 print('Allocated:', round(torch.cuda.memory_allocated(0) / 1024 ** 3, 1), 'GB')
 print('Cached:   ', round(torch.cuda.memory_cached(0) / 1024 ** 3, 1), 'GB')

и я получил:

GeForce GTX 1060
Memory Usage:
Allocated: 0.0 GB
Cached:    0.0 GB

Я не получил никаких ошибок, но загрузка графического процессора составляет всего 1%, а загрузка процессора составляет около 31%.

Я использую Windows 10 и Anaconda, где установлен мой PyTorch. CUDA и cuDNN устанавливаются из файла .exe, загруженного с веб-сайта Nvidia.

1 Ответ

2 голосов
/ 27 марта 2019

Ваша проблема в том, что to() не является операцией на месте. Если вы позвоните rnn.to(device), он вернет a новый объект / модель , расположенный на нужном устройстве . Но это никуда не переместит старый объект!

Так меняется:

rnn = RNN(n_letters, n_hidden, n_categories_train)
rnn.to(device)

до:

rnn = RNN(n_letters, n_hidden, n_categories_train).to(device)

Для всех других случаев, когда вы использовали to таким образом, вы также должны изменить его.

Должен сделать трюк за вас!

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

...