epoch训练时间不同_给训练踩踩油门——Pytorch加速数据读取

针对Pytorch训练速度慢的问题,通过使用data_prefetcher、优化数据预处理、调整num_workers、利用内存等方法,有效提升了训练速度。实验表明,这些优化能显著缩短训练时间,例如将11万张图片的训练时间从7天减少到4天半。
摘要由CSDN通过智能技术生成

加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~

本文选自知乎,已获得作者授权,不得二次转载。

作者:MrTian

链接:https://zhuanlan.zhihu.com/p/80695364

需求

最近在训练coco数据集,训练集就有11万张,训练一个epoch就要将近100分钟,训练100个epoch,就需要7天!这实在是太慢了。

经过观察,发现训练时GPU利用率不是很稳定,每训练5秒,利用率都要从100%掉到0%一两秒,初步判断是数据读取那块出现了瓶颈。于是经过调研和实验,制定了下列解决方案。

解决方案

安装:

pip install prefetch_generator

使用:

from torch.utils.data import DataLoader
from prefetch_generator import BackgroundGenerator
 
class DataLoaderX(DataLoader):
 
    def __iter__(self):
        return BackgroundGenerator(super().__iter__())

然后用DataLoaderX替换原本的DataLoader

提速原因:

原本Pytorch默认的DataLoader会创建一些worker线程来预读取新的数据,但是除非这些线程的数据全部都被清空,这些线程才会读下一批数据。使用prefetch_generator,我们可以保证线程不会等待,每个线程都总有至少一个数据在加载。

(2)data_prefetcher

使用data_prefetcher新开cuda stream来拷贝tensor到gpu。

使用:

    def __init__(self, loader, opt):
        self.loader = iter(loader)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值