PyTorch Data Parrallel数据并行
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数据并行的更多相关文章
- PyTorch Tutorials 5 数据并行(选读)
%matplotlib inline 数据并行(选读) Authors: Sung Kim and Jenny Kang 在这个教程里,我们将学习如何使用 DataParallel 来使用多GPU. ...
- [源码解析] PyTorch分布式优化器(2)----数据并行优化器
[源码解析] PyTorch分布式优化器(2)----数据并行优化器 目录 [源码解析] PyTorch分布式优化器(2)----数据并行优化器 0x00 摘要 0x01 前文回顾 0x02 DP 之 ...
- [源码解析] PyTorch 分布式(1) --- 数据加载之DistributedSampler
[源码解析] PyTorch 分布式(1) --- 数据加载之DistributedSampler 目录 [源码解析] PyTorch 分布式(1) --- 数据加载之DistributedSampl ...
- [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader
[源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 目录 [源码解析] PyTorch 分布式(2) --- 数据加载之DataLoader 0x00 摘要 0x01 ...
- Data Pump(数据抽取)介绍
从10g开始,Oracle提供更高效的Data Pump(即expdp/impdp)来进行数据的导入和导出,老的exp/imp还可以用,但已经不建议使用.注意:expdp/impdp和exp/imp之 ...
- 深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用
深度神经网络(Deep Neural Networks, 简称DNN)是近年来机器学习领域中的研究热点,产生了广泛的应用.DNN具有深层结构.数千万参数需要学习,导致训练非常耗时.GPU有强大的计算能 ...
- 【深度学习系列2】Mariana DNN多GPU数据并行框架
[深度学习系列2]Mariana DNN多GPU数据并行框架 本文是腾讯深度学习系列文章的第二篇,聚焦于腾讯深度学习平台Mariana中深度神经网络DNN的多GPU数据并行框架. 深度神经网络( ...
- Oracle 11g R2 Backup Data Pump(数据泵)之expdp/impdp工具
Oracle Data Pump(以下简称数据泵)是Oracle 10g开始提供的一种数据迁移工具,同时也被广大DBA用来作为数据库的逻辑备份工具和体量较小的数据迁移工具.与传统的数据导出/导入工具, ...
- .Net并行编程(一)-TPL之数据并行
前言 许多个人计算机和工作站都有多个CPU核心,可以同时执行多个线程.利用硬件的特性,使用并行化代码以在多个处理器之间分配工作. 应用场景 文件批量上传 并行上传单个文件.也可以把一个文件拆成几段分开 ...
随机推荐
- 不可不知的CSS小技巧
一.表单部分 1.禁止textarea文本域的缩放 resize:none; 2.去除初始化textarea下拉条 overflow:auto; 3.如何让表单中的选项按钮,点击文字也能选中? < ...
- 易酷CMS2.5本地文件包含漏洞复现
易酷CMS是一款影片播放CMS.该CMS2.5版本存在本地文件包含漏洞.我们可以利用这个漏洞,让其包含日志文件,然后再利用报错信息将一句话木马写入日志中.然后利用文件包含漏洞包含该日志文件,再用菜刀连 ...
- XCTF-shrine
shrine 直接看题 进来给了个python代码 import flask import os app = flask.Flask(__name__) app.config['FLAG'] = os ...
- android之Frame Animation
一.在xml文件中设置帧动画 1.首先得在drawable资源文件夹下创建一个animation_list文件 <?xml version="1.0" encoding=&q ...
- java.lang.NoSuchMethodError: org.springframework.util.Assert.state(ZLjava/util/function/Supplier;)V
更多精彩见微信公众号 at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedCo ...
- ppt技巧--线条
声明:本文所有截图来源于网易云课堂--<和秋叶一起学PPT>,只做个人复习之用,特此声明! 线条的五种用途:
- 关于HTTP的一些概念
各种概念 HTTP HTTP(HyperText Transfer Protocol) -- 超文本传输协议 它可以拆成三个部分:"超文本"."传输".&quo ...
- v-bind的使用
v-bind v-bind的引入 内容的绑定可以通过mustache语法,而属性的绑定往往需要通过v-bind 如动态绑定img的src属性 如动态绑定div的class属性 如动态绑定li元素的 ...
- 手写一个最简单的IOC容器,从而了解spring的核心原理
从事开发工作多年,spring源码没有特意去看过.但是相关技术原理倒是背了不少,毕竟面试的那关还是得过啊! 正所谓面试造火箭,工作拧螺丝.下面实现一个最简单的ioc容器,供大家参考. 1.最终结果 2 ...
- 用户对象/GDI对象/内核对象
对象的分类 Windows的对象可以分为三种,分别是用户对象,GDI对象和内核对象.系统使用用户对象支持窗口管理,使用GDI对象支持图形,并使用内核对象支持内存管理,进程执行和进程间通信(IPC) . ...