之前炼丹的时候就发现一个问题,用 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 会出现这样的情况。。。为啥就第一次读取速度慢这么多。搞了半天也没找到瓶颈和问题出现在哪里,目前就只想到从数据的存储方式下手。
1
MeePawn666 2023-04-12 03:08:19 +08:00 via Android
不清楚是否直接相关,但是可以了解一下 NVIDIA 的 DALI
|
2
lovestudykid 2023-04-12 03:16:39 +08:00
业余选手,很久没碰了。好像 tf 没这个问题
|
3
SonnyBoi OP @MeePawn666 #1 刚刚看了看一些帖子,貌似 DALI 加速效果确实不错,你也是用的这个库处理大数据么?
|
4
SonnyBoi OP @lovestudykid tf 应该是会好不少,盲猜应该是 tfrecord 读取速度会快很多。然而 pytorch 就。。。方便都是要付出代价的。。。
|
5
MeePawn666 2023-04-12 07:20:20 +08:00 via Android
@SonnyBoi hmm, 没有直接用过,但是看一些 mlsys 的论文经常那这个做 baseline
|
6
KissmeBaby 2023-04-12 07:34:32 +08:00
用 parquet ?
|
7
qzwmjv 2023-04-12 09:58:48 +08:00
你 dataloader 是全部遍历的? dataloader 源码应该是按 batch 预读的,开调试看看卡在哪个操作,dataset 处理还是 io 阻塞(第二个 epoch 很快应该不是)
|
8
paopjian 2023-04-12 10:09:41 +08:00
有可能是第一个 epoch 是纯读图加预训练,而其他 epoch 是在训练的时候顺便读? 有时间的话还是把预处理提前做一下,都剪切填充好以后保存
|
9
yuluoxinsheng 2023-04-12 14:10:49 +08:00
redis 做索引,elstaicsearch 做全文存储?
|