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

2022-06-28 13:52:18 +08:00
 Richard14

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

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

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

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

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

845 次点击
所在节点    问与答
6 条回复
murmur
2022-06-28 14:07:59 +08:00
32 个 gb 以下都不需要考虑,直接买内存

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

我们以前实验室做电磁学仿真用的服务器是 1tb 内存的,对 1tb 的 内存
Richard14
2022-06-28 16:14:16 +08:00
@murmur 简明
aaniao002
2022-06-28 19:02:37 +08:00
办公室机器就直接加内存,自己家机器就把 linux swap 开几百 g ,至少能跑。
jasondennis12139
2022-06-28 19:27:55 +08:00
NoobStone
2022-06-29 12:27:58 +08:00
没怎么用过 pytorch ,你现在的方式:“换了一种方式是把数据集中到几个大文件中,然后 dataloader 选用顺序读取,这样每次就可以 load 很多到内存里不用频繁 IO ,但是缺点是只能顺序读取”。
感觉我之前的做法你可以参考,不一定行得通。
我用 keras 训练图像模型的时候,是把所有图片都存储到 HDF5 ,存进去之后,open 这个超大的 HDF5 文件,只是打开一个指针不会占用内存,可以按照切片语法来读取数据,感觉用起来特别像一个存储在硬盘的 numpy 矩阵。切片读取的话,索引要保证去重,升序。如果你想随机读取数据,需要自己做下处理。
比如 HDF5 是 arr ,长度 100 ,现在随机读取 6,5,8,9,6 ,那么需要改成 arr[5,6,8,9],然后自己展开。
Richard14
2022-06-30 00:41:41 +08:00
@NoobStone 谢谢大佬,感觉储存在硬盘上的方案的话你这个应该是最好的

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

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

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

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

© 2021 V2EX