分布式训练如何节省内存加载数据集

文章讨论了在分布式训练中内存消耗的问题,提出使用torch.multiprocessing的ddp_spawn策略来避免数据集副本冗余。通过在DataModule的初始化阶段预加载数据并确保代码可序列化,可以有效减少内存占用。

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

问题

对于内存中的数据集,每个进程都将在内存中保存一个(冗余的)数据集副本,内存消耗将随着进程数线性增加。

我们知道,分布式训练数据集加载内存占用和节点数量成正比,每个节点都会加载一份数据集到内存,多个节点就会有多个数据集复制。

解决方法

实际上,torch官方以对此类问题有所解决:

一个简单的防止冗余数据集副本的方法是依靠 torch.multiprocessing 通过共享内存自动在分 spawned 进程之间共享数据。为此,所有数据预加载都应在 DataModule.init() 中在主进程上进行。结果,所有张量数据将在使用“ddp_spawn”策略时自动共享。

class MNISTDataModule(pl.LightningDataModule):
    def __init__(self, data_dir: str):
        self.mnist = MNIST(data_dir, download=True, transform=T.ToTensor())

    def train_loader(self):
        return DataLoader(self.mnist, batch_size=128)


model = Model(...)
datamodule = MNISTDataModule("data/MNIST")

trainer = Trainer(accelerator="gpu", devices=2, strategy="ddp_spawn")
trainer.fit(model, datamodule)

注意

DDP 分叉(ddp_spawn)和 DDP 有以下区别:

  • DDP 分叉使用 .spawn() 来启动训练进程,而常规 DDP 使用 torch.multiprocessing.spawn()。
  • DDP 分叉不能使用 Dataloader(num_workers=N),因为它会导致训练变慢或无法运行。
  • DDP 分叉需要所有代码都能够被序列化(picklable),这可能会导致一些问题。
### DeepSeek 分布式训练与大规模数据处理能力 #### 分布式训练架构设计 DeepSeek采用先进的分布式计算框架来支持多节点、多GPU环境下的高效训练。通过利用蓝耘智算平台的强大硬件资源,实现了参数服务器(Parameter Server, PS)模式以及AllReduce通信机制两种主流的分布式策略[^1]。 对于PS模式而言,在每次迭代过程中,worker会将梯度发送给parameter server更新全局模型参数;而在AllReduce模式下,则是所有workers之间直接交换信息完成同步操作。这种灵活性使得用户可以根据具体应用场景选择最适合自己的方案。 #### 数据并行与模型并行相结合 为了应对超大尺寸神经网络带来的挑战,DeepSeek不仅提供了基于数据分片的数据并行(Data Parallelism),还引入了更细粒度上的切分——即模型并行(Model Parallelism)[^1]。这意味着当单个设备内存不足以容纳整个模型时,可以将其拆分成多个部分分别部署到不同机器上运行,从而突破单一硬件限制。 #### 高效的大规模数据预取与缓存管理 针对海量样本集读取速度慢的问题,DeepSeek内置了一套智能调度算法用于提前加载下一个batch所需的数据片段至本地高速存储器中待命。与此同时,通过对历史访问记录的学习预测未来可能用到哪些文件块,并据此调整优先级顺序以减少I/O等待时间开销。 ```python import deepseek as ds # 初始化DataLoader对象 data_loader = ds.DataLoader( dataset=large_dataset, batch_size=batch_size, num_workers=num_workers, prefetch_factor=prefetch_factor ) for epoch in range(num_epochs): for data_batch in data_loader: # 训练逻辑... ``` #### 自动混合精度加速技术 借助NVIDIA Tensor Cores的优势,DeepSeek实现了自动化的FP16/FP32混合精度运算转换功能。这不仅能有效降低显存占用量,还能加快前向传播过程中的矩阵乘法计算速率,进而缩短整体收敛周期。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值