【转载】 pytorch锁死在dataloader(训练时卡死)
版权声明:本文为CSDN博主「Totoro-wen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32526087/article/details/106350530
=================================================
1.问题描述
2.解决方案
(1)Dataloader里面不用cv2.imread进行读取图片,用cv2.imread还会带来一系列的不方便,比如不能结合torchvision进行数据增强,所以最好用PIL 里面的Image.open来读图片。(并不适用本例)
(2)将DataLoader 里面的参变量num_workers设置为0,但会导致数据的读取很慢,拖慢整个模型的训练。(并不适用本例)
(3)如果用了cv2.imread,不想改代码的,那就加两条语句,来关闭Opencv的多线程:cv2.setNumThreads(0)和cv2.ocl.setUseOpenCL(False)。加了这两条语句之后,并不影响模型的训练。(并不适用本例)
(4)这种情况应该是属于pytorch多线程锁死,在github上看到有该问题,但是没有解决的。
参考建议
首先确保num_works数量低于CPU数量(如果使用Kubernetes,则设置为pod),但是设置得足够高,使数据随时可以用于下一次迭代。如果GPU在t秒内运行每个迭代,而每个dataloader worker加载/处理单个批处理需要N*t秒,那么您应该将num_workers设置为至少N,以避免GPU停滞。当然,系统中至少要有N个cpu。
不幸的是,如果Dataloader使用任何使用K个线程的库,那么生成的进程数量就会变成num_workersK = NK。这可能比计算机中的cpu数量大得多。这会使pod节流,而Dataloader会变得非常慢。这可能导致Dataloader不返回批处理每t秒,导致GPU暂停。
避免K个线程的一种方法是通过OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 python train.py调用主脚本。这就限制了每个Dataloader工作程序只能使用一个线程,从而避免了使机器不堪重负。你仍然需要有足够的num_workers来满足GPU的需要。
您还应该在_get_item__中优化您的代码,以便每个worker在较短的时间内完成其批处理。请确保worker完成批处理的时间不受从磁盘读取训练数据的时间(特别是当您从网络存储中读取数据时)或网络带宽(当您从网络磁盘读取数据时)的影响。如果您的数据集很小,并且您有足够的RAM,那么可以考虑将数据集移动到RAM(或/tmpfs)中,并从那里读取数据以进行快速访问。对于Kubernetes,您可以创建一个RAM磁盘(在Kubernetes中搜索emptyDir)。
如果你已经优化了你的_get_item__代码,并确保磁盘访问/网络访问不是罪魁祸首,但仍然会出现问题,你将需要请求更多的cpu(为了一个Kubernetes pod),或者将你的GPU移动到拥有更多cpu的机器上。
另一个选项是减少batch_size,这样每个worker要做的工作就会减少,并且可以更快地完成预处理。后一种选择在某些情况下是不可取的,因为会有空闲的GPU内存不被利用。
你也可以考虑离线做一些预处理,减轻每个worker的负担。例如,如果每个worker正在读取一个wav文件并计算音频文件的谱图,那么可以考虑离线预先计算谱图,只从工作者的磁盘中读取计算的谱图。这将减少每个worker的工作量。
你也可以考虑将dataloader里的设置pin_memory=False。
上述的方法来自here
————————————————
【转载】 pytorch锁死在dataloader(训练时卡死)的更多相关文章
- Pytorch中多GPU训练指北
前言 在数据越来越多的时代,随着模型规模参数的增多,以及数据量的不断提升,使用多GPU去训练是不可避免的事情.Pytorch在0.4.0及以后的版本中已经提供了多GPU训练的方式,本文简单讲解下使用P ...
- pytorch:EDSR 生成训练数据的方法
Pytorch:EDSR 生成训练数据的方法 引言 Winter is coming 正文 pytorch提供的DataLoader 是用来包装你的数据的工具. 所以你要将自己的 (numpy arr ...
- DenseNet算法详解——思路就是highway,DneseNet在训练时十分消耗内存
论文笔记:Densely Connected Convolutional Networks(DenseNet模型详解) 2017年09月28日 11:58:49 阅读数:1814 [ 转载自http: ...
- [转载]Pytorch详解NLLLoss和CrossEntropyLoss
[转载]Pytorch详解NLLLoss和CrossEntropyLoss 来源:https://blog.csdn.net/qq_22210253/article/details/85229988 ...
- PyTorch ImageNet 基于预训练六大常用图片分类模型的实战
微调 Torchvision 模型 在本教程中,我们将深入探讨如何对 torchvision 模型进行微调和特征提取,所有这些模型都已经预先在1000类的Imagenet数据集上训练完成.本教程将深入 ...
- caffe︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization
一.深度学习中常用的调节参数 本节为笔者上课笔记(CDA深度学习实战课程第一期) 1.学习率 步长的选择:你走的距离长短,越短当然不会错过,但是耗时间.步长的选择比较麻烦.步长越小,越容易得到局部最优 ...
- MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...
- [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路
[源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路 目录 [源码解析] PyTorch 分布式之弹性训练(1) --- 总体思路 0x00 摘要 0x01 痛点 0x02 难点 0 ...
- [源码解析] PyTorch 分布式之弹性训练(2)---启动&单节点流程
[源码解析] PyTorch 分布式之弹性训练(2)---启动&单节点流程 目录 [源码解析] PyTorch 分布式之弹性训练(2)---启动&单节点流程 0x00 摘要 0x01 ...
- [源码解析] PyTorch 分布式之弹性训练(3)---代理
[源码解析] PyTorch 分布式之弹性训练(3)---代理 目录 [源码解析] PyTorch 分布式之弹性训练(3)---代理 0x00 摘要 0x01 总体背景 1.1 功能分离 1.2 Re ...
随机推荐
- nginx虚拟主机实战
基于nginx部署网站 虚拟主机指的就是一个独立的站点,具有独立的域名,有完整的www服务,例如网站.FTP.邮件等. Nginx支持多虚拟主机,在一台机器上可以运行完全独立的多个站点. 一.为什么配 ...
- 项目管理--PMBOK 读书笔记(5)【项目范围管理】
知识点: 1.范围管理计划与需求管理计划: 需求大于范围 2.项目管理的成果线: 3.收集需求的跟踪: 需求跟踪矩阵(RTM):溯源.商业价值.监控过程输出 4.项目范围说 ...
- MapStruct - 注解汇总
@Mapper @Mapper 将接口或抽象类标记为映射器,并自动生成映射实现类代码. public @interface Mapper { // 引入其他其他映射器 Class<?>[] ...
- Prometheus + Grafana (2) mysql、redis、Docker容器、服务端点以及预警
接着上一节 <Prometheus + Grafana (1) 监控 >,我们继续探讨 Prometheus + Grafana 的复杂应用 实现目标 这节我们的目标是搭建一个多维度监控微 ...
- P9482 [NOI2023] 字符串
\(36pts\) \(O(tqn^2)\)暴力即可 \(40pts\) 对于最朴素的暴力优化,从头到尾扫,如果已经当前位字符比出优先级,那么直接能判断了,没必要往后跑了,第15个性质B的也给跑过了, ...
- DotNetGuide荣登GitHub C#中文 Trending 月榜第一
前言 发现最近有一大批应届生同学和Java转.NET的同学加入了我们的DotNetGuide技术社区交流6群(其他5个群都已满500人,6群也已有340多个小伙伴了)今天看到DotNetGuide荣登 ...
- CSS和CSS3(背景,图片,浮动等)
CSS和CSS3背景图片 CSS的背景,无法伸缩图片. <!DOCTYPE html> <html lang="en"> <head> < ...
- arm linux 移植 ffmpeg 库 + x264 + x265
背景 Ffmpeg 中带有h264的解码,没有编码,需要添加x264.libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx264. ...
- 【冷启动#1】实用的MySQL基础
简单安装一下MySQL Windows下(5.7.x) 本体安装 1.首先先下载安装包,名字如下: mysql-5.7.19-winx64.zip 2.配置环境变量,将解压之后的bin目录添加一下 3 ...
- new操作符具体干了什么呢?
new操作符的作用如下: 1.创建一个空对象2.由this变量引用该对象3.该对象继承该函数的原型4.把属性和方法加入到this引用的对象中5.新创建的对象由this引用,最后隐式地返回this.过程 ...