Pytorch速度比较-GPU比CPU慢



我试图弄清楚GPU张量运算是否真的比CPU运算快。因此,我在下面写了这个特定的代码,以实现CPU张量和GPU库达张量的简单2D相加,从而查看速度差异:

import torch
import time
###CPU
start_time = time.time()
a = torch.ones(4,4)
for _ in range(1000000):
a += a
elapsed_time = time.time() - start_time
print('CPU time = ',elapsed_time)
###GPU
start_time = time.time()
b = torch.ones(4,4).cuda()
for _ in range(1000000):
b += b
elapsed_time = time.time() - start_time
print('GPU time = ',elapsed_time)

令我惊讶的是,CPU时间为0.93秒,GPU时间高达63秒。我是正确地进行了库达张量运算,还是库达张量的概念只在非常复杂的运算中工作得更快,比如在神经网络中?

注意:我的GPU是NVIDIA 940MX,torch.cuda.is_available()调用返回True。

GPU加速通过大量并行计算来工作。在GPU上,你有大量的内核,每一个都不是很强大,但这里的大量内核很重要。

像PyTorch这样的框架尽可能多地并行计算。一般来说,矩阵运算非常适合并行化,但它仍然不可能总是并行化计算!

在您的示例中,您有一个循环:

b = torch.ones(4,4).cuda()
for _ in range(1000000):
b += b

您有1000000个操作,但由于代码的结构,无法并行化这些计算。仔细想想,要计算下一个b,您需要知道上一个(或当前(b的值。

因此,您有1000000个运算,但每个运算都必须一个接一个地计算。可能的并行化仅限于张量的大小。这个尺寸虽然在你的例子中不是很大:

torch.ones(4,4)

因此,每次迭代只能并行化16操作(加法(。由于CPU有几个,但有更多强大的内核,因此对于给定的示例来说,它要快得多!

但是,如果你改变张量的大小,事情就会改变,那么PyTorch就能够并行化更多的整体计算。我把迭代次数改为1000(因为我不想等这么久:(,但你可以输入任何你喜欢的值,CPU和GPU之间的关系应该保持不变。

以下是不同张量大小的结果:

#torch.ones(4,4)       - the size you used
CPU time =  0.00926661491394043
GPU time =  0.0431208610534668
#torch.ones(40,40)     - CPU gets slower, but still faster than GPU
CPU time =  0.014729976654052734
GPU time =  0.04474186897277832
#torch.ones(400,400)   - CPU now much slower than GPU
CPU time =  0.9702610969543457
GPU time =  0.04415607452392578
#torch.ones(4000,4000) - GPU much faster then CPU 
CPU time =  38.088677167892456
GPU time =  0.044649362564086914

所以,正如你所看到的,在可以并行化东西的地方(这里是张量元素的添加(,GPU变得非常强大
对于给定的计算,GPU时间根本不会改变,GPU可以处理更多
(只要不耗尽内存:(

最新更新