在分布式大模型训练中,数据预处理往往是性能瓶颈。本文分享几个实用的加速方法。
1. 数据预加载优化 使用 torch.utils.data.DataLoader 的 num_workers 参数,建议设置为CPU核心数的2-4倍,例如:
loader = DataLoader(dataset, batch_size=64, num_workers=8, pin_memory=True)
同时启用 pin_memory=True 将数据预加载到锁页内存中。
2. 异步数据传输 通过 torch.utils.data.DataLoader 的 prefetch_factor 参数,提前预取数据:
loader = DataLoader(dataset, batch_size=64, num_workers=4, prefetch_factor=2)
这能有效减少GPU等待数据的时间。
3. 缓存策略 对于重复使用的数据集,可使用 torch.utils.data.IterableDataset 结合缓存:
import torch.utils.data as data
class CachedDataset(data.IterableDataset):
def __init__(self, data_path):
self.data = []
# 预加载并缓存数据
for item in load_data(data_path):
self.data.append(item)
def __iter__(self):
return iter(self.data)
4. 数据管道优化 使用 torchdata 库构建高效的数据管道:
from torchdata.datapipes.iter import IterableWrapper
dp = IterableWrapper(range(1000))
# 并行处理数据
processed_dp = dp.map(process_func).batch(32)
可复现步骤:
- 使用
num_workers=8和prefetch_factor=2测试训练速度 - 对比开启/关闭
pin_memory的性能差异 - 评估缓存策略对重复数据访问的加速效果

讨论