基于Pytorch使用GPU运行模型方法及注意事项

一、在基于pytorch深度学习进行模型训练和预测的时候,往往数据集比较大,而且模型也可能比较复杂,但如果直接训练调用CPU运行的话,计算运行速度很慢,因此使用GPU进行模型训练和预测是非常有必要的,可以大大提高实验效率。如果还没有配置好运行环境的博友们可以参考下面博主的文章。

1、点击打开《基于Windows中学习Deep Learning之搭建Anaconda+Cudnn+Cuda+Pytorch+Pycharm工具和配置环境完整最简版》文章
2、点击打开《基于Pytorch查看本地或者远程服务器GPU及使用方法》文章

二、具体方法分为两个大部分(模型和数据集)。

  • 首先将模型model移动到cuda设备也就是GPU上,注意:此大模型可以内含多个子模型,子模型无需再重复移动到GPU上
model = Net() # 举例模型
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 
model.to(device) # 移动举例模型到cuda

或者

model = Net() # 举例模型
device = torch.cuda.current_device() if args.cuda else torch.device('cpu')
model.to(device) # 移动举例模型到cuda
  • 将数据集(包含训练集和测试集及所包含的标签数据集)移动到cuda设备也就是GPU上,使用数据集.cuda()形式完成。
drug_embeddings = drug_embeddings.cuda()
protein_embeddings = protein_embeddings.cuda()
effectives = effectives.cuda()

或者

drug_embeddings = drug_embeddings.to(device)
protein_embeddings = protein_embeddings.to(device)
effectives = effectives.to(device)

三、问题及方法

  • 问题 1:torch.FloatTensor和torch.cuda.FloatTensor的差异

Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same or input should be a MKLDNN tensor and weight is a dense tensor

问题中文翻译成

输入类型(torch.FloatTensor)和权重类型(torch.cuda.FloatTensor)应该相同,或者输入应该是MKLDNN张量,权重是密集张量
  • 问题 2:数据运算过程中需交互的情况下不在同一个设备上

Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

问题中文翻译成

预期所有张量都在同一设备上,但至少找到了两个设备,cuda:0 和 cpu !
  • 问题1和问题2解决方法(相同):首先根据错误的提示找到代码中是哪行数据出现的问题,然后针对性的解决,以数据XR出问题举例,分两种情况:第一种情况是如果此数据XR通过torch.FloatTensor(数据XR)构造,那么改成torch.cuda.FloatTensor(数据XR)即可;第二种情况是并非构造数据XR,而是将数据XR传输到另一个子模型中,那么直接在数据XR的后面加上cuda即可,也就是“数据XR.cuda()”即可。

  • 问题 3:代码运行过程中CUDA运输内存不够分配

CUDA out of memory. Tried to allocate 490.00 MiB (GPU 0; 2.00 GiB total capacity; 954.66 MiB already allocated; 62.10 MiB free; 978.00 MiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

问题中文翻译成

CUDA内存不足。尝试分配490.00 MiB(GPU 0;2.00 GiB总容量;954.66 MiB已分配;62.10 MiB可用;PyTorch总共保留978.00 MiB)如果保留内存>>已分配内存,请尝试设置max_split_size_mb以避免碎片。请参阅内存管理和PYTORCH_CUDA_ALLOC_CONF的文档

问题3解决方法:运算内存不够的情况下有两种解决方法,第一种方法一般缩小数据集批次大小,也就是batch_size缩小,比如:可以将原来batch_size=256那么缩小成batch_size=16;第二种就是去服务器上跑代码,也就是更换更好的GPU去运行,如果还是出现同样的问题,那么此两种方法结合使用最好。

  • 后续出现新的问题会继续更新,敬请期待!