pytorch(4)Pytorch模型训练时从CPU与GPU之间的转换

2022-10-02 14:28:44

1.如何进行迁移

使用Pytorch写的模型:

  • 对模型和相应的数据使用.cuda()处理。通过这种方式,我们就可以将内存中的数据复制到GPU的显存中去。从而可以通过GPU来进行运算了。
  • 另外一种方式,使用.to(device)的方式,将cpu的数据切换到gpu,如下:
#配置参数:config.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
data = data.to(config.device)

2.对数据的迁移

.cuda() 操作默认使用GPU 0也就是第一张显卡来进行操作。当我们想要存储在其他显卡中时可以使用 .cuda(<显卡号数>) 来将数据存储在指定的显卡中。还有很多种方式,具体参考官方文档。

对于不同存储位置的变量,我们是不可以对他们直接进行计算的。存储在不同位置中的数据是不可以直接进行交互计算的。

换句话说也就是上面例子中的 torch.FloatTensor 是不可以直接与 torch.cuda.FloatTensor 进行基本运算的。位于不同GPU显存上的数据也是不能直接进行计算的。

对于Variable,其实就仅仅是一种能够记录操作信息并且能够自动求导的容器,实际上的关键信息并不在Variable本身,而更应该侧重于Variable中存储的data。

这里举一个例子,训练的时候,怎么在epoch中,将数据从cpu转到gpu:

   for epoch in range(config.num_epochs):
        print('Epoch [{}/{}]'.format(epoch + 1, config.num_epochs))
        total_eval_accuracy = 0
        total_loss = 0
        for step, batch in enumerate(train_dataloader):
            #重点的两句话,batch[0]是训练数据,batch[1]是训练数据的label
            batch[0] = torch.LongTensor(batch[0]).to(config.device)
            batch[1] = torch.LongTensor(batch[1]).to(config.device)

3.模型迁移

一行代码:

#config是配置文件,里面包含了设备信息,模型参数等,大致理解意思就好,不要在乎config里面具体是什么。
model = Classifier.nn(config.para)
model = model.to(config.device)

4.汇总

在代码中使用GPU训练主要有三处需要注意:模型转为cuda,数据转为cuda,和输出数据去cuda,转为numpy。修改的地方包括将数据的形式变成 GPU 能读的形式, 然后将 网络模型 也变成 GPU 能读的形式。

模型训练时:如果数据放在了GPU上,那么模型也要转到GPU上。

模型预测时:计算预测的acc、auc这类型的评估参数时,实在cpu上进行的,所以模型evaluate时,需要将loss之类的转到cpu上,例子如下:

            labels = labels.data.cpu().numpy()
            predic = torch.max(logits, 1)[1].cpu().numpy()
            labels_all = np.append(labels_all, labels)
            predict_all = np.append(predict_all, predic)
            acc = metrics.accuracy_score(labels_all, predict_all)

转换时常见错误

1.RuntimeError: Input, output and indices must be on the current device

如果你的数据和模型没有同时在gpu或者cpu上,训练模型时,会报错如下,意思是输入和输出需要在同一设备上。

RuntimeError: Input, output and indices must be on the current device

解决方法:

将数据和模型放在同一设备即可。

2.AttributeError: 'list' object has no attribute 'cuda'

没搞清楚数据是不是tensor,就转到gpu时,会报出这个错误。

解决方法:先转为tensor,再转到gpu。

例子:

查看自己的target类型,原为['1','0','1','1']。这种列表试字符串型。而应该修改为torch.tensor类型。才能用于网络计算

简单改为:先改为numpy再转换为tensor,搞定!

label = torch.from_numpy(np.fromstring(label, dtype=int, sep=','))

参考:
1.https://zhuanlan.zhihu.com/p/31936740

2.https://blog.csdn.net/qq_21578849/article/details/85240797

3.训练demo:https://blog.csdn.net/WeDon_t/article/details/104300877?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param

4.训练常见错误:https://blog.csdn.net/u014264373/article/details/87640753

  • 作者:凝眸伏笔
  • 原文链接:https://blog.csdn.net/pearl8899/article/details/109567257
    更新时间:2022-10-02 14:28:44