Pytorch 加速读取数据之 prefetch_factor

博客分享了提高GPU训练效率的两种方法。一是利用NVIDIA DALI模块加速数据预处理,通过并行处理减少训练延迟。二是升级PyTorch到1.7以上版本,利用新增的`prefetch_factor`参数,预先加载更多批次的数据,显著缩短数据读取时间,提高显卡利用率。作者实测将加载时间从3s降至0.5s,效果明显。

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

最近使用四卡训练图片,发现总有卡的效率突变到0,大致就是在读取以及处理数据了
怎么能加速读取呢?一个方法是用NVIDIA的DALI模块,可以加速,具体可以参考 英伟达DALI加速技巧:让数据预处理速度比原生PyTorch快4倍
主要就是通过并行训练和预处理过程,减少了延迟及训练时间
在这里插入图片描述

但是今天我发现一个更简单的方法
就是升级pytorch到1.7以上,目前是1.8.1,最好的1.8.1吧
为什么会这么说呢,因为在dataloader中加入了一个参数 prefetch_factor,这个就是提前加载多少个batch的数据,具体更改看github ,具体说如下,现在默认prefetch_factor =2 ,就是意味着预先加载 prefetch 2 * num_workers 个data

fix #40604
Add parameter to Dataloader to configure the per-worker prefetch number.
Before this edit, the prefetch process always prefetch 2 * num_workers data items, this commit help us make this configurable, e.x. you can specify to prefetch 10 * num_workers data items

我在我这里试了一下,升级以后,有从3s到0.5s,速度还是很明显的,而且显卡利用率都上来了。大家可以自己试试~

### PyTorch DataLoader 中 `utils` 的意义 在 PyTorch 框架内,`torch.utils.data.DataLoader` 是用于高效加载数据的核心组件之一。其中的 `utils` 主要指的是辅助工具模块,这些工具旨在简化并优化数据处理流程。 #### 辅助功能解析 - **数据预取 (`prefetch_factor`)** 数据预取机制允许在多线程环境下提前准备下一个批次的数据,从而减少等待时间,提高训练效率[^4]。 - **多进程加载 (`num_workers`)** 设置此参数可启用多个子进程来并发读取数据,显著加快 I/O 密集型操作的速度。对于大规模数据集尤其有用[^3]。 - **批量化 (`collate_fn`)** 自定义函数用来控制如何将单个样本组合成一批次。这对于处理变长序列或其他复杂结构化输入非常重要。 - **采样策略 (`sampler`)** 定义了从整个数据集中抽取特定子集的方式,支持随机抽样、加权抽样等多种模式[^5]。 通过集成上述特性,`utils` 提供了一套完整的解决方案,使得开发者能够灵活配置适合具体应用场景的数据流管道。 ```python from torch.utils.data import DataLoader, Dataset class CustomDataset(Dataset): def __init__(self, data, labels): self.data = data self.labels = labels def __len__(self): return len(self.data) def __getitem__(self, idx): sample = {'data': self.data[idx], 'label': self.labels[idx]} return sample dataset = CustomDataset(data=[1, 2, 3, 4], labels=['a', 'b', 'c', 'd']) dataloader = DataLoader( dataset, batch_size=2, shuffle=True, num_workers=0, # 单线程示例 prefetch_factor=2, collate_fn=lambda x: {key: [d[key] for d in x] for key in x[0]} # 批量处理逻辑 ) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值