为什么在谷歌colab中GPU比cpu慢得多



我正在谷歌colab上训练RNN,这是我第一次使用gpu训练神经网络。从我的角度来看,GPU应该比cpu快得多,将设备从cpu更改为GPU只需要在模型/丢失/变量的定义中添加.to('cuda'),并设置谷歌colab"在GPU上运行"。

当我在cpu上训练它时,平均速度是650次迭代/s

谷歌colab 中的cpu训练

但当我在gpu上训练它时,平均速度只有340次迭代/秒,只有cpu 的一半

谷歌colab 中gpu的培训

这种情况发生在每个时代的上

这是我的密码。

def train(num_epoch = 30,len_vocab = 1, num_hidden=256,embedding_dim = 8,batch_size = 100):
data = get_data()
model = MyRNN(len_vocab,num_hidden,embedding_dim).to('cuda') #here 
if os.path.exists('QingBinLi'):
model.load_state_dict(torch.load('QingBinLi'))
criterion = nn.MSELoss().to('cuda')   #here 
optimizer = torch.optim.Adam(model.parameters(), lr=0.1, weight_decay=1e-5)
loss_for_draw = []
model.train()
data = data.detach().to('cuda') #here 
for epoch in range(num_epoch+1):
h = torch.randn(1,batch_size,num_hidden).to('cuda')  #here 
loss_average = 0
for i in tqdm(range(data.shape[-2] -batch_size)):
optimizer.zero_grad()
pre,h = model(data[:,:,i:i+batch_size,:].squeeze(0) ,h)
h = h.detach()
pre = pre.unsqueeze(0).unsqueeze(0)
loss = criterion(pre, data[:,:,i+1:i+1+batch_size,:].squeeze(0))
loss_average += loss.item()
loss.backward()
nn.utils.clip_grad_norm_(model.parameters(), max_norm=10)
optimizer.step()
loss_for_draw.append(loss_average/(data.shape[-2] -batch_size))
torch.save(model.state_dict(), 'QingBinLi')
print(f'now epoch:{epoch}, loss = {loss_for_draw[-1]}')

return loss_for_draw

当我试图在gpu上运行它时,我只是在那里加上"."到("uda"(。

那么,为什么当我在gpu上运行代码时速度会慢很多呢?也许我应该修改更多的代码?

我哥哥说,当张量很大时,比如100万维,gpu可以比cpu更快,否则我们甚至不需要并行计算,因为计算主要不是张量乘,而是复制张量和其他类似的东西。

我的RNN大约有256x256+256x8个参数,batch_size是100,它的维度远低于100万。因此gpu要慢得多。

而且,当我将batch_size更改为10000时,gpu是145次迭代/s,而cpu只有15次迭代/s。这次gpu要快得多。

一个CNN,步长为1,在gpu中,我们可以同时计算filter_size*image_size*batch_size,大约2415919104倍。所以在这种计算中,gpu要快得多。

最新更新