机器学习数据量很大选择什么存储方式比较好/快?

2023-04-12 03:03:39 +08:00
 SonnyBoi

之前炼丹的时候就发现一个问题,用 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 会出现这样的情况。。。为啥就第一次读取速度慢这么多。搞了半天也没找到瓶颈和问题出现在哪里,目前就只想到从数据的存储方式下手。

1431 次点击
所在节点    问与答
9 条回复
MeePawn666
2023-04-12 03:08:19 +08:00
不清楚是否直接相关,但是可以了解一下 NVIDIA 的 DALI
lovestudykid
2023-04-12 03:16:39 +08:00
业余选手,很久没碰了。好像 tf 没这个问题
SonnyBoi
2023-04-12 05:00:36 +08:00
@MeePawn666 #1 刚刚看了看一些帖子,貌似 DALI 加速效果确实不错,你也是用的这个库处理大数据么?
SonnyBoi
2023-04-12 05:01:37 +08:00
@lovestudykid tf 应该是会好不少,盲猜应该是 tfrecord 读取速度会快很多。然而 pytorch 就。。。方便都是要付出代价的。。。
MeePawn666
2023-04-12 07:20:20 +08:00
@SonnyBoi hmm, 没有直接用过,但是看一些 mlsys 的论文经常那这个做 baseline
KissmeBaby
2023-04-12 07:34:32 +08:00
用 parquet ?
qzwmjv
2023-04-12 09:58:48 +08:00
你 dataloader 是全部遍历的? dataloader 源码应该是按 batch 预读的,开调试看看卡在哪个操作,dataset 处理还是 io 阻塞(第二个 epoch 很快应该不是)
paopjian
2023-04-12 10:09:41 +08:00
有可能是第一个 epoch 是纯读图加预训练,而其他 epoch 是在训练的时候顺便读? 有时间的话还是把预处理提前做一下,都剪切填充好以后保存
yuluoxinsheng
2023-04-12 14:10:49 +08:00
redis 做索引,elstaicsearch 做全文存储?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/931779

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX