为什么使用GPU比使用CPU慢?

2024-09-28 22:56:04 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下网络:

%%time
import torch
from torch.autograd import grad
import torch.nn as nn
import torch.optim as optim

class net_x(nn.Module): 
        def __init__(self):
            super(net_x, self).__init__()
            self.fc1=nn.Linear(1, 20) 
            self.fc2=nn.Linear(20, 20)
            self.out=nn.Linear(20, 400) #a,b,c,d

        def forward(self, x):
            x=torch.tanh(self.fc1(x))
            x=torch.tanh(self.fc2(x))
            x=self.out(x)
            return x

nx = net_x()

#input
val = 100
t = torch.rand(val, requires_grad = True) #input vector
t = torch.reshape(t, (val,1)) #reshape for batch

#method 
dx = torch.autograd.functional.jacobian(lambda t_: nx(t_), t)

这个输出

CPU times: user 11.1 s, sys: 3.52 ms, total: 11.1 s
Wall time: 11.1 s

但是,当我改为使用带有.to(device)的GPU时:

%%time
import torch
from torch.autograd import grad
import torch.nn as nn
import torch.optim as optim
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

class net_x(nn.Module): 
        def __init__(self):
            super(net_x, self).__init__()
            self.fc1=nn.Linear(1, 20) 
            self.fc2=nn.Linear(20, 20)
            self.out=nn.Linear(20, 400) #a,b,c,d

        def forward(self, x):
            x=torch.tanh(self.fc1(x))
            x=torch.tanh(self.fc2(x))
            x=self.out(x)
            return x

nx = net_x()
nx.to(device)
#input
val = 100
t = torch.rand(val, requires_grad = True) #input vector
t = torch.reshape(t, (val,1)).to(device) #reshape for batch

#method 
dx = torch.autograd.functional.jacobian(lambda t_: nx(t_), t)

这将产生:

CPU times: user 18.6 s, sys: 1.5 s, total: 20.1 s
Wall time: 19.5 s

更新1: 检查将输入和模型移动到设备的过程的计时:

%%time
nx.to(device)
t.to(device)

这将产生:

CPU times: user 2.05 ms, sys: 0 ns, total: 2.05 ms
Wall time: 2.13 ms

更新2: 看来@Gulzar是对的。我将批处理大小更改为1000(val=1000),CPU输出: Wall time: 8min 44s 而GPU输出: Wall time: 3min 12s


Tags: toimportselfnettimedeviceasval
1条回答
网友
1楼 · 发布于 2024-09-28 22:56:04

摇摆不定的回答

GPU是“较弱”的计算机,其计算核心比CPU多得多。
数据必须每隔一段时间以“昂贵”的方式从RAM内存传递到GRAM,这样他们才能处理数据

如果数据是“大的”,并且可以对该数据进行并行处理,那么那里的计算速度可能会更快

如果数据不够大,那么传输数据的成本,或者使用较弱的内核并同步它们的成本可能会超过并行化的好处


GPU什么时候有用

  1. 对于更大的网络,或更重的计算,如卷积,或更大的完全连接层(更大的矩阵乘法)
  2. 对于较大的批处理-批处理是一种非常简单的并行计算方法,因为它们(几乎*)独立*几乎是这样,因为它们确实需要在某个时刻以编程方式进行同步

相关问题 更多 >