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

深度学习训练跑庞大数据集(大于内存)载入的正确方式?

  •  
  •   Richard14 · 221 天前 · 505 次点击
    这是一个创建于 221 天前的主题,其中的信息可能已经有所发展或是发生改变。

    平台是 pytorch ,数据集情况是单条很小,大概不到 1KB ( json+gzip 存到硬盘上),总数据大概 200 万条左右,存硬盘上体积很小,但是发现加载到 py 内存之后会变得非常大,垃圾电脑内存实在装不下。

    目前的数据储存方式是,由于语料是存在文章里的,所以文件夹里大概有一万个文件,每个文件几个 MB ,每个文件里面包含若干条训练数据。

    用自定义 dataloader 的话,如果开启随机读取,系统 IO 会爆炸,每次都需要读很多文件,然后从里面选取几条,剩下大部分的读取都是无效读取。。

    后面换了一种方式是把数据集中到几个大文件中,然后 dataloader 选用顺序读取,这样每次就可以 load 很多到内存里不用频繁 IO ,但是缺点是只能顺序读取,读取又慢如狗,我这 ssd 也不知道 torch 为啥加载这么慢。。还有内存效率也很奇怪,硬盘上存的数据压缩后大概 200M ,加载到内存里进程内存就要超过 5-6 个 G ,每次多读两个文件的话直接爆炸。。

    大佬们有啥读取数据的实现方式可以推荐下么,我去看了下 torchvision 的实现,似乎里面的数据集没有类似情况的

    6 条回复    2022-06-30 00:41:41 +08:00
    murmur
        1
    murmur  
       221 天前   ❤️ 1
    32 个 gb 以下都不需要考虑,直接买内存

    你如果买二手服务器,128g 以下应该都不需要考虑

    我们以前实验室做电磁学仿真用的服务器是 1tb 内存的,对 1tb 的 内存
    Richard14
        2
    Richard14  
    OP
       221 天前
    @murmur 简明
    aaniao002
        3
    aaniao002  
       221 天前 via Android
    办公室机器就直接加内存,自己家机器就把 linux swap 开几百 g ,至少能跑。
    NoobStone
        5
    NoobStone  
       220 天前   ❤️ 1
    没怎么用过 pytorch ,你现在的方式:“换了一种方式是把数据集中到几个大文件中,然后 dataloader 选用顺序读取,这样每次就可以 load 很多到内存里不用频繁 IO ,但是缺点是只能顺序读取”。
    感觉我之前的做法你可以参考,不一定行得通。
    我用 keras 训练图像模型的时候,是把所有图片都存储到 HDF5 ,存进去之后,open 这个超大的 HDF5 文件,只是打开一个指针不会占用内存,可以按照切片语法来读取数据,感觉用起来特别像一个存储在硬盘的 numpy 矩阵。切片读取的话,索引要保证去重,升序。如果你想随机读取数据,需要自己做下处理。
    比如 HDF5 是 arr ,长度 100 ,现在随机读取 6,5,8,9,6 ,那么需要改成 arr[5,6,8,9],然后自己展开。
    Richard14
        6
    Richard14  
    OP
       219 天前
    @NoobStone 谢谢大佬,感觉储存在硬盘上的方案的话你这个应该是最好的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   1478 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 15:26 · PVG 23:26 · LAX 07:26 · JFK 10:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.