作者:晓玲建雯东佳 | 来源:互联网 | 2024-10-23 13:37
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(<显卡号数>) 来将数据存储在指定的显卡中。还有很多种方式&#xff0c;具体参考官方文档。
对于不同存储位置的变量&#xff0c;我们是不可以对他们直接进行计算的。存储在不同位置中的数据是不可以直接进行交互计算的。
换句话说也就是上面例子中的 torch.FloatTensor 是不可以直接与 torch.cuda.FloatTensor 进行基本运算的。位于不同GPU显存上的数据也是不能直接进行计算的。
对于Variable&#xff0c;其实就仅仅是一种能够记录操作信息并且能够自动求导的容器&#xff0c;实际上的关键信息并不在Variable本身&#xff0c;而更应该侧重于Variable中存储的data。
这里举一个例子&#xff0c;训练的时候&#xff0c;怎么在epoch中&#xff0c;将数据从cpu转到gpu&#xff1a;
for epoch in range(config.num_epochs):print(&#39;Epoch [{}/{}]&#39;.format(epoch &#43; 1, config.num_epochs))total_eval_accuracy &#61; 0total_loss &#61; 0for step, batch in enumerate(train_dataloader):#重点的两句话&#xff0c;batch[0]是训练数据&#xff0c;batch[1]是训练数据的labelbatch[0] &#61; torch.LongTensor(batch[0]).to(config.device)batch[1] &#61; torch.LongTensor(batch[1]).to(config.device)
3.模型迁移
一行代码&#xff1a;
#config是配置文件&#xff0c;里面包含了设备信息&#xff0c;模型参数等&#xff0c;大致理解意思就好&#xff0c;不要在乎config里面具体是什么。
model &#61; Classifier.nn(config.para)
model &#61; model.to(config.device)
4.汇总
在代码中使用GPU训练主要有三处需要注意&#xff1a;模型转为cuda&#xff0c;数据转为cuda&#xff0c;和输出数据去cuda&#xff0c;转为numpy。修改的地方包括将数据的形式变成 GPU 能读的形式, 然后将 网络模型 也变成 GPU 能读的形式。
模型训练时:如果数据放在了GPU上&#xff0c;那么模型也要转到GPU上。
模型预测时:计算预测的acc、auc这类型的评估参数时&#xff0c;实在cpu上进行的&#xff0c;所以模型evaluate时&#xff0c;需要将loss之类的转到cpu上&#xff0c;例子如下:
labels &#61; labels.data.cpu().numpy()predic &#61; torch.max(logits, 1)[1].cpu().numpy()labels_all &#61; np.append(labels_all, labels)predict_all &#61; np.append(predict_all, predic)acc &#61; metrics.accuracy_score(labels_all, predict_all)
转换时常见错误
1.RuntimeError: Input, output and indices must be on the current device
如果你的数据和模型没有同时在gpu或者cpu上&#xff0c;训练模型时&#xff0c;会报错如下&#xff0c;意思是输入和输出需要在同一设备上。
RuntimeError: Input, output and indices must be on the current device
解决方法&#xff1a;
将数据和模型放在同一设备即可。
2.AttributeError: &#39;list&#39; object has no attribute &#39;cuda&#39;
没搞清楚数据是不是tensor&#xff0c;就转到gpu时&#xff0c;会报出这个错误。
解决方法&#xff1a;先转为tensor&#xff0c;再转到gpu。
例子&#xff1a;
查看自己的target类型&#xff0c;原为[&#39;1&#39;,&#39;0&#39;,&#39;1&#39;,&#39;1&#39;]。这种列表试字符串型。而应该修改为torch.tensor类型。才能用于网络计算
简单改为&#xff1a;先改为numpy再转换为tensor&#xff0c;搞定&#xff01;
label &#61; torch.from_numpy(np.fromstring(label, dtype&#61;int, sep&#61;&#39;,&#39;))
参考&#xff1a;
1.https://zhuanlan.zhihu.com/p/31936740
2.https://blog.csdn.net/qq_21578849/article/details/85240797
3.训练demo&#xff1a;https://blog.csdn.net/WeDon_t/article/details/104300877?utm_medium&#61;distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source&#61;distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param
4.训练常见错误&#xff1a;https://blog.csdn.net/u014264373/article/details/87640753