之前炼丹的时候就发现一个问题,用 Pytorch 的 DataLoader 第一次遍历数据集的速度会大大的慢于后面的 epoch 。这在数据量比较小( 100k ~ 700k 张图片 + 另一张同尺寸的数据)的时候还可以勉强接受,第一个 epoch 可能花个 40 ~ 50 分钟,后面就是神速 5 ~ 10 分钟左右。然而当数据量增加到 300M 张图片的时候直接就爆炸了(╯□╰),第一个 epoch 可能要花 20 个小时!。。然而我在集群上的节点一次介么也就只能用 24 小时,这回是真的麻了。。。
想了很多办法无果,想问问炼丹的 V 友是有没有遇见过这个问题的?目前我用的存储方式是 .h5df
文件 + h5py 库,每 1000 张图片分进一个 group 进行储存,因为每张图片因为尺寸大小不一样(后续才进行 crop 处理),所以每张单独就存储为 group 中的一个 dataset ,这里我也就没法尝试 chunk size 在速度提升方面有没有帮助了。想了有两个方案目前还没有尝试,不知道会不会有提升:1 )改用 lmdb 库。2) 直接存成 .npy
文件用 np.load
读取。看了一些论文的源码很多都是直接用 PIL 暴力读图片,然而我的输出是一个与输入同尺寸的数组,所以就没办法用这个办法了。
根本原因也是完全不清楚为什么 DataLoader 会出现这样的情况。。。为啥就第一次读取速度慢这么多。搞了半天也没找到瓶颈和问题出现在哪里,目前就只想到从数据的存储方式下手。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.