V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
SonnyBoi
V2EX  ›  问与答

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

  •  
  •   SonnyBoi · 2023-04-12 03:03:39 +08:00 · 1699 次点击
    这是一个创建于 593 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    9 条回复    2023-04-12 14:10:49 +08:00
    MeePawn666
        1
    MeePawn666  
       2023-04-12 03:08:19 +08:00 via Android
    不清楚是否直接相关,但是可以了解一下 NVIDIA 的 DALI
    lovestudykid
        2
    lovestudykid  
       2023-04-12 03:16:39 +08:00
    业余选手,很久没碰了。好像 tf 没这个问题
    SonnyBoi
        3
    SonnyBoi  
    OP
       2023-04-12 05:00:36 +08:00
    @MeePawn666 #1 刚刚看了看一些帖子,貌似 DALI 加速效果确实不错,你也是用的这个库处理大数据么?
    SonnyBoi
        4
    SonnyBoi  
    OP
       2023-04-12 05:01:37 +08:00
    @lovestudykid tf 应该是会好不少,盲猜应该是 tfrecord 读取速度会快很多。然而 pytorch 就。。。方便都是要付出代价的。。。
    MeePawn666
        5
    MeePawn666  
       2023-04-12 07:20:20 +08:00 via Android
    @SonnyBoi hmm, 没有直接用过,但是看一些 mlsys 的论文经常那这个做 baseline
    KissmeBaby
        6
    KissmeBaby  
       2023-04-12 07:34:32 +08:00
    用 parquet ?
    qzwmjv
        7
    qzwmjv  
       2023-04-12 09:58:48 +08:00
    你 dataloader 是全部遍历的? dataloader 源码应该是按 batch 预读的,开调试看看卡在哪个操作,dataset 处理还是 io 阻塞(第二个 epoch 很快应该不是)
    paopjian
        8
    paopjian  
       2023-04-12 10:09:41 +08:00
    有可能是第一个 epoch 是纯读图加预训练,而其他 epoch 是在训练的时候顺便读? 有时间的话还是把预处理提前做一下,都剪切填充好以后保存
    yuluoxinsheng
        9
    yuluoxinsheng  
       2023-04-12 14:10:49 +08:00
    redis 做索引,elstaicsearch 做全文存储?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:41 · PVG 09:41 · LAX 17:41 · JFK 20:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.