PyTorch CUDA 与 Numpy 的算术运算?最快的?
Posted
技术标签:
【中文标题】PyTorch CUDA 与 Numpy 的算术运算?最快的?【英文标题】:PyTorch CUDA vs Numpy for arithmetic operations? Fastest? 【发布时间】:2019-03-02 17:23:46 【问题描述】:我使用带有 GPU 支持的 Torch 和 Numpy 使用下面的函数执行了逐元素乘法,发现 Numpy 的循环速度比 Torch 快,这不应该是这种情况,我怀疑。
我想知道如何使用 GPU 使用 Torch 执行一般算术运算。
注意:我在 Google Colab notebook 中运行了这些代码 sn-ps
定义默认张量类型以启用全局 GPU 标志
torch.set_default_tensor_type(torch.cuda.FloatTensor if
torch.cuda.is_available() else
torch.FloatTensor)
初始化 Torch 变量
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 µs
现在试用 numpy,
使用来自 torch 变量的相同值
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 µs
需要一些帮助来了解支持 GPU 的 Torch 操作。
【问题讨论】:
【参考方案1】:GPU 操作必须额外从 GPU 获取内存
问题是您的 GPU 操作总是必须将输入放在 GPU 内存上,并且 然后从那里检索结果,这是一个相当昂贵的操作。
另一方面,NumPy 直接处理来自 CPU/主存的数据,所以这里几乎没有延迟。此外,您的矩阵非常小,因此即使在最佳情况下,也应该只有微小的差异。
这也是您在神经网络中的 GPU 上训练时使用小批量的部分原因:您现在拥有可以并行处理的“一大块”数字,而不是几个非常小的操作。 Also note that GPU clock speeds are generally way lower than CPU clocks,所以 GPU 之所以真正闪耀,是因为它有更多的内核。如果您的矩阵没有充分利用所有这些,您也可能会在 CPU 上看到更快的结果。
TL;DR: 如果你的矩阵足够大,你最终会看到CUDA
的速度比 Numpy 更快,即使有额外的 GPU 传输成本。
【讨论】:
谢谢,我在火炬论坛上也发现了类似的问题 欢迎在 cmets 中分享链接,以便其他人直接了解您所谈论的内容。 这里是讨论类似问题的链接github.com/pytorch/pytorch/issues/1630 我认为 TL;DR 注释过分淡化了 GPU 可以带来的巨大性能提升。例如,如果您有一个 2-D 或 3-D 网格,您需要在其中执行(逐元素)操作,那么 Pytorch-CUDA 可以比 Numpy 快数百倍,甚至可以编译 C/FORTRAN 代码。我在攻读博士学位期间已经对此进行了数十次测试。以上是关于PyTorch CUDA 与 Numpy 的算术运算?最快的?的主要内容,如果未能解决你的问题,请参考以下文章
奉献pytorch 搭建 CNN 卷积神经网络训练图像识别的模型,配合numpy 和matplotlib 一起使用调用 cuda GPU进行加速训练
CUDA《PyTorch自定义CUDA算子教程与运行时间分析》- 知识点目录
01 Pytorch和CUDA对应的版本及Pytorch和Python对应的版本及Python与Anaconda的对应关系