目录
前言
一、Pytorch多GPU并行训练的两种方式
1、DataParallel(DP)
2、DistributedDataParallel(DDP)
二、查看显卡资源&将数据放入GPU中
1.查看显卡资源
2、将数据放到GPU上
三、 使用DataParallel进行多GPU训练
1、导入库
2、声明GPU
3、定义网络
4、定义网络参数
最重要的!!!在这里把模型放到GPU里!!!
总结
随着人工智能的发展,大数据时代到来。面对大型的数据和模型训练时,我们不可避免的需要使用多GPU进行训练,接下来我将简单介绍pytorch中如何使用多GPU进行并行训练。pytorch中有两种方式进行多卡训练:
你将学习到在PyTorch中如何使用多GPU进行并行训练。在PyTorch中使用多GPU训练神经网络模型是非常简单的,PyTorch已经为我们封装好一个 nn.DataParallel
类来进行多GPU训练。
DataParallel实现较为简单,但所有的loss都在主卡上计算,负载不均衡的问题比较严重。
DistributedDataParallel可以支持一机多卡训练也可以支持多机多卡训练,官方也建议使用新的DistributedDataParallel,但是实现相对较为复杂。
以后有时间可以再详细讲一下如何用这种分布式的并行方法进行训练。本文主要讲解如何使用DataParallel进行GPU并行。
通过输入nvidia-smi命令查看显卡的编号和使用情况
nvidia-smi
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '4,5' #指定GPU编号
device = torch.device("cuda") #创建单GPU对象
net.to(device=device) #将网络放到GPU
x_train = Variable(train,requires_grad=True).to(device=device,dtype=torch.float32) #把训练变量放到GPU
import torch#深度学习的pytoch平台
import torch.nn as nn
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torch.utils.data import TensorDataset
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '4,5' #指定编号为4,5的GPU参与训练
以下定义网络作为示例:
class DNN(nn.Module):
def __init__(self,layers):
super().__init__()
'Initialise neural network as a list using nn.Modulelist'
self.linears = nn.ModuleList([nn.Linear(layers[i], layers[i+1]) for i in range(len(layers)-1)])
self.elu = nn.ELU()
def forward(self,d):#d就是整个网络的输入
if torch.is_tensor(d) != True:
d = torch.from_numpy(d)
a = d.float()
for i in range(len(layers)-2):
z = self.linears[i](a)
a = self.elu(z)
a = self.linears[-1](a)
return a
使用 nn.DataParallel
打包模型,然后用 nn.DataParallel
的 model.to(device)
把模型传送到多块GPU中进行运算。
#一些基本参数变量的确定以及数据格式的转换
device = torch.device("cuda")
epochs = 1000 #迭代次数
initial_lr1 = 0.0005 #学习率
layers = [4,50,50,50,50,50,50,50,50,50,1] #网络每一层的神经元个数
net = DNN(layers)
net = nn.DataParallel(net)
net.to(device=device)
optimizer = torch.optim.Adam(net.parameters(), lr=initial_lr1) #优化器
mseloss = nn.MSELoss(reduction='mean') #损失函数,这里选用的是MSE。
训练过程不需要再改变,保持自己原来的代码就OK。
利用DataParallel进行多GPU训练还是很简单的,只需要在一开始导入库的时候分配好使用几块GPU,然后把模型用DataParallel进行包装就可以完成。