DDP下同一模型两次前向传播报错,求解决梯度计算原地操作问题
问题描述
在DDP环境下尝试用同一个判别器模型对两个不同输入执行前向传播,代码如下:
for epoch in range(num_epochs): dataloader.sampler.set_epoch(epoch) for batch_index, (real,_) in enumerate(dataloader): disc.zero_grad() real=real.to(rank) noise=torch.randn((batch_size,z_dim,1,1)).to(rank) fake_img=gen(noise) fake_img_clone=fake_img.detach().clone() disc_real=disc(real).reshape(-1) lossD_real=critereon(disc_real,torch.ones_like(disc_real)) disc_fake=disc(fake_img.detach()).reshape(-1) lossD_fake=critereon(disc_fake,torch.zeros_like(disc_fake)) lossD = (lossD_fake+lossD_real)/2 opt_disc.step()
持续收到错误提示:one of the variables needed for gradient computation has been modified by an inplace operation。设置torch.autograd.set_detect_anomaly(True, check_nan=True)后显示错误出现在disc_real=disc(real).reshape(-1)行,但手动调试发现仅添加第二次前向传播行disc_fake=disc(fake_img.detach()).reshape(-1)时才会触发错误,使用最新版本PyTorch。
解决方案
1. 排查判别器内的原地操作
错误核心是第一次前向传播的梯度依赖参数,在第二次前向传播时被原地修改。重点检查判别器disc的代码:
- 找出所有
x += y、x *= y、x.zero_()、x.fill_()这类原地操作,比如自定义激活层、归一化层里的参数原地更新。 - 将原地操作替换为非原地版本,比如把
x += 1改成x = x + 1,bn.weight.fill_(1)改成bn.weight = torch.ones_like(bn.weight)。
2. 隔离两次前向传播的梯度计算
DDP下分布式参数同步可能和梯度计算流程冲突,调整代码逻辑确保两次前向传播的梯度计算完全隔离:
for epoch in range(num_epochs): dataloader.sampler.set_epoch(epoch) for batch_index, (real,_) in enumerate(dataloader): real=real.to(rank) noise=torch.randn((batch_size,z_dim,1,1)).to(rank) fake_img=gen(noise) # 先计算fake的损失 disc.zero_grad() with torch.no_grad(): fake_detached = fake_img.detach() disc_fake=disc(fake_detached).reshape(-1) lossD_fake=critereon(disc_fake,torch.zeros_like(disc_fake)) # 单独计算real的损失,重新清零梯度 disc.zero_grad() disc_real=disc(real).reshape(-1) lossD_real=critereon(disc_real,torch.ones_like(disc_real)) # 合并损失并更新 lossD = (lossD_fake+lossD_real)/2 lossD.backward() opt_disc.step()
3. 确认DDP模型初始化正确性
确保判别器是用DDP正确包裹的,避免手动修改模型参数状态:
disc = DDP(disc, device_ids=[rank], output_device=rank)
不要直接对disc.module的参数做原地修改操作。
4. 关闭自动混合精度(若开启)
如果开启了torch.cuda.amp,混合精度下的隐性原地操作可能触发该错误,尝试关闭混合精度测试,或确保所有操作通过GradScaler正确处理。
内容的提问来源于stack exchange,提问作者Ashwin Kumar
相关产品推荐
相关产品推荐

