PyTorch CUDA против Numpy для арифметических операций?Самый быстрый? - PullRequest
0 голосов
/ 27 сентября 2018

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

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

Примечание: Я выполнил эти фрагменты кода в блокноте Google Colab

Определите тип тензора по умолчанию, чтобы включить глобальныйФлаг графического процессора

torch.set_default_tensor_type(torch.cuda.FloatTensor if 
                              torch.cuda.is_available() else 
                              torch.FloatTensor)

Инициализация переменных горелки

x = torch.Tensor(200, 100)  # Is FloatTensor
y = torch.Tensor(200,100) 

Соответствующая функция

def mul(d,f):
    g = torch.mul(d,f).cuda()  # I explicitly called cuda() which is not necessary
    return g

При вызове указанной выше функции как %timeit mul(x,y)

Возвращает:

Самый медленный пробег занимал в 10,22 раза больше, чем самый быстрый.Это может означать, что промежуточный результат кэшируется.10000 циклов, лучшее из 3: 50,1 мкс на цикл

Теперь пробная версия с numpy,

Использованы те же значения из переменных горелки

x_ = x.data.cpu().numpy()
y_ = y.data.cpu().numpy()

def mul_(d,f):
    g = d*f
    return g

%timeit mul_(x_,y_)

Возвращает

Самый медленный пробег длился в 12,10 раз дольше, чем самый быстрый.Это может означать, что промежуточный результат кэшируется.100000 циклов, лучшее из 3: 7,73 мкс на цикл

Требуется некоторая помощь для понимания операций резака с поддержкой графического процессора.

1 Ответ

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

Операции с графическим процессором должны дополнительно доставлять память в / из графического процессора

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

NumPy, с другой стороны, напрямую обрабатывает данные из ЦП / основной памяти, поэтому здесь практически нет задержки.Кроме того, ваши матрицы очень малы, поэтому даже в лучшем случае разница должна составлять всего минуту.

Это также частично объясняет, почему вы используете мини-пакеты при обучении на GPU в нейронных сетях:Вместо нескольких чрезвычайно маленьких операций теперь у вас есть «одна большая масса» чисел, которые вы можете обрабатывать параллельно. Также обратите внимание, что тактовые частоты графического процессора, как правило, намного ниже тактовых частот процессора , поэтому графический процессор действительно светит только потому, что у него больше ядер .Если ваша матрица использует не все из них в полной мере, вы также можете увидеть более быстрый результат на вашем ЦП.

TL; DR: Если ваша матрица достаточно большая, вы в конечном итоге увидите ускорение,даже при дополнительной стоимости передачи графического процессора.

...