0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

ss 来源:雁回晴空 作者:雁回晴空 2021-02-15 09:55 次阅读

前言

本文参考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)

1 Package导入和参数设置

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

2 虚拟数据集

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

class RandomDataset(Dataset):

    def __init__(self, size, length):
        self.len = length
        self.data = torch.randn(length, size)

    def __getitem__(self, index):
        return self.data[index]

    def __len__(self):
        return self.len

rand_loader = DataLoader(dataset=RandomDataset(input_size, 100),
                         batch_size=batch_size, shuffle=True)

3 简单模型

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

class Model(nn.Module):
    # Our model

    def __init__(self, input_size, output_size):
        super(Model, self).__init__()
        self.fc = nn.Linear(input_size, output_size)

    def forward(self, input):
        output = self.fc(input)
        print("  In Model: input size", input.size(),
              "output size", output.size())

        return output

4 创建模型和数据并行

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

model = Model(input_size, output_size)
if torch.cuda.device_count() > 1:
  print("Let's use", torch.cuda.device_count(), "GPUs!")
  # dim = 0 [30, xxx] -> [10, ...], [10, ...], [10, ...] on 3 GPUs
  model = nn.DataParallel(model)

if torch.cuda.is_available():
   model.cuda()

5 运行模型

for data in rand_loader:
    if torch.cuda.is_available():
        input_var = Variable(data.cuda())
    else:
        input_var = Variable(data)

    output = model(input_var)
    print("Outside: input size", input_var.size(),
          "output_size", output.size())

期望输出:

In Model: input size torch.Size([30, 5]) output size torch.Size([30, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
  In Model: input size torch.Size([30, 5]) output size torch.Size([30, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
  In Model: input size torch.Size([30, 5]) output size torch.Size([30, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
  In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

6 结果

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

# on 2 GPUs
Let's use 2 GPUs!
    In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
    In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
    In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
    In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([5, 5]) output size torch.Size([5, 2])
    In Model: input size torch.Size([5, 5]) output size torch.Size([5, 2])
Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

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

Let's use 3 GPUs!
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
    In Model: input size torch.Size([10, 5]) output size torch.Size([10, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

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

Let's use 8 GPUs!
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
    In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

7 总结

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

责任编辑:xj


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4415

    浏览量

    126652
  • Data
    +关注

    关注

    0

    文章

    61

    浏览量

    38028
  • 深度学习
    +关注

    关注

    73

    文章

    5236

    浏览量

    119900
  • pytorch
    +关注

    关注

    2

    文章

    760

    浏览量

    12825
收藏 人收藏

    评论

    相关推荐

    FPGA在深度学习应用中或将取代GPU

    现场可编程门阵列 (FPGA) 解决了 GPU 在运行深度学习模型时面临的许多问题 在过去的十年里,人工智能的再一次兴起使显卡行业受益匪浅。英伟达 (Nvidia) 和 AMD 等公司的股价也大幅
    发表于 03-21 15:19

    GPU深度学习中的应用与优势

    人工智能的飞速发展,深度学习作为其重要分支,正在推动着诸多领域的创新。在这个过程中,GPU扮演着不可或缺的角色。就像超级英雄电影中的主角一样,GPU
    的头像 发表于 12-06 08:27 710次阅读
    <b class='flag-5'>GPU</b>在<b class='flag-5'>深度</b><b class='flag-5'>学习</b>中的应用与优势

    想在STM32 MCU上部署机器学习模型?这份入门教程,让你一学就会~

    想在STM32 MCU上部署机器学习模型?这份入门教程,让你一学就会~
    的头像 发表于 10-18 17:45 3227次阅读
    想在STM32 MCU上部署机器<b class='flag-5'>学习</b>模型?这份<b class='flag-5'>入门教程</b>,让你一学就会~

    GPU的张量核心: 深度学习的秘密武器

    GPU最初是为图形渲染而设计的,但是由于其卓越的并行计算能力,它们很快被引入深度学习中。深度学习的迅速发展离不开计算机图形处理单元(
    的头像 发表于 09-26 08:29 527次阅读
    <b class='flag-5'>GPU</b>的张量核心: <b class='flag-5'>深度</b><b class='flag-5'>学习</b>的秘密武器

    pytorch用来干嘛的

    pytorch用来干嘛的 PyTorch是一个开源的Python机器学习库,它主要用于创建神经网络。它提供了几乎所有深度学习工具,包括用于自
    的头像 发表于 08-21 16:41 5122次阅读

    深度学习框架pytorch介绍

    深度学习框架pytorch介绍 PyTorch是由Facebook创建的开源机器学习框架,其中TensorFlow是完全基于数据流图的。它是
    的头像 发表于 08-17 16:10 1128次阅读

    深度学习框架pytorch入门与实践

    深度学习框架pytorch入门与实践 深度学习是机器学习
    的头像 发表于 08-17 16:03 1195次阅读

    深度学习如何挑选GPU

    NVIDIA的标准库使在CUDA中建立第一个深度学习库变得非常容易。早期的优势加上NVIDIA强大的社区支持意味着如果使用NVIDIA GPU,则在出现问题时可以轻松得到支持。
    发表于 07-12 11:49 426次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>如何挑选<b class='flag-5'>GPU</b>?

    PyTorch教程5.5之深度学习中的泛化

    电子发烧友网站提供《PyTorch教程5.5之深度学习中的泛化.pdf》资料免费下载
    发表于 06-05 15:31 1次下载
    <b class='flag-5'>PyTorch</b>教程5.5之<b class='flag-5'>深度</b><b class='flag-5'>学习</b>中的泛化

    PyTorch教程12.1之优化和深度学习

    电子发烧友网站提供《PyTorch教程12.1之优化和深度学习.pdf》资料免费下载
    发表于 06-05 15:08 0次下载
    <b class='flag-5'>PyTorch</b>教程12.1之优化和<b class='flag-5'>深度</b><b class='flag-5'>学习</b>

    PyTorch程之15.2近似训练

    电子发烧友网站提供《PyTorch程之15.2近似训练.pdf》资料免费下载
    发表于 06-05 11:07 1次下载
    <b class='flag-5'>PyTorch</b>教<b class='flag-5'>程之</b>15.2近似训练

    PyTorch程之循环神经网络

    电子发烧友网站提供《PyTorch程之循环神经网络.pdf》资料免费下载
    发表于 06-05 09:52 0次下载
    <b class='flag-5'>PyTorch</b>教<b class='flag-5'>程之</b>循环神经网络

    PyTorch程之长短期记忆(LSTM)

    电子发烧友网站提供《PyTorch程之长短期记忆(LSTM).pdf》资料免费下载
    发表于 06-05 09:51 0次下载
    <b class='flag-5'>PyTorch</b>教<b class='flag-5'>程之</b>长短期记忆(LSTM)

    PyTorch程之时间反向传播

    电子发烧友网站提供《PyTorch程之时间反向传播.pdf》资料免费下载
    发表于 06-05 09:49 0次下载
    <b class='flag-5'>PyTorch</b>教<b class='flag-5'>程之</b>时间反向传播

    PyTorch程之数据预处理

    电子发烧友网站提供《PyTorch程之数据预处理.pdf》资料免费下载
    发表于 06-02 14:11 0次下载
    <b class='flag-5'>PyTorch</b>教<b class='flag-5'>程之</b>数据预处理