引言
在深度学习的训练过程中,数据加载是一个关键步骤,它直接影响到模型训练的效率。为了提高运行速度,我们通常会采用多种方法,比如数据预处理、多线程加载、缓存策略等。然而,有一个经常被忽视的优化点——调整torch.utils.data.DataLoader中的参数,这可以在某些情况下带来高达10倍的速度提升
2 方法
(1)persistent_workers=True的魔力
DataLoader的一个关键参数是persistent_workers。当设置为True时,DataLoader会在多个DataLoader实例之间重用工作进程,以减少初始化的时间。这意味着,如果你在训练过程中使用了多个DataLoader(例如,一个用于训练,一个用于验证),开启persistent_workers可以显著减少每个DataLoader初始化时的开销,从而提高整体的运行速度
(2)调试num_workers以找到最佳设置
num_workers参数决定了有多少个子进程被用来加载数据。增加num_workers可以利用多核处理器的优势,但过多的进程可能会导致进程间的通信开销增大。因此,调试num_workers的数量是提高速度的关键。并不是线程数量越多越快,选择合适的线程数量能提高一些速度
。根据经验,num_workers的设置值可以是CPU核心数的一半,如果CPU很强、RAM也很充足,就可以设置得更大些
(3)使用pin_memory
如果你的设备支持CUDA,设置pin_memory=True可以提高数据传输速度
from torch.utils.data import DataLoaderdef worker_init_fn(worker_id):# 确保每个 worker 的随机种子一致random.seed(2024 + worker_id)np.random.seed(2024 + worker_id)
train_loader[i] = DataLoader(train_dataset,batch_size=batch_size,shuffle=True,num_workers=1,worker_init_fn=worker_init_fn,persistent_workers=True,pin_memory=True)