pytorch设置多GPU运行的方法
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]上的缓冲区的内置更新将被保留。比如BatchNorm2d 和 spectral_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运行的方法的更多相关文章
- [源码解析] PyTorch 如何使用GPU
[源码解析] PyTorch 如何使用GPU 目录 [源码解析] PyTorch 如何使用GPU 0x00 摘要 0x01 问题 0x02 移动模型到GPU 2.1 cuda 操作 2.2 Modul ...
- Pytorch使用多GPU
在caffe中训练的时候如果使用多GPU则直接在运行程序的时候指定GPU的index即可,但是在Pytorch中则需要在声明模型之后,对声明的模型进行初始化,如: cnn = DataParallel ...
- GPU运行Tensorflow的几点建议
1.在运行之前先查看GPU的使用情况: 指令:nvidia-smi 备注:查看GPU此时的使用情况 或者 指令:watch nvidia-smi 备注:实时返回GPU使用情况 2.指定GPU训练: 方 ...
- Linux scp 设置nohup后台运行
Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...
- IIS7.5使用web.config设置伪静态的二种方法
转自 网上赚钱自学网 .http://www.whosmall.com/post/121 近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两 ...
- CentOS设置服务开机启动的方法
CentOS设置服务开机启动的两种方法 1.利用 chkconfig 来配置启动级别在CentOS或者RedHat其他系统下,如果是后面安装的服务,如httpd.mysqld.postfix等,安装后 ...
- 微信JS-SDK“分享信息设置”API及数字签名生成方法(NodeJS版本)
原文:微信JS-SDK"分享信息设置"API及数字签名生成方法(NodeJS版本) 先上测试地址以示成功: 用微信打开下面地址测试 http://game.4gshu.com/de ...
- 服务器编程入门(13) Linux套接字设置超时的三种方法
摘要: 本文介绍在套接字的I/O操作上设置超时的三种方法. 图片可能有点宽,看不到的童鞋可以点击图片查看完整图片.. 1 调用alarm 使用SIGALRM为connect设置超时 设置方法: ...
- 怎么进入bios设置界面,电脑如何进入BIOS进行设置,怎么进入BIOS的方法集合
怎么进入bios设置界面,电脑如何进入BIOS进行设置,怎么进入BIOS的方法集合 开机出现电脑商家图标时,按住F10键进入BIOS界面.进入BIOS界面一般都是开机后按<del,Esc,F1, ...
随机推荐
- python3 queue队列
一.queue队列 1.python3中的队列模块是queue,不是Queue 2.一般涉及到同步,多线程之类用到队列模块 3.定义了 queue.Queue 类,以及继承它的 queue.LifoQ ...
- window下关闭占用端口使用
怎么在window下关闭端口! 1:查看特定端口被占用情况 命令: netstat -ano 和 netstat -ano|findstr 端口号 netstat -ano:查看电脑所有端口被占用 ...
- 《奋斗吧!菜鸟》 第九次作业:Beta冲刺 Scrum meeting 2
项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11056511.html 团队名称 奋斗吧!菜鸟 作业学习目标 掌 ...
- 基于h5+的微信登录,hbuilder打包
1.打开app项目的manifest.json的文件,选择模块权限配置,将OAuth(登录鉴权)模块添加至已选模块中 2.选择SDK配置,在plus.oauuth·登录鉴权中,勾选□ 微信登录,配置好 ...
- [BeiJing2010组队]次小生成树 Tree
1977: [BeiJing2010组队]次小生成树 Tree Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 5168 Solved: 1668[S ...
- workerman——报错
stream_socket_server(): unable to connect to tcp://0.0.0.0:8282 (Address already in use) in file [报错 ...
- to_excel
Signature: df.to_excel( ['excel_writer', "sheet_name='Sheet1'", "na_rep=''", 'fl ...
- go socket 服务端处理多用户
package main import ( "fmt" "net" "strings") func main() { listener, e ...
- js 相差年、月、日
<!-- 相差天数--> function datedifference(startDate, endDate) { var dateSpan, tempDate, iDays; sDat ...
- 016_Python3 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...