pytorch锁死在dataloader(训练时卡死)
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。
补充:pytorch加载训练数据集dataloader操作耗费时间太久,该如何解决?
笔者在使用pytorch加载训练数据进行模型训练的时候,发现数据加载需要耗费太多时间,该如何缩短数据加载的时间消耗呢?经过查询相关文档,
总结实际操作过程如下:
1、尽量将jpg等格式的文件保存为bmp文件,可以降低解码时间;
2、dataloader函数中增加num_workers参数,该参数表示加载数据的线程数,建议设置为该系统中的CPU核心数,若CPU很强劲,而且内存很大,也可以考虑将该数值设置的更大一些。
train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)
修改为:
train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True,num_workers=multiprocessing.cpu_count())
虽然使用dataloader达到了iter(Dataset)的读取并行,但是没有实现在GPU运算时异步读取数据,可以考虑使用non_blocking实现。
dataloader = data.Dataloader(dataset, batch_size = batch_size, num_workers = workers)
for epoch in range(epochs):
for batch_idx, (images, labels) in enumerate(dataloader):
images = images.to(device)
labels = labels.to(device)
改为:
dataloader = data.Dataloader(dataset, batch_size = batch_size, num_workers = workers, pin_memory = True)
for epoch in range(epochs):
for batch_idx, (images, labels) in enumerate(dataloader):
images = images.to(device, non_blocking=True)
labels = labels.to(device, non_blocking=True)
需要注意的是:只有pin_memory=True并且num_workers>0时non_blocking才会有效。
(资源库 www.zyku.net)
原文链接:https://blog.csdn.net/qq_32526087/article/details/106350530
上一篇:pytorch中的优化器optimizer.param_groups用法
栏 目:Python教程
本文标题:pytorch锁死在dataloader(训练时卡死)
本文地址:https://www.zyku.net/python/9901.html
您可能感兴趣的文章
- 01-18小猪赚钱-小猪赚钱应用软件功能介绍
- 02-08小米10隐藏应用APP教程
- 05-31帝国CMS二次开发经常会用的ehtmlspeci
- 01-12特效变音魔术师-特效变音魔术师应用软
- 06-28Windows下bat文件后台运行的方法
- 03-05vivoy53s设置语音唤醒功能教程
- 01-12皖云-皖云应用软件功能介绍
- 02-22小米11pro证件照功能使用方法
- 09-11ipad如何更改密码
- 01-02海猫学车-海猫学车应用软件功能介绍
- 01-11净化管家-净化管家应用软件功能介绍
- 01-12掌上画画-掌上画画应用软件功能介绍
- 02-19Linux中的Diff和Patch使用方法详解
- 02-18HTML5拖拉上传文件的简单实例
- 01-13小强wifi上网小助手-小强wifi上网小助
- 09-19ipad画中画功能在哪里
- 12-31时间相机pro-时间相机pro应用软件功能
- 11-24猫耳fm日常任务在哪完成
- 12-28三河质控-三河质控应用软件功能介绍
- 09-17嘀嗒出行开发票步骤分享
最近更新
阅读排行
猜你喜欢
- 02-08vivoy30全面屏手势设置方法
- 07-04小米10s启用锁屏显示教程
- 12-27快鸟穿搭-快鸟穿搭应用软件功能介绍
- 01-16手机红外空调遥控器-手机红外空调遥控
- 03-20MySQL 8.0的新特性和解决办法
- 05-28threejs和ThingJS的区别,ThingJS收费么
- 07-07vivos10pro设置自定义铃声步骤分享
- 01-09一加10pro启用锁屏方法汇总
- 02-01华为儿童手表4x远程关机步骤
- 01-18良哥米播app-良哥米播app应用软件功能