1.DataParallel layers (multi-GPU, distributed)

1)DataParallel

CLASS torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=)

实现模块级别的数据并行

该容器是通过在batch维度上将输入分到指定的device中来在给定的module应用上实现并行。在前向传播中,模块module将在每个设备device上都复制一个,然后每个复制体都会处理一部分的输入。在后向传播阶段,从每个复制体中计算得到的梯度会加在一起求和,然后传给最初的模块module

batch size的大小应该比GPU的个数大

也可见Use nn.DataParallel instead of multiprocessing

任意位置和关键字输入都允许被传给DataParallel,但是一些类型将进行特定处理。tensors将在指定的维度dim(默认为0)上被分散。tuple、list和dict类型将被浅复制。其他类型将在不同的线程中共享,且在写入模型的前向传播时可以被打断

在运行该DataParallel模块浅,并行module必须在device_ids[0]有自己的参数和缓冲区

警告⚠️

在每次前向传播中,module在每个设备中复制一遍,所以任何对该正在运行的module的forward的更新都将丢失。比如,如果module有一个计算属性,在每次forward后自增,那么该属性将保持在初始状态,因为已经进行更新的复制体在forward后将被摧毁。但是,DataParallel能保证在device[0]上的复制体的参数和缓冲区与基本并行module共享存储。因此对参数或device[0]上的缓冲区的内置更新将被保留。比如BatchNorm2dspectral_norm()就依赖于该特性更新缓冲区

警告⚠️

定义在module中的前向后向hooks和它的子模块将被调用len(device_ids)次,每一次都带着对应设备上的输入。尤其是hooks仅保证根据相应设备上的操作以正确顺序被执行。比如,不保证通过register_forward_pre_hook()被设置的hooks在所有len(device_ids)次forward()调用之前被执行,但是每个这样的hook将在该设备的相应forward()调用之前被执行

警告⚠️

当module在forward()返回scalar(比如0维度的tensor),该封装器将返回一个有着与使用在数据并行中的设备数量相同的长度向量,包含着来自每个设备的结果

注意⚠️

在封装在DataParallel中的模块module中使用pack sequence -> recurrent network -> unpack sequence模式是十分微妙的。详情可见My recurrent network doesn’t work with data parallelism

参数:

  • module(Module):并行模块module
  • device_ids(int类型列表或torch.device): CUDA设备(默认为所有设备)
  • output_device(int或torch.device):输出的设备位置(默认为device_ids[0])
Variables:

~DataParallel.module (Module) :并行模块

例子:

>>> net = torch.nn.DataParallel(model, device_ids=[, , ])
>>> output = net(input_var) # input_var can be on any device, including CPU

等价于下面的方法:

2.DataParallel functions (multi-GPU, distributed)

1)data_parallel

torch.nn.parallel.data_parallel(module, inputs, device_ids=None, output_device=None, dim=, module_kwargs=None)

该给定的device_ids的GPU上并行执行module(input)

这个是上面的DataParallel模块的函数版本

参数:

  • module(Module):并行模块module
  • input(Tensor):module的输入
  • device_ids(int类型列表或torch.device): CUDA设备(默认为所有设备)
  • output_device(int或torch.device):输出的设备位置(默认为device_ids[0])

返回:

包含着位于指定output_device上的model(input)的结果的Tensor

例子:

import torch.nn.parallel
...
def forward(self,input):
if self.ngpu>:
output=nn.parallel.data_parallel(self.model,input,range(self.ngpu)) #在多个gpu上运行模型,并行计算
else:
output=self.model(input) return output

pytorch设置多GPU运行的方法的更多相关文章

  1. [源码解析] PyTorch 如何使用GPU

    [源码解析] PyTorch 如何使用GPU 目录 [源码解析] PyTorch 如何使用GPU 0x00 摘要 0x01 问题 0x02 移动模型到GPU 2.1 cuda 操作 2.2 Modul ...

  2. Pytorch使用多GPU

    在caffe中训练的时候如果使用多GPU则直接在运行程序的时候指定GPU的index即可,但是在Pytorch中则需要在声明模型之后,对声明的模型进行初始化,如: cnn = DataParallel ...

  3. GPU运行Tensorflow的几点建议

    1.在运行之前先查看GPU的使用情况: 指令:nvidia-smi 备注:查看GPU此时的使用情况 或者 指令:watch nvidia-smi 备注:实时返回GPU使用情况 2.指定GPU训练: 方 ...

  4. Linux scp 设置nohup后台运行

    Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...

  5. IIS7.5使用web.config设置伪静态的二种方法

    转自 网上赚钱自学网 .http://www.whosmall.com/post/121 近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两 ...

  6. CentOS设置服务开机启动的方法

    CentOS设置服务开机启动的两种方法 1.利用 chkconfig 来配置启动级别在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd.mysqld.postfix等,安装后 ...

  7. 微信JS-SDK“分享信息设置”API及数字签名生成方法(NodeJS版本)

    原文:微信JS-SDK"分享信息设置"API及数字签名生成方法(NodeJS版本) 先上测试地址以示成功: 用微信打开下面地址测试 http://game.4gshu.com/de ...

  8. 服务器编程入门(13) Linux套接字设置超时的三种方法

    摘要:     本文介绍在套接字的I/O操作上设置超时的三种方法. 图片可能有点宽,看不到的童鞋可以点击图片查看完整图片.. 1 调用alarm 使用SIGALRM为connect设置超时 设置方法: ...

  9. 怎么进入bios设置界面,电脑如何进入BIOS进行设置,怎么进入BIOS的方法集合

    怎么进入bios设置界面,电脑如何进入BIOS进行设置,怎么进入BIOS的方法集合 开机出现电脑商家图标时,按住F10键进入BIOS界面.进入BIOS界面一般都是开机后按<del,Esc,F1, ...

随机推荐

  1. linux系统编程之管道(二)

    今天继续研究管道,话不多说,言归正传: 对于管道,有一定的读写规则,所以这里主要是对它的规则进行探讨,具体规则如下: 规则一: 下面用程序来验证下,还是用上节学的子进程写数据,父进程读取数据的例子,只 ...

  2. vue-(过滤器,钩子函数,路由)

    1.局部过滤器 在当前组件内部使用过滤器,修饰一些数据 //声明 filters:{ '过滤器的名字':function(val,a,b){ //a 就是alax ,val就是当前的数据 } } // ...

  3. 使用navicat创建数据库

    1.  打开navicat 2.  选中数据库连接“root”右键->新建数据库 3. 填写数据库名称,注意名称不要以数字开头,不要有中文.空格.特殊字符等 4. 选择“字符集”,常用的为utf ...

  4. Mysql 查询当天、昨天、近7天、一周内、本月、上一月等的数据(函数执行日期的算术运算)

    注:where语句后中的字段last_login_time 替换成 时间字段名 即可 #查询昨天登录用户的账号 ; #查询当天登录用户的账号 ; #查询所有last_login_time值在最后1天内 ...

  5. laravel5.8 编译laravel mix

    如果第一次无需执行(如果编译的时候出错再次执行才需要) 1:rm -rf node_modules 更改镜像为淘宝镜像 2:yarn config set registry https://regis ...

  6. webpack打包后服务端__dirname失效问题

    在webpack.config.js中添加如下配置: target: 'node', node: { __dirname: false, __filename: false, } 详见:https:/ ...

  7. [PKUSC2018]主斗地

    暴搜 非常暴力的搜索,以至于我都不相信我能过. 方法是:暴力枚举所有牌型,然后暴力判断是否可行. 暴力枚举部分: 非常暴力: void dfs(int x,int l){ if(l==0){ flag ...

  8. CQOI2016 不同的最小割 (最小割树模板)(等价流树的Gusfield构造算法)

    题目 最小割树模板 算法详解及证明见: 2016年国家队候选队员论文 <浅谈无向图最小割问题的一些算法及应用--绍兴一中 王文涛> 3.2节 CODE #include <bits/ ...

  9. ClickHouse 分布式高可用集群搭建(转载)

    一.ClickHouse安装方式: 源码编译安装 Docker安装 RPM包安装 为了方便使用,一般采用RPM包方式安装,其他两种方式这里不做说明. 二.下载安装包 官方没有提供rpm包,但是Alti ...

  10. Qt智能指针QPointer, QSharedDataPointer ,QSharedPointer,QWeakPointer和QScopedPointer

    QPointer (4.0) 已经过时,可以被QWeakPointer所替代,它不是线程安全的. QSharedDataPointer (4.0) -- 提供对数据的COPY-ON-WRITE以及浅拷 ...