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
    +关注

    关注

    28

    文章

    5099

    浏览量

    134420
  • Data
    +关注

    关注

    0

    文章

    63

    浏览量

    39031
  • 深度学习
    +关注

    关注

    73

    文章

    5590

    浏览量

    123890
  • pytorch
    +关注

    关注

    2

    文章

    813

    浏览量

    14680
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【团购】独家全套珍藏!龙哥LabVIEW视觉深度学习实战课(11大系列课程,共5000+分钟)

    GPU加速训练(可选) 双轨教学:传统视觉算法+深度学习方案全覆盖 轻量化部署:8.6M超轻OCR模型,适合嵌入式设备集成 无监督学习:无需缺陷样本即可训练高精度检测模型 持续更新:
    发表于 12-04 09:28

    【团购】独家全套珍藏!龙哥LabVIEW视觉深度学习实战可(11大系列课程,共5000+分钟)

    学习模型DLL 硬件联动:支持工业相机硬触发、GPU加速训练(可选) 双轨教学:传统视觉算法+深度学习方案全覆盖 轻量化部署:8.6M超轻OCR模型,适合嵌入式设备集成 无监督
    发表于 12-03 13:50

    学习物联网怎么入门?

    景等。同时,学习物联网的基本技术,如传感器技术、通信技术、云计算等,也是非常重要的。 其次,选择适合自己的学习方式也是入门学习物联网的重要一步。
    发表于 10-14 10:34

    自动驾驶中Transformer大模型会取代深度学习吗?

    持续讨论。特别是在自动驾驶领域,部分厂商开始尝试将模态大模型(MLLM)引入到感知、规划与决策系统,引发了“传统深度学习是否已过时”的激烈争论。然而,从技术原理、算力成本、安全需求与实际落地路径等维度来看,Transforme
    的头像 发表于 08-13 09:15 3906次阅读
    自动驾驶中Transformer大模型会取代<b class='flag-5'>深度</b><b class='flag-5'>学习</b>吗?

    跟老齐学Python:从入门到精通

    本帖最后由 yuu_cool 于 2025-6-3 16:52 编辑 本资料是面向编程零基础读者的Python 入门教程,内容涵盖了Python 的基础知识和初步应用。以比较轻快的风格,向零基
    发表于 06-03 16:10

    GPU架构深度解析

    GPU架构深度解析从图形处理到通用计算的进化之路图形处理单元(GPU),作为现代计算机中不可或缺的一部分,已经从最初的图形渲染专用处理器,发展成为强大的并行计算引擎,广泛应用于人工智能、科学计算
    的头像 发表于 05-30 10:36 1209次阅读
    <b class='flag-5'>GPU</b>架构<b class='flag-5'>深度</b>解析

    ARM Mali GPU 深度解读

    ARM Mali GPU 深度解读 ARM Mali 是 Arm 公司面向移动设备、嵌入式系统和基础设施市场设计的图形处理器(GPU)IP 核,凭借其异构计算架构、能效优化和生态协同,成为全球移动
    的头像 发表于 05-29 10:12 2968次阅读

    摩尔线程发布Torch-MUSA v2.0.0版本 支持原生FP8和PyTorch 2.5.0

    近日,摩尔线程正式发布Torch-MUSA v2.0.0版本,这是其面向PyTorch深度学习框架的MUSA扩展库的重要升级。新版本基于MUSA Compute Capability 3.1计算架构
    的头像 发表于 05-11 16:41 1263次阅读

    摩尔线程与当虹科技达成深度合作

    近日,摩尔线程与当虹科技达成深度合作,基于国产GPU成功完成了与BlackEye模态视听大模型的深度融合。双方联手打造专业级视听“引擎”,并在超高清
    的头像 发表于 03-20 15:22 1277次阅读

    军事应用中深度学习的挑战与机遇

    人工智能尤其是深度学习技术的最新进展,加速了不同应用领域的创新与发展。深度学习技术的发展深刻影响了军事发展趋势,导致战争形式和模式发生重大变化。本文将概述
    的头像 发表于 02-14 11:15 818次阅读

    BP神经网络与深度学习的关系

    BP神经网络与深度学习之间存在着密切的关系,以下是对它们之间关系的介绍: 一、BP神经网络的基本概念 BP神经网络,即反向传播神经网络(Backpropagation Neural Network
    的头像 发表于 02-12 15:15 1338次阅读

    操作指南:pytorch云服务器怎么设置?

    设置PyTorch云服务器需选择云平台,创建合适的GPU实例,安装操作系统、Python及Anaconda,创建虚拟环境,根据CUDA版本安装PyTorch,配置环境变量,最后验证安装。过程中需考虑
    的头像 发表于 02-08 10:33 600次阅读

    Triton编译器在机器学习中的应用

    多种深度学习框架,如TensorFlow、PyTorch、ONNX等,使得开发者能够轻松地将不同框架下训练的模型部署到GPU上。 2. Triton编译器的工作原理 Triton编译器
    的头像 发表于 12-24 18:13 1618次阅读

    利用Arm Kleidi技术实现PyTorch优化

    PyTorch 是一个广泛应用的开源机器学习 (ML) 库。近年来,Arm 与合作伙伴通力协作,持续改进 PyTorch 的推理性能。本文将详细介绍如何利用 Arm Kleidi 技术提升 Arm
    的头像 发表于 12-23 09:19 1613次阅读
    利用Arm Kleidi技术实现<b class='flag-5'>PyTorch</b>优化

    深度学习工作负载中GPU与LPU的主要差异

    ,一个新的竞争力量——LPU(Language Processing Unit,语言处理单元)已悄然登场,LPU专注于解决自然语言处理(NLP)任务中的顺序性问题,是构建AI应用不可或缺的一环。 本文旨在探讨深度学习工作负载中GPU
    的头像 发表于 12-09 11:01 3906次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>工作负载中<b class='flag-5'>GPU</b>与LPU的主要差异