pytorch使用GPU炼丹笔记
如何使用GPU训练/测试模型
- 使用单GPU
- 设置设备
- 将数据转换成CUDA张量
- 将模型参数转换成CUDA张量
- 使用指定GPU
- 1.使用CUDA_VISIBLE_DEVICES。
- 1.1 直接在终端或shell脚本中设定:
- 1.2 python代码中设定:
- 2. 使用函数 set_device
- 使用多GPU
- DP方法
- DDP方法
- 需要先初始化
- 数据集的处理
- 模型初始化
- 单节点多GPU分布式训练
- 实验结果
原理:通过依靠GPU的并行计算能力,能够大大缩短模型训练时间。
在使用GPU跑代码的时候,只需要将模型参数和数据放到GPU上转换成CUDA张量即可。
所以,代码需要修改的地方只有两处:
- 1.模型实例化处。
- 2.数据迭代处(如果数据有更新或增加的话也需要在相应的地方改,只要确定在输入模型前的所有数据都转换为CUDA张量即可)。
使用单GPU
设置设备
device=torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
cuda:0表示使用0号显卡进行训练,所以如果需要指定其他GPU,则可以直接修改该数字即可。如cuda:1,表示使用1号显卡进行训练。
将数据转换成CUDA张量
也就是将数据放到GPU上
for i,data in enumerate(trainloader,0):#从迭代器中获取数据输入inputs,labels = datainputs, labels = inputs.to(device), labels.to(device) #数据转换为CUDA张量outputs=net(inputs) #数据输入模型
to(device)的作用是将数据转换为CUDA张量。
以一个labels为例:
- 加.to(device)之前,labels为tensor([0, 6, 2, 0])
- 加.to(device)之后,labels为tensor([0, 6, 2, 0], device=‘cuda:0’)
将模型参数转换成CUDA张量
同理,也就是将模型放到GPU上
net=net.to(device) #model为实例化的模型
使用指定GPU
PyTorch默认使用从0开始的GPU,如果GPU0正在运行程序,需要指定其他GPU。
除了上面直接修改cuda:0的方法之外还有以下两种方法来指定需要使用的GPU。
1.使用CUDA_VISIBLE_DEVICES。
1.1 直接在终端或shell脚本中设定:
CUDA_VISIBLE_DEVICES=1 python my_script.py
1.2 python代码中设定:
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"
2. 使用函数 set_device
import torch
torch.cuda.set_device(id)
该函数见 pytorch-master\torch\cuda_init_.py。
不过官方建议使用CUDA_VISIBLE_DEVICES,不建议使用 set_device 函数。
使用多GPU
DP方法
如果有多个GPU,使用nn.DataParallel来包装我们的模型。 然后通过model.to(device)把模型放到GPU上。
代码如下:
device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
net=Net().to(device) #需要先加载到GPU上,将模型参数转换成CUDA向量
if torch.cuda.device_count() > 1:net=nn.DataParallel(net)
DDP方法
DDP方法比DP方法要好,解决了DP数据分配不平衡和训练速度慢的缺点。
需要添加的地方有:
需要先初始化
需初始化local_rank参数,这里通过argparse模块设置:
parser.add_argument('--local_rank', type=int, default=0,help='node rank for distributed training')
local_rank参数代表要训练的机子,本来用于标记主机和从机的,如果是多机的话,不同的机器使用不同的local_rank标识机器,由于这里是单机多卡,只用0表示主机就可以了。
另外还需要初始化进程组,代码如下:
torch.distributed.init_process_group(backend="nccl", init_method='file://file:///DATA/wanghongzhi/first_dnn/temp/test',rank=0, world_size=1)
其中rank是主机的编号,world_size表示分布式主机的个数。
数据集的处理
这步主要是保证一个batch里的数据被均摊到进程上,每个进程能获取到相应的数据。每个GPU产生一个进程。
train_sampler = torch.utils.data.distributed.DistributedSampler(trainset)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,shuffle=False,sampler=train_sampler)
模型初始化
先执行net=Net().to(device)将模型放在GPU上后,再执行下面语句初始化模型:
net = torch.nn.parallel.DistributedDataParallel(net, device_ids=[args.local_rank],output_device=args.local_rank)
单节点多GPU分布式训练
运行代码的shell脚本为:
python -m torch.distributed.launch --nproc_per_node=2 main.py
其中nproc_per_node为使用的显卡数量。
关于DDP的更多细节、参数的选择及其作用可以参考:
博客1
博客2
博客3
博客4
github资源
实验结果
显卡使用TITIAN Xp,从下面数据结果看到DDP效果最好。
- 1.使用CPU耗时888.595s
- 2.使用一块GPU耗时80.06s
- 3.使用DP,两块GPU耗时60.7744s
- 4.使用DDP,两块GPU耗时48.7986s
参考:
单GPU
多GPU
pytorch使用GPU炼丹笔记相关推荐
- Pytorch多GPU笔记
Pytorch分布式笔记 Pytorch多GPU计算笔记 DP和DDP的区别 DP DDP Apex amp的使用 apex.parallel.DistributedDataParallel的使用 D ...
- NLP炼丹笔记:Switch Transformers 朴实无华 大招秒杀
作者:九羽,公众号:炼丹笔记 Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient S ...
- pytorch深度学习入门笔记
Pytorch 深度学习入门笔记 作者:梅如你 学习来源: 公众号: 阿力阿哩哩.土堆碎念 B站视频:https://www.bilibili.com/video/BV1hE411t7RN? 中国大学 ...
- Pytorch:入门指南和 PyTorch 的 GPU版本安装(非常详细)
Pytorch: 入门指南和 PyTorch 的 GPU版本安装(非常详细) Copyright: Jingmin Wei, Pattern Recognition and Intelligent S ...
- Ubuntu18.04显卡驱动崩溃,pytorch无法使用GPU(CUDA error:all CUDA-capable devices are busy or unavailabile)解决方案
1.问题描述 之前环境一直好用,突然pytorch就不能使用GPU了,自我检查过程如下: 1.使用nvidia-smi,看看驱动是否正常,没问题. 2. 使用pytorch测试GPU代码 import ...
- pytorch 多GPU训练总结(DataParallel的使用)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_40087578/arti ...
- pytorch多gpu并行训练操作指南
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 来源:知乎 作者:link-web 链接:https://zhuanlan.zhi ...
- pytorch 同步gpu
pytorch 同步gpu import torch a = torch.tensor([[1, 2, 3],[4, 5, 6]])b = torch.tensor([[2, 2, 2], [3, 3 ...
- pytorch 优化GPU显存占用,避免out of memory
pytorch 优化GPU显存占用,避免out of memory 分享一个最实用的招: 用完把tensor删掉,pytorch不会自动清理显存! 代码举例,最后多删除一个,gpu显存占用就会下降,训 ...
最新文章
- hp惠普笔记本电脑黑屏大小写锁定键闪烁报错无法开机怎么办?
- 汕头金山中学2021高考成绩查询,2019汕头市金山中学录取分数线及2019高考成绩喜报...
- 关于登录linux时,/etc/profile、~/.bash_profile等几个文件的执行过程
- WPF WindowStyle为None
- djc加密数字货币_中国银行原副行长: quot;网络加密币quot;难以成为货币,央行数字货币只能是法定货币的数字化...
- ios网络学习------8 xml格式数据的请求处理 用代码块封装
- 一个历史遗留问题,引发的linux内存管理的‘血案’
- phpAdmin修改密码后拒绝访问
- 201521123004《软件工程》个人阅读作业1
- GIS基础软件及操作(二)
- Java笔记-JNI中Java与C语言解决中文乱码问题
- 【干货】2021年视频号商业化产品能力介绍:招商、推广、变现-腾讯.pdf(附下载链接)...
- SQL Server 数据库增删改查
- 网上银行“安全登录控件”分析
- 工具------Java反编译工具XJad
- 码农慌不慌?只因写了一段爬虫,大数据公司200多人被抓!
- 解析Linux商业应用现状
- 华为手机真机测试问题 The application could not be installed: INSTALL_FALLED_INTERNAL_ERROR
- 2023 iApp 图片漫画化源码
- 笛卡尔坐标系中八个卦限对应的位置
热门文章
- xsl调用java方法传参_Java中的XSL转换:一种简单的方法
- spring batch_Spring Batch作为Wildfly模块
- ClassNotFoundException:是否会减慢您的JVM?
- spring mvc 异步_DeferredResult – Spring MVC中的异步处理
- 如何编写更少,更好的代码,或Project Lombok
- jboss 不适用内置日志_适用于孩子,父母和祖父母的JBoss HornetQ –第1章
- 设计模式 四人帮_四人帮–代理设计模式
- 使用Java更新DynamoDB项
- Thymeleaf 3 – Thymeleaf 3和Spring MVC快速入门
- spring rmi_Spring远程支持和开发RMI服务