PyTorch 数据并行处理
PyTorch 数据并行处理
可选择:数据并行处理(文末有完整代码下载)
本文将学习如何用 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.
class RandomDataset(Dataset):
def __init__(self, size, length):self.len = lengthself.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 中的输出。
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("\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 数据并行处理相关推荐
- PyTorch数据加载处理
PyTorch数据加载处理 PyTorch提供了许多工具来简化和希望数据加载,使代码更具可读性. 1.下载安装包 • scikit-image:用于图像的IO和变换 • pandas:用于更容易地进行 ...
- Pytorch数据类型转换
转自:https://blog.csdn.net/weixin_40446557/article/details/88221851 1.Pytorch上的数据类型 Pytorch的类型可以分为CPU和 ...
- PyTorch数据Pipeline标准化代码模板
前言 PyTorch作为一款流行深度学习框架其热度大有超越TensorFlow的感觉.根据此前的统计,目前TensorFlow虽然仍然占据着工业界,但PyTorch在视觉和NLP领域的顶级会议上已呈一 ...
- PyTorch框架学习八——PyTorch数据读取机制(简述)
PyTorch框架学习八--PyTorch数据读取机制(简述) 一.数据 二.DataLoader与Dataset 1.torch.utils.data.DataLoader 2.torch.util ...
- (pytorch-深度学习系列)pytorch数据操作
pytorch数据操作 基本数据操作,都详细注释了,如下: import torch#5x3的未初始化的Tensor x = torch.empty(5, 3) print("5x3的未初始 ...
- 使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络
使用 PyTorch 数据读取,JAX 框架来训练一个简单的神经网络 本文例程部分主要参考官方文档. JAX简介 JAX 的前身是 Autograd ,也就是说 JAX 是 Autograd 升级版本 ...
- PyTorch系列 (二): pytorch数据读取自制数据集并
PyTorch系列 (二): pytorch数据读取 PyTorch 1: How to use data in pytorch Posted by WangW on February 1, 2019 ...
- 大规模异构数据并行处理系统的设计、实现与实践
点击上方蓝字关注我们 大规模异构数据并行处理系统的设计.实现与实践 夏正勋, 罗圣美, 孙元浩, 唐剑飞, 张燕 星环信息科技(上海)有限公司,上海 200233 论文引用格式: 夏正勋, 罗圣美,等 ...
- PyTorch数据加载器
We'll be covering the PyTorch DataLoader in this tutorial. Large datasets are indispensable in the w ...
最新文章
- centos7-同步时间
- C语言 读取字符串数组中的字符串并获取字符串的长度
- oracle从一个表insert语句,Oracle 使用PLSQL 导出 一个表的insert 语句
- AXI-IIC官方示例解析
- ARM之MMU工作原理分析
- 剑指offer 包含min函数的栈
- 程序员父亲的遗产——编程十诫
- 电脑桌面归纳小窗口_电脑一分钟小技巧:如何将电脑设置为定时关机?
- 和vs版本关系_教学鉴定贴:如何判断是不是VS厂的沛纳海手表
- JVM简介(三)——GC
- XP系统装python
- 「AI」一文看懂“声纹识别VPR”
- 有没有能PC远程控制安卓手机的App?AirDroid实现PC远程控制安卓
- A3C——pytorch
- 阿里AndFix与sophix热修复原理解析
- 对报表.FRX文件的全面分析
- python k线斜率计算公式_通达信公式K线斜率+选股指标源码
- C++小白如何做简单游戏
- Java将html转换成pdf、html转换成图片
- 微信小程序动态生成二维码
热门文章
- 科学处理java.lang.StackOverflowError: null异常
- RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)
- 2022-2028年中国手术室设备行业市场研究及前瞻分析报告
- 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则
- ELECTRA 超过bert预训练NLP模型
- Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf
- 拓展ARM研发进展与玩家
- MLIR与Code Generation
- OneFlow 概念清单
- SystemML大规模机器学习,优化算子融合方案的研究