Почему Pytorch (CUDA) работает медленно на GPU - PullRequest
0 голосов
/ 22 сентября 2018

Я уже некоторое время играю с Pytorch в Linux, и недавно решил попробовать установить больше сценариев для запуска с моим графическим процессором на моем рабочем столе Windows.С тех пор, как я попробовал это, я заметил огромную разницу в производительности между временем выполнения моего GPU и временем выполнения CPU на тех же сценариях, так что мой GPU значительно медленнее, чем CPU.Чтобы проиллюстрировать это, я просто нашел учебную программу (https://pytorch.org/tutorials/beginner/pytorch_with_examples.html#pytorch-tensors)

import torch
import datetime
print(torch.__version__)

dtype = torch.double
#device = torch.device("cpu")
device = torch.device("cuda:0")

# N is batch size; D_in is input dimension;
# H is hidden dimension; D_out is output dimension.
N, D_in, H, D_out = 64, 1000, 100, 10

# Create random input and output data
x = torch.randn(N, D_in, device=device, dtype=dtype)
y = torch.randn(N, D_out, device=device, dtype=dtype)

# Randomly initialize weights
w1 = torch.randn(D_in, H, device=device, dtype=dtype)
w2 = torch.randn(H, D_out, device=device, dtype=dtype)


start = datetime.datetime.now()
learning_rate = 1e-6
for t in range(5000):
    # Forward pass: compute predicted y
    h = x.mm(w1)
    h_relu = h.clamp(min=0)
    y_pred = h_relu.mm(w2)

    # Compute and print loss
    loss = (y_pred - y).pow(2).sum().item()
    #print(t, loss)

    # Backprop to compute gradients of w1 and w2 with respect to loss
    grad_y_pred = 2.0 * (y_pred - y)
    grad_w2 = h_relu.t().mm(grad_y_pred)
    grad_h_relu = grad_y_pred.mm(w2.t())
    grad_h = grad_h_relu.clone()
    grad_h[h < 0] = 0
    grad_w1 = x.t().mm(grad_h)

    # Update weights using gradient descent
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2

end = datetime.datetime.now()

print(end-start)

. Я увеличил количество Epoch с 500 до 5000, поскольку я прочитал, что первый вызов CUDA очень медленный из-за инициализации. Однакопроблема с производительностью все еще существует.

При device = torch.device("cpu") конечное время печати обычно составляет 3-4 секунды, а device = torch.device("cuda:0") выполняется примерно за 13-15 секунд

Я переустановил Pytorchнесколько разных способов (конечно, удаление предыдущей установки), и проблема все еще сохраняется. Я надеюсь, что кто-то может мне помочь, если я пропустил набор (не установил какой-либо другой API / программу) или я что-то делаюневерный кодоценил: small_smile:

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

Запуск на GPU может быть дорогим, если вы запускаете с меньшим размером пакета.Если вы добавите больше данных в gpu, что означает увеличение размера пакета, то вы можете заметить значительное увеличение объема данных.Да, GPU работает лучше с float32, чем двойной.Попробуйте это

**

N, D_in, H, D_out = 128, 1000, 500, 10
dtype = torch.float32

**

0 голосов
/ 23 сентября 2018

Основная причина в том, что вы используете двойной тип данных вместо float.Графические процессоры в основном оптимизированы для работы с 32-разрядными числами с плавающей запятой.Если вы измените dtype на torch.float, ваш GPU будет работать быстрее, чем ваш CPU, даже включая такие вещи, как инициализация CUDA.

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