训练集全是16x16,32x32之类的小图,达到上千万张,训练时发现数据加载很慢很慢很慢!!!看了下CPU 内存 GPU使用情况,发现CPU使用率都跑到90%去了,GPU使用率却较低
3)1张32*32的图其实也就3K大,1000w也才不到29G,现在训练机器都是几百G的内存,直接载到内存里面,或者把把内存映射成磁盘好了。
如果是小图的话,确定是io瓶颈,可以考虑把小图转成tfrecord等大文件;
如果确定prefetch无效,而且排除了io瓶颈,那真可能是cpu瓶颈了,这个时候只能考虑把一些heavy的预处理和数据增强放到GPU来做。
io对cpu压力不大的。90%的cpu肯定是在做计算。
读写的上限跟iops有关,iops又跟硬盘有关,拿阿里云的普通ssd说的话,代码写的还行的话,一秒最多读300-400m。加载慢可以先试试自己读出来在做转换。
训练慢的话就上gpu吧。数据该压缩的地方压缩一下。
首先判断是否是io瓶颈,数据数量多少和io速度没关系,cpu很高的话说明问题在于cpu预处理而非磁盘io。
既然已经都几千万样本了,个人认为就没必要做实事的数据增强和预处理了。
离线数据增强好,load进去后直接喂给gpu就可以了。
如果图片尺寸一致且存储足够的话,可以先把数据存到h5格式,batch处理的时候,随机读取会快很多。
如果是data augmentation的瓶颈,建议看一下dali,但是要写不少代码改造dataloader,另一种方法就是离线数据增强,当然有可能会影响算法调试的灵活性。如果卡在io上,尝试多线程,实在不行换nvme硬盘吧
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
内容反馈