1. 首页
  2. 教育
  3. 深度学习

基于PyTorch的深度学习入门教程之DataParallel使用多GPU

本文参考PyTorch官网的教程,分为五个基本模块来介绍PyTorch。为了避免文章过长,这五个模块分别在五篇博文中介绍。

前言

本文参考PyTorch官网的教程,分为五个基本模块来介绍PyTorch。为了避免文章过长,这五个模块分别在五篇博文中介绍。

Part1:PyTorch简单知识

Part2:PyTorch的自动梯度计算

Part3:使用PyTorch构建一个神经网络

Part4:训练一个神经网络分类器

Part5:数据并行化

本文是关于Part5的内容。

Part5:数据并行化

本文中,将会讲到DataParallel使用多GPU

在PyTorch中使用GPU比较简单,可以这样把模型放到GPU上。

model.gpu()

还可以复制所有的tensors到GPU上。

mytensor=my_tensor.gpu()

请注意,单纯调用mytensor.gpu()不会拷贝tensor到GPU上。你需要把它分配给一个新的tensor,然后在GPU上使用这个新的tensor。

前向和反向传播可以在多个GPU上运行。但是,PyTorch默认只使用一个GPU。你可以使用DataParallel使得你的模型可以在过个GPU上并行运算。

model=nn.DataParallel(model)

1Package导入和参数设置

导入PyTorch的模块并且设置参数。

基于PyTorch的深度学习入门教程之DataParallel使用多GPU

2虚拟数据集

制作虚拟(随机)数据集,只需要执行getitem。

classRandomDataset(Dataset):def__init__(self,size,length):self.len=lengthself.data=torch.randn(length,size)def__getitem__(self,index):returnself.data[index]def__len__(self):returnself.lenrand_loader=DataLoader(dataset=RandomDataset(input_size,100),batch_size=batch_size,shuffle=True)

3简单模型

作为实例,我们的模型只是获取输入,进行线性运算,给出结果。但是,你可以把DataParallel应用到任何模型(CNN,RNN,CapsuleNet等等)。

classModel(nn.Module):#Ourmodeldef__init__(self,input_size,output_size):super(Model,self).__init__()self.fc=nn.Linear(input_size,output_size)defforward(self,input):output=self.fc(input)print("InModel:inputsize",input.size(),"outputsize",output.size())returnoutput

4创建模型和数据并行

这是本篇教程的核心内容。我们需要制作一个模型实例,并检查是否有多个GPU。如果有多GPU,可以使用nn.DataParallel打包我们的model。之后,我们可以把利用model.gpu()把模型放到GPU上。

model=Model(input_size,output_size)iftorch.cuda.device_count()>1:print("Let'suse",torch.cuda.device_count(),"GPUs!")#dim=0[30,xxx]->[10,...],[10,...],[10,...]on3GPUsmodel=nn.DataParallel(model)iftorch.cuda.is_available():model.cuda()

5运行模型

fordatainrand_loader:iftorch.cuda.is_available():input_var=Variable(data.cuda())else:input_var=Variable(data)output=model(input_var)print("Outside:inputsize",input_var.size(),"output_size",output.size())

期望输出:

InModel:inputsizetorch.Size([30,5])outputsizetorch.Size([30,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([30,5])outputsizetorch.Size([30,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([30,5])outputsizetorch.Size([30,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])Outside:inputsizetorch.Size([10,5])output_sizetorch.Size([10,2])

6结果

(1)如果有2GPUs,可以看到

#on2GPUsLet'suse2GPUs!InModel:inputsizetorch.Size([15,5])outputsizetorch.Size([15,2])InModel:inputsizetorch.Size([15,5])outputsizetorch.Size([15,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([15,5])outputsizetorch.Size([15,2])InModel:inputsizetorch.Size([15,5])outputsizetorch.Size([15,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([15,5])outputsizetorch.Size([15,2])InModel:inputsizetorch.Size([15,5])outputsizetorch.Size([15,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([5,5])outputsizetorch.Size([5,2])InModel:inputsizetorch.Size([5,5])outputsizetorch.Size([5,2])Outside:inputsizetorch.Size([10,5])output_sizetorch.Size([10,2])

2)如果有3GPUs,可以看到

Let'suse3GPUs!InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])InModel:inputsizetorch.Size([10,5])outputsizetorch.Size([10,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])Outside:inputsizetorch.Size([10,5])output_sizetorch.Size([10,2])

3)如果有8GPUs,可以看到

Let'suse8GPUs!InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([4,5])outputsizetorch.Size([4,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])Outside:inputsizetorch.Size([30,5])output_sizetorch.Size([30,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])InModel:inputsizetorch.Size([2,5])outputsizetorch.Size([2,2])Outside:inputsizetorch.Size([10,5])output_sizetorch.Size([10,2])

7总结

DataParallel将数据自动分割送到不同的GPU上处理,在每个模块完成工作后,DataParallel再收集整合这些结果返回。

责任编辑:xj

免责声明:本站旨在传递信息,不代表有传资讯的观点和立场。本站遵循行业规范,如转载您的文章未标注版权,请联系我们(QQ:78799268)改正。本站的原创文章,如若转载,请注明出处:http://www.ainoline.cn/jiaoyu/shenduxuexi/16567.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:78799268@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code