PyTorch CUDA与Numpy进行算术运算?最快的?

sar*_*nns 4 gpu numpy python-3.x pytorch

我怀疑使用与GPU支持的Torch和使用以下功能的Numpy进行元素逐次乘法,结果发现Numpy的循环速度比Torch快,但事实并非如此。

我想知道如何使用GPU使用Torch执行常规算术运算。

注意:我在Google Colab笔记本中运行了这些代码段

定义默认张量类型以启用全局GPU标志

torch.set_default_tensor_type(torch.cuda.FloatTensor if 
                              torch.cuda.is_available() else 
                              torch.FloatTensor)
Run Code Online (Sandbox Code Playgroud)

初始化Torch变量

x = torch.Tensor(200, 100)  # Is FloatTensor
y = torch.Tensor(200,100) 
Run Code Online (Sandbox Code Playgroud)

有问题的功能

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

当调用上面的函数为 %timeit mul(x,y)

返回值:

最慢的运行比最快的运行时间长10.22倍。这可能意味着正在缓存中间结果。10000次循环,最好为3次:每个循环50.1 µs

现在试用numpy,

使用了与割炬变量相同的值

x_ = x.data.cpu().numpy()
y_ = y.data.cpu().numpy()
Run Code Online (Sandbox Code Playgroud)


def mul_(d,f):
    g = d*f
    return g
Run Code Online (Sandbox Code Playgroud)

%timeit mul_(x_,y_)

退货

最慢的运行时间比最快的运行时间长了12.10倍。这可能意味着正在缓存中间结果。100000次循环,每循环3:7.73 µs最佳

需要一些帮助来了解启用GPU的Torch操作。

den*_*ger 5

GPU操作必须另外向/从GPU获取内存

问题是您的GPU操作始终必须将输入放到GPU内存上,然后从那里检索结果,这是一个非常昂贵的操作。

另一方面,NumPy直接处理来自CPU /主存储器的数据,因此这里几乎没有延迟。此外,您的矩阵非常小,因此即使在最佳情况下,两者之间的差异也应该很小。

这也是在神经网络中的GPU上进行训练时使用小批处理的部分原因:现在,您可以进行并行处理,而不是进行一些非常小的操作,而是拥有“一大堆”数字。
另请注意,GPU时钟速度通常远低于CPU时钟,因此GPU的确发光,因为它具有更多的内核。如果矩阵未充分利用所有矩阵,那么您也可能会在CPU上看到更快的结果。

TL; DR:如果矩阵足够大,即使GPU传输增加了成本,您最终也会看到速度加快。