项目场景:

利用Pytorch在PTB数据集上训练的词嵌入模型的实现。


问题描述:

在训练过程中,发现训练速度很慢,利用GPU-Z查看后,发现GPU利用率基本为0。


原因分析:

为了找到耗时大的程序段,在训练代码中加入输出耗时的语句。

        for batch in data_iter:print("end:, time ", time.time() - start)center, context_negative, mask, label = [d.to(device) for d in batch]pred = skip_gram(center, context_negative, net[0], net[1])l = loss(pred.view(label.shape), label, mask).mean()  # 一个batch的平均lossoptimizer.zero_grad()l.backward()optimizer.step()sum_loss += l.cpu().item()print("sta:, time ", time.time() - start)


发现训练耗时很短,主要的时间花费都在读取数据的环节,每次都要花费1.5s左右。

for batch in data_iter:

而读取数据是由CPU完成的,训练过程的处理数据是由GPU完成了,也就是说程序运行时间长是由于CPU性能不足导致的,GPU每次处理数据都很快,只需要很短的时间就可以处理完数据,而后一直处于等待时间,因此利用率才会为0。同样利用GPU-Z查看平均利用率:

发现实际上是有使用GPU的,只是平均利用率非常低。为了进一步验证问题,同样也是为了查看GPU的处理能力,将batca size加大一个数量级,从512改为4096,进行观察。

发现CPU读取数据所用时间增长了66倍,而GPU处理数据所用时间基本不变。
因此可以确定,训练速度慢的原因,是遇到CPU瓶颈了。也就是CPU加载速度慢,使GPU空转、利用率低。


解决方案:

参考https://blog.csdn.net/qq_32998593/article/details/92849585/中提出的两种方法。

1、从单线程改为多线程。也就是将num_workers(线程数)改为4、8、16等,提高加载数据的速度。但windows系统有个贼sb的bug,好像已经有几年了,num_workers必须为0,不然就会出现错误如下:

因此该方法在win上暂时不可用。

2、pin_memory=True。当你的服务器或者电脑的内存较大,性能较好的时候,建议打开pin_memory打开,就省掉了将数据从CPU传入到缓存RAM里面,再给传输到GPU上;为True时是直接映射到GPU的相关内存块上,省掉了一点数据传输时间。

也许是因为我的电脑性能不足,速度不仅没有变快,反而变慢了,只好放弃该方法。

3、此外,在一些其他的文章上看到,可以对数据的加载代码做一些优化,但还没有尝试过,不知道效果如何。

结论:无能为力,还是准备用服务器跑吧。

Pytorch训练PTB数据集时速度慢的问题相关推荐

  1. Pytorch 训练与测试时爆显存(cuda out of memory)的终极解决方案,使用cpu(勿喷)

    Pytorch 训练与测试时爆显存(cuda out of memory)的终极解决方案,使用cpu(勿喷) 参见了很多方法,都没有用. 简单点,直接把gpu设成-1

  2. python吃显卡还是内存不足_解决Pytorch 训练与测试时爆显存(out of memory)的问题

    Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法. 使用torch.cuda.empty_cache() ...

  3. 关于yolov3在训练自己数据集时容易出现的bug集合,以及解决方法

    早先写了一篇关于yolov3训练自己数据集的博文Pytorch实现YOLOv3训练自己的数据集 其中很详细的介绍了如何的训练自定义的数据集合,同时呢笔者也将一些容易出现的bug写在了博文中,想着的是可 ...

  4. 在PyTorch训练一个epoch时,模型不能接着训练,Dataloader卡死

    笔者在训练模型的时候,突然偶遇这个问题,即训练一个epoch时,模型不能接着训练,只能通过Ctrl+C强制性暂停,见下图: Ctrl+C之后呈现的信息表明,这个bug是和多线程有关系. 经过笔者实验, ...

  5. Pytorch 训练与测试时爆显存(out of memory)的一个解决方案

    Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法. 使用torch.cuda.empty_cache() ...

  6. 解决Pytorch 训练与测试时爆显存(out of memory)的问题

    Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法. 使用torch.cuda.empty_cache() ...

  7. 深度学习:使用pytorch训练cifar10数据集(基于Lenet网络)

    文档基于b站视频:https://www.bilibili.com/video/BV187411T7Ye 流程 model.py --定义LeNet网络模型 train.py --加载数据集并训练,训 ...

  8. Deeplabv3+ Pytorch训练cityscapes数据集

    Anaconda3安装可以参考Deeplabv3+ 环境配置-Anaconda3 + Pytorch1.8 + Cuda10.1 + opencv3.2.0 环境配置 首先为pytorch创建一个an ...

  9. 让PyTorch训练速度更快,你需要掌握这17种方法

    选自efficientdl.com 作者:LORENZ KUHN 机器之心编译 编辑:陈萍 掌握这 17 种方法,用最省力的方式,加速你的 Pytorch 深度学习训练. 近日,Reddit 上一个帖 ...

最新文章

  1. bps、Bps、pps
  2. hash一致性算法理解
  3. Http状态码完整说明
  4. 排坑 | Exceptionless 5.x 无法正常发送邮件
  5. VS2008水晶报表发布部署总结
  6. Microstrategy CEO:比特币是一种货币资产 正在迅速取代黄金作为价值存储
  7. Spring-context-ConfigurationClassBeanDefinitionReader类
  8. MOSS架构和共享服务(Shared Service)
  9. MSP430使用wifi模块发送数据(上,测试连接)
  10. 矩阵的迹(Trace)
  11. 女孩的问题,男孩的回答
  12. 孪生再世代表数字几_正文 第六百一十七章 原来是孪生姐妹?
  13. 机械硬盘和固态硬盘之间的区别
  14. 破解版百度云【亲测好用】完美解决限速
  15. 牛顿法python 实现
  16. IE5.0中的三个彩蛋(转)
  17. 安卓AndroidManifast
  18. 制作Code128B一维条形码的综合教程
  19. 一、我来说LuCI: LuCI官方----3. Theme and Modules
  20. 一楼二楼教师办公室图书馆操场计算机房,人教版PEP版四年级下册Unit1-Unit6课前知识预习...

热门文章

  1. python安装其他版本时出现0x80070666
  2. 这东西有什么好吃的,我也就吃了二十多碗吧 | 钛空舱
  3. 用计算机模拟人类的智能,( )是指用计算机模拟人类的智能。
  4. 贴片电阻中的光敏电阻主要应用于哪些场景
  5. 经典例题:求矩阵相乘
  6. QCC 单地址SDK 使用MDE debug时无log输出
  7. matlab simulink四分之一高铁车辆模型悬架主动控制
  8. java类似金山打字的键盘模拟_使用vue写一个类似金山打字通
  9. 进阶项目10-区号查询
  10. Python爬虫实战(七):某讯较真辟谣小程序爬虫