pytorch 加载大数据集 内存不够 的处理方式

当使用PyTorch训练8GB大小的纯文本语言模型时,单个二进制文件导致内存溢出。通过分析,发现需要500GB内存才能满足8卡训练。为解决此问题,采用生成器结合getitem方法,实现边生成边训练,降低内存占用。更新:使用生成器后,多线程数据加载可能降低效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章用于记录一下本人对于较大数据集加载的问题的一些解决办法和思考。(比较口水话)

本文解决的问题适用领域:

  1. 数据集很大,无法一次加载到内存
  2. 纯文本类型的数据

我之前训练某个特定任务,习惯于把数据提前预处理为dataset保存起来【参见这里】,然后每次训练的时候直接加载这个文件。我这样做的目的是,方便调代码,使用很小量的数据先把代码调通,当出现一些小问题时不至于数据处理很久。

但是最近在使用自己的一些语料微调一个语言模型, 语料纯文本大小大概在8G左右,使用预处理脚本CPU满速处理后使用torch.save()保存成二进制文件,大概也8G左右。

这个时候问题来了,我使用了8张卡跑代码,这样的话就是8个进程,每个进程都要torch.load()加载这个二进制文件,256G的内存直接爆掉了,留下我一脸懵逼。

好,遇到了问题,开始动手解决。

内存不足?那多少够用呢?我先使用python窗口,单进程加载了这个文件,内存使用了60+G,算下来的话8卡是要500G的内存起步,不太现实,那么就从代码和数据的角度来解决吧。

使用原代码的处理方法?他处理后的存储sample应该也会占用60G内存,并且前期特别耗时,大概要四五小时,一旦发现后边的代码出了问题,相当于白处理了。

然后百度查相关的文档,看看有没有大佬解决这个问题。

有人说把数据分成若干份,每加载一个文件train起来,但是作者说这样做,内存依然会一直上升。有人说分块读取,但是这么大的数据量一直放在内存里,占用应该和前边一样也是特别大的,不一定够。

想来想去还是按照torch提供的dataset来处理,其实这是使用最广泛的方法,在getitem方法里写上处理逻辑就行了,返回相应的一条数据(sample)。但是现在的问题是,我读取了10行纯文本,每一行可能都会处理成若干条sa

### 使用 PyTorch 处理规模数据集的最佳实践 在处理规模数据集时,PyTorch 提供了许多工具和最佳实践来优化性能和内存管理。以下是几个关键方法: #### 数据加载器 (DataLoader) `torch.utils.data.DataLoader` 是一个高效的模块,能够批量读取数据并支持多线程操作。通过设置 `num_workers` 参数可以利用多个 CPU 核心进行数据预处理,从而显著提升效率[^1]。 ```python from torch.utils.data import DataLoader, Dataset class CustomDataset(Dataset): def __init__(self, data_path): self.data = [...] # 加载数据 def __len__(self): return len(self.data) def __getitem__(self, idx): sample = self.data[idx] return sample dataset = CustomDataset(data_path="path/to/data") dataloader = DataLoader(dataset, batch_size=64, shuffle=True, num_workers=4) ``` #### GPU 的高效使用 为了充分利用 GPU 资源,在模型训练过程中应尽可能减少主机到设备的数据传输开销。可以通过将整个数据集预先加载到 GPU 上(如果显存允许),或者仅在每次迭代前将批次数据移动到 GPU 来提高速度。 ```python device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device) for inputs, labels in dataloader: inputs, labels = inputs.to(device), labels.to(device) outputs = model(inputs) ``` #### 存储与缓存技术 对于非常的文件型数据集,建议采用分块存储策略或将常用部分保存为二进制格式 (.pt 或 .pth),这样可以在后续访问时更快地恢复状态[^3]。 ```bash # 命令行克隆项目仓库作为示例 git clone https://github.com/example/pytorch-video-dataset.git ``` 此外,当遇到无法一次性全部加载内存的情况时,可考虑实现自定义的 Iterable-style dataset 类型以按需动态生成样本实例[^2]。 ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值