Lyken17 / Efficient-PyTorch

My best practice of training large dataset using PyTorch.
1.09k stars 138 forks source link

training slower after using lmdb #18

Closed happyprotean closed 4 years ago

happyprotean commented 4 years ago

作者,您好,我将自己的图片数据集转换成lmdb后,训练的速度反而下降了。 查看GPU利用率发现,GPU利用率出现很大的波动,从10%-95%。然后我增加num_workers=8,GPU利用率还是会波动,其中CPU利用率只有一个为500%,其余CPU利用率均为20%附近,很明显任务没有均匀的分配到各个CPU线程中去。 我的理解是将图片转换成lmdb文件后,IO的时间会大大减少,GPU利用率应该较高,但是实际却波动很大,请问是不是我的lmdb文件创建出现了问题? 我的lmdb文件创建和数据集读取如下: image image

happyprotean commented 4 years ago

More information: 当dataloader中shuffle=True时,GPU利用率会很大的波动,训练很慢 当dataloader中shuffle=False时,GPU利用率很高,稳定在95%,训练很快 看到介绍说lmdb是内存映射的数据库,只有当顺序读写的时候,相当于在内存中直接操作数据,所以速度很快。但是训练的时候需要shuffle数据保证收敛,所以当需要shuffle数据的时候lmdb作用不大?

Lyken17 commented 4 years ago

大量小文件读写的 IO 效率是很低的,lmdb 主要是为了把小文件打包成一个大 binary。

开启 shuffle 的时候,如果机子本身的内存较小,是有可能导致利用率较低。

至于多线程利用的问题,暂时不清楚是什么原因,需要进一步 profile / debug。

happyprotean commented 4 years ago

进一步debug,训练过慢的bottleneck不在IO,而是因为准确率计算代码使用了for循环,导致GPU利用率太低。