Pytorch训练PTB数据集时速度慢的问题
项目场景:
利用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数据集时速度慢的问题相关推荐
- Pytorch 训练与测试时爆显存(cuda out of memory)的终极解决方案,使用cpu(勿喷)
Pytorch 训练与测试时爆显存(cuda out of memory)的终极解决方案,使用cpu(勿喷) 参见了很多方法,都没有用. 简单点,直接把gpu设成-1
- python吃显卡还是内存不足_解决Pytorch 训练与测试时爆显存(out of memory)的问题
Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法. 使用torch.cuda.empty_cache() ...
- 关于yolov3在训练自己数据集时容易出现的bug集合,以及解决方法
早先写了一篇关于yolov3训练自己数据集的博文Pytorch实现YOLOv3训练自己的数据集 其中很详细的介绍了如何的训练自定义的数据集合,同时呢笔者也将一些容易出现的bug写在了博文中,想着的是可 ...
- 在PyTorch训练一个epoch时,模型不能接着训练,Dataloader卡死
笔者在训练模型的时候,突然偶遇这个问题,即训练一个epoch时,模型不能接着训练,只能通过Ctrl+C强制性暂停,见下图: Ctrl+C之后呈现的信息表明,这个bug是和多线程有关系. 经过笔者实验, ...
- Pytorch 训练与测试时爆显存(out of memory)的一个解决方案
Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法. 使用torch.cuda.empty_cache() ...
- 解决Pytorch 训练与测试时爆显存(out of memory)的问题
Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法. 使用torch.cuda.empty_cache() ...
- 深度学习:使用pytorch训练cifar10数据集(基于Lenet网络)
文档基于b站视频:https://www.bilibili.com/video/BV187411T7Ye 流程 model.py --定义LeNet网络模型 train.py --加载数据集并训练,训 ...
- Deeplabv3+ Pytorch训练cityscapes数据集
Anaconda3安装可以参考Deeplabv3+ 环境配置-Anaconda3 + Pytorch1.8 + Cuda10.1 + opencv3.2.0 环境配置 首先为pytorch创建一个an ...
- 让PyTorch训练速度更快,你需要掌握这17种方法
选自efficientdl.com 作者:LORENZ KUHN 机器之心编译 编辑:陈萍 掌握这 17 种方法,用最省力的方式,加速你的 Pytorch 深度学习训练. 近日,Reddit 上一个帖 ...
最新文章
- bps、Bps、pps
- hash一致性算法理解
- Http状态码完整说明
- 排坑 | Exceptionless 5.x 无法正常发送邮件
- VS2008水晶报表发布部署总结
- Microstrategy CEO:比特币是一种货币资产 正在迅速取代黄金作为价值存储
- Spring-context-ConfigurationClassBeanDefinitionReader类
- MOSS架构和共享服务(Shared Service)
- MSP430使用wifi模块发送数据(上,测试连接)
- 矩阵的迹(Trace)
- 女孩的问题,男孩的回答
- 孪生再世代表数字几_正文 第六百一十七章 原来是孪生姐妹?
- 机械硬盘和固态硬盘之间的区别
- 破解版百度云【亲测好用】完美解决限速
- 牛顿法python 实现
- IE5.0中的三个彩蛋(转)
- 安卓AndroidManifast
- 制作Code128B一维条形码的综合教程
- 一、我来说LuCI: LuCI官方----3. Theme and Modules
- 一楼二楼教师办公室图书馆操场计算机房,人教版PEP版四年级下册Unit1-Unit6课前知识预习...