PyTorch Data Parrallel数据并行

  • 可选择:数据并行处理
  • 本文将学习如何用 DataParallel 来使用多 GPU。 通过 PyTorch 使用多个 GPU 非常简单。可以将模型放在一个 GPU:
  • device = torch.device("cuda:0")
  • model.to(device)
  • 可以复制所有的张量到 GPU:
  • mytensor = my_tensor.to(device)
  • 调用 my_tensor.to(device) 返回一个 my_tensor, 新的复制在GPU上,而不是重写 my_tensor。需要分配一个新的张量并且在 GPU 上使用这个张量。
  • 在多 GPU 中执行前馈,后继操作是非常自然的。尽管如此,PyTorch 默认只会使用一个 GPU。通过使用 DataParallel 让模型并行运行,可以很容易的在多 GPU 上运行操作。
  • model = nn.DataParallel(model)
  • 这是整个教程的核心,接下来将会详细讲解。 引用和参数
  • 引入 PyTorch 模块和定义参数
  • import torch
  • import torch.nn as nn
  • from torch.utils.data import Dataset, DataLoader
  • 参数
  • input_size = 5
  • output_size = 2
  • batch_size = 30
  • data_size = 100
  • 设备
  • device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  • 实验(玩具)数据
  • 生成一个玩具数据。只需要实现 getitem.
  • classRandomDataset(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, data_size),batch_size=batch_size, shuffle=True)
  • 简单模型
  • 做一个小 demo,模型只是获得一个输入,执行一个线性操作,然后给一个输出。可以使用 DataParallel   在任何模型(CNN, RNN, Capsule Net 等等.)
  • 放置了一个输出声明在模型中,检测输出和输入张量的大小。在 batch rank 0 中的输出。
  • classModel(nn.Module):
  • # Our model
  • def__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("\tIn Model: input size", input.size(),
  • "output size", output.size())
  • return output
  • 创建模型并且数据并行处理
  • 这是本文的核心。首先需要一个模型的实例,然后验证是否有多个 GPU。如果有多个 GPU,可以用 nn.DataParallel 来包裹模型。然后使用 model.to(device) 把模型放到多 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)
  • model.to(device)
  • 输出:
  • Let's use 2 GPUs!
  • 运行模型: 现在可以看到输入和输出张量的大小了。
  • for data in rand_loader:
  • input = data.to(device)
  • output = model(input)
  • print("Outside: input size", input.size(),
  • "output_size", output.size())
  • 输出:
  • 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])
  • 结果:
  • 如果没有 GPU 或者只有一个 GPU,当获取 30 个输入和 30 个输出,模型将期望获得 30 个输入和 30 个输出。但是如果有多个 GPU ,会获得这样的结果。
  • 多 GPU
  • 如果有 2 个GPU,会看到:
  • # 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])
  • 如果有 3个GPU,会看到:
  • 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])
  • 如果有 8个GPU,会看到:
  • 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])
  • 总结
  • 数据并行自动拆分了数据并,将任务单发送到多个 GPU 上。当每一个模型都完成任务之后,DataParallel 收集并且合并这些结果,然后再返回。

PyTorch Data Parrallel数据并行的更多相关文章

  1. PyTorch Tutorials 5 数据并行(选读)

    %matplotlib inline 数据并行(选读) Authors: Sung Kim and Jenny Kang 在这个教程里,我们将学习如何使用 DataParallel 来使用多GPU. ...

  2. [源码解析] PyTorch分布式优化器(2)----数据并行优化器

    [源码解析] PyTorch分布式优化器(2)----数据并行优化器 目录 [源码解析] PyTorch分布式优化器(2)----数据并行优化器 0x00 摘要 0x01 前文回顾 0x02 DP 之 ...

  3. [源码解析] PyTorch 分布式(1) --- 数据加载之DistributedSampler

    [源码解析] PyTorch 分布式(1) --- 数据加载之DistributedSampler 目录 [源码解析] PyTorch 分布式(1) --- 数据加载之DistributedSampl ...

  4. [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader

    [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 目录 [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 0x00 摘要 0x01 ...

  5. Data Pump(数据抽取)介绍

    从10g开始,Oracle提供更高效的Data Pump(即expdp/impdp)来进行数据的导入和导出,老的exp/imp还可以用,但已经不建议使用.注意:expdp/impdp和exp/imp之 ...

  6. 深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用

    深度神经网络(Deep Neural Networks, 简称DNN)是近年来机器学习领域中的研究热点,产生了广泛的应用.DNN具有深层结构.数千万参数需要学习,导致训练非常耗时.GPU有强大的计算能 ...

  7. 【深度学习系列2】Mariana DNN多GPU数据并行框架

    [深度学习系列2]Mariana DNN多GPU数据并行框架  本文是腾讯深度学习系列文章的第二篇,聚焦于腾讯深度学习平台Mariana中深度神经网络DNN的多GPU数据并行框架.   深度神经网络( ...

  8. Oracle 11g R2 Backup Data Pump(数据泵)之expdp/impdp工具

    Oracle Data Pump(以下简称数据泵)是Oracle 10g开始提供的一种数据迁移工具,同时也被广大DBA用来作为数据库的逻辑备份工具和体量较小的数据迁移工具.与传统的数据导出/导入工具, ...

  9. .Net并行编程(一)-TPL之数据并行

    前言 许多个人计算机和工作站都有多个CPU核心,可以同时执行多个线程.利用硬件的特性,使用并行化代码以在多个处理器之间分配工作. 应用场景 文件批量上传 并行上传单个文件.也可以把一个文件拆成几段分开 ...

随机推荐

  1. C - Harmonic Number(调和级数+欧拉常数)

    In mathematics, the nth harmonic number is the sum of the reciprocals of the first n natural numbers ...

  2. 网络基础概念(IP、MAC、网关、子网掩码)

    目录 IP地址 MAC地址 网关 子网掩码 反子网掩码 子网掩码 子网划分一: 子网划分二: 子网汇聚 广播域 冲突域 CSMA/CD IP地址 ip地址是用于标识网络中每台设备的标识.目前 IPV4 ...

  3. Ubuntu Linux 学习篇 配置DNS服务器

    BIND9 DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器.DNS中保存了一张域名(doma ...

  4. Andrew Ng机器学习算法入门((六):多变量线性回归方程求解

    多变量线性回归 之前讨论的都是单变量的情况.例如房价与房屋面积之前的关系,但是实际上,房价除了房屋面积之外,还要房间数,楼层等因素相关.那么此时就变成了一个多变量线性回归的问题.在实际问题中,多变量的 ...

  5. (Py练习)输入某年某月判断天数

    # 输入某年某月,判断这一天是这一年的第几天 year = int(input("year:\n")) month = int(input("month:\n" ...

  6. PowerDesigner安装教程

    准备安装 准备好可执行文件.汉化.破解文件 将可执行文件以管理员身份运行: 向导初始化 next 选香港.点同意: 可以默认,如果说这个路径不能用下次就换一个 除了Eclipse全选 全选 好像有个空 ...

  7. 【maven】You may use+to add a project ro to let the plugin find all pom.xml files...

    错误显示 解决方法 点击pom.xml,再Add as Maven Project 如果还不能解决,点击idea的log 复制报错(技巧:可以先将idea.log删除,比较好定位) Caused by ...

  8. Mac 右键强化工具-超级右键

    App Store 功能介绍 1.新建文件 默认支持新建:TXT/RTF/XML/Word/Excel/PPT/WPS文字/WPS表格/WPS演示/Pages/Numbers/keynote/Ai/P ...

  9. 7个IntelliJ IDEA必备插件,提高编码效率

    1. FindBugs-IDEA 作用: 检测代码中可能的bug及不规范的位置,写完代码后检测下 避免低级bug. 静态分析工具承诺无需开发人员费劲就能找出代码中已有的缺陷.当然,如果有多年的编写经验 ...

  10. 05.24 ICPC 2019-2020 North-Western Russia Regional Contest复现赛+Codeforces Round #645 (Div. 2)

    A.Accurate Movement(复现赛) 题意:两个木块最左边都在0的位置,最右边分别为a,b(b>a),并且短的木条只能在长木条内移动,问两个木条需要移动多少次才能使两个木条的右端都在 ...