训练技巧之数据集太多,加载太慢怎么办?
1. 背景
训练集全是16x16,32x32之类的小图,达到上千万张,训练时发现数据加载很慢很慢很慢!!!看了下CPU 内存 GPU使用情况,发现CPU使用率都跑到90%去了,GPU使用率却较低
2. 解决方法
2.1 预处理提速
- 尽量减少每次读取数据时的预处理操作,可以考虑把一些固定的操作,例如 resize ,事先处理好保存下来,训练的时候直接拿来用
- Linux上将预处理搬到GPU上加速:
NVIDIA/DALI :https://github.com/NVIDIA/DALI
2.2 IO提速
2.2.1 使用更快的图片处理
- opencv 一般要比 PIL 要快
- 对于 jpeg 读取,可以尝试 jpeg4py
- 存 bmp 图(降低解码时间)
2.2.2 小图拼起来存放(降低读取次数)
对于大规模的小文件读取,建议转成单独的文件,可以选择的格式可以考虑:TFRecord(Tensorflow)、recordIO(recordIO)、hdf5、 pth、n5、lmdb 等等
2.3 预读取数据
预读取下一次迭代需要的数据, 参考给pytorch 读取数据加速
2.4 借助内存
直接载到内存里面,或者把把内存映射成磁盘好了,参考如何给你PyTorch里的Dataloader打鸡血
2.5 借助固态
把读取速度慢的机械硬盘换成 NVME 固态吧~