如何使用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炼丹笔记相关推荐

  1. Pytorch多GPU笔记

    Pytorch分布式笔记 Pytorch多GPU计算笔记 DP和DDP的区别 DP DDP Apex amp的使用 apex.parallel.DistributedDataParallel的使用 D ...

  2. NLP炼丹笔记:Switch Transformers 朴实无华 大招秒杀

    作者:九羽,公众号:炼丹笔记 Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient S ...

  3. pytorch深度学习入门笔记

    Pytorch 深度学习入门笔记 作者:梅如你 学习来源: 公众号: 阿力阿哩哩.土堆碎念 B站视频:https://www.bilibili.com/video/BV1hE411t7RN? 中国大学 ...

  4. Pytorch:入门指南和 PyTorch 的 GPU版本安装(非常详细)

    Pytorch: 入门指南和 PyTorch 的 GPU版本安装(非常详细) Copyright: Jingmin Wei, Pattern Recognition and Intelligent S ...

  5. Ubuntu18.04显卡驱动崩溃,pytorch无法使用GPU(CUDA error:all CUDA-capable devices are busy or unavailabile)解决方案

    1.问题描述 之前环境一直好用,突然pytorch就不能使用GPU了,自我检查过程如下: 1.使用nvidia-smi,看看驱动是否正常,没问题. 2. 使用pytorch测试GPU代码 import ...

  6. pytorch 多GPU训练总结(DataParallel的使用)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_40087578/arti ...

  7. pytorch多gpu并行训练操作指南

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 来源:知乎 作者:link-web 链接:https://zhuanlan.zhi ...

  8. pytorch 同步gpu

    pytorch 同步gpu import torch a = torch.tensor([[1, 2, 3],[4, 5, 6]])b = torch.tensor([[2, 2, 2], [3, 3 ...

  9. pytorch 优化GPU显存占用,避免out of memory

    pytorch 优化GPU显存占用,避免out of memory 分享一个最实用的招: 用完把tensor删掉,pytorch不会自动清理显存! 代码举例,最后多删除一个,gpu显存占用就会下降,训 ...

最新文章

  1. hp惠普笔记本电脑黑屏大小写锁定键闪烁报错无法开机怎么办?
  2. 汕头金山中学2021高考成绩查询,2019汕头市金山中学录取分数线及2019高考成绩喜报...
  3. 关于登录linux时,/etc/profile、~/.bash_profile等几个文件的执行过程
  4. WPF WindowStyle为None
  5. djc加密数字货币_中国银行原副行长: quot;网络加密币quot;难以成为货币,央行数字货币只能是法定货币的数字化...
  6. ios网络学习------8 xml格式数据的请求处理 用代码块封装
  7. 一个历史遗留问题,引发的linux内存管理的‘血案’
  8. phpAdmin修改密码后拒绝访问
  9. 201521123004《软件工程》个人阅读作业1
  10. GIS基础软件及操作(二)
  11. Java笔记-JNI中Java与C语言解决中文乱码问题
  12. 【干货】2021年视频号商业化产品能力介绍:招商、推广、变现-腾讯.pdf(附下载链接)...
  13. SQL Server 数据库增删改查
  14. 网上银行“安全登录控件”分析
  15. 工具------Java反编译工具XJad
  16. 码农慌不慌?只因写了一段爬虫,大数据公司200多人被抓!
  17. 解析Linux商业应用现状
  18. 华为手机真机测试问题 The application could not be installed: INSTALL_FALLED_INTERNAL_ERROR
  19. 2023 iApp 图片漫画化源码
  20. 笛卡尔坐标系中八个卦限对应的位置

热门文章

  1. xsl调用java方法传参_Java中的XSL转换:一种简单的方法
  2. spring batch_Spring Batch作为Wildfly模块
  3. ClassNotFoundException:是否会减慢您的JVM?
  4. spring mvc 异步_DeferredResult – Spring MVC中的异步处理
  5. 如何编写更少,更好的代码,或Project Lombok
  6. jboss 不适用内置日志_适用于孩子,父母和祖父母的JBoss HornetQ –第1章
  7. 设计模式 四人帮_四人帮–代理设计模式
  8. 使用Java更新DynamoDB项
  9. Thymeleaf 3 – Thymeleaf 3和Spring MVC快速入门
  10. spring rmi_Spring远程支持和开发RMI服务