在 pytorch 中在非常大的稀疏矩阵上训练神经网络

Training neural networks on very large sparse matrices in pytorch

提问人:dentist_inedible 提问时间:10/27/2023 更新时间:10/28/2023 访问量:39

问:

我有一个数据集,大约有 7400 万个观测值。这些观测值中的每一个都由 ~1,000 个特征表示,并用多达 ~3,200 个二进制类进行标记。大多数单个观测值的标记不超过 ~10 个类,因此标签非常稀疏。目前,标签和特征矩阵以 MatrixMarket 格式存储。

我想在 74m * 1000 输入矩阵上训练一个神经网络来预测 74m * 3200 标签。但是,这显然不适合内存。这是我第一次使用这么大的数据集。到目前为止,我可以看到的选项包括:

  • 将每组特征和标签分别写入文本文件,并从文件列表中随机抽取每个小批量中的项目(似乎效率低下)
  • 使用 pandas 逐块遍历单个 CSV 文件
  • 我也看到了 zarr、WebDataset 和 TensorStore 的讨论,但我无法判断它们是否适合这个问题

对于没有太多经验使用不适合内存的数据集的人来说,解决此问题的最佳方法有什么建议吗?

python pytorch 稀疏矩阵 大数据

评论

0赞 dungxibo123 10/27/2023
你有没有尝试过小批量训练过程。一种众所周知的方法,通常用于工业和研究中的大型数据集
0赞 dentist_inedible 10/27/2023
我的问题是关于如何将这个数据集的小批量加载到内存中。
0赞 dungxibo123 10/27/2023
啊,你的第二种方法可能会奏效。但有一个小小的建议,你还需要编写一个类似的类,比如 ImageFolder 更具体地说,你需要创建一个 DataLoader。在每批中,此加载器将从您的文件中读取数据并将数据保存到内存中,当所有操作完成后,加载器会将另一个批处理加载到RAM上分配的相同内存中。那可能会起作用
0赞 OM222O 10/27/2023
您可以在 Pytorch 中编写自己的批处理加载程序。我不确定输入是如何存储的......是一个大文件还是一大堆小文件?如果它是一个大文件,你可以使用 memmap() 来内存映射输入并一次读取 N GB,训练该数据,然后获取接下来的 N GB。只要训练花费的时间长于加载 N GB 的时间,就可以在给定时间加载两个或多个块(称为预提取或双缓冲)。然后,可以将一个块传递给模型,以便在加载下一个块时进行训练

答:

1赞 Karl 10/28/2023 #1

若要处理数据集大小,请使用不需要加载到内存中的库(如数据集)。

如果要更进一步,可以将数据从密集转换为稀疏,其中仅跟踪当前类的 ID。

例如,会变成[0, 0, 1, 0, 0, 0, 0, 0, 1, 0][2, 8]