【pytorch DistributedDataParallel 及amp 使用过程遇到的问题记录 】

[E ProcessGroupNCCL.cpp:828] [Rank 3] Watchdog caught collective operation timeout: WorkNCCL... Watchdog caught collective operation timeout 阅读详情
AI摘要

本文记录了pytorch分布式训练及混合精度训练中遇到的问题。单机多卡时存在超时错误、有未使用梯度的参数、DDP训练卡住等问题;还有用户线程数不够、amp训练损失异常等情况,并针对不同问题给出了相应的解决方法。

pytorch 分布式训练及混合精度训练中遇到的问题记录

环境

pytorch==2.3.1

问题

单机多卡时:

超时错误

部分报错内容:

Heartbeat monitor timed out! Process will be terminated after dumping debug info. workMetaList_.size()=2
[rank1]:[E ProcessGroupNCCL.cpp:1153] [PG 0 Rank 1] ProcessGroupNCCL preparing to dump debug info.
[rank1]:[F ProcessGroupNCCL.cpp:1169] [PG 0 Rank 1] [PG 0 Rank 1] ProcessGroupNCCL’s watchdog got stuck for 600 seconds without making progress in monitoring enqueued collectives

报错截图:
在这里插入图片描述

解决方法:

代码中:


dist.init_process_group(backend='nccl', init_method='env://',rank=self.opt.local_rank, world_size=self.opt.world_size,)   

改为:

dist.init_process_group(backend='nccl', init_method='env://',rank=self.opt.local_rank, world_size=self.opt.world_size,  timeout=timedelta(seconds=3600),)

存在没有使用梯度的参数

(不使用ddp时正常,使用ddp时报错)

报错内容:

If you already have done the above, then the distributed data parallel module wasn’t able to locate the output tensors in the return value of your module’s forward function. Please include the loss function and the structure of the return value of forward of your module when reporting this issue (e.g. list, dict, iterable).
[rank0]: Parameter indices which did not receive grad for rank 0: 60 6

解决方法:
方法1 找到不参与梯度计算的层且没有用处的层,删除

注意: nn.MultiheadAttention 层可能不兼容DDP ,但是这个层对模型有用处就不能使用方法1,这时候使用方法二
参考:https://github.com/pytorch/pytorch/issues/26698

方法2 DistributedDataParallel 增加参数:find_unused_parameters = True

注意增加find_unused_parameters =True 可能会影响性能,参考使用这个参数时pytorch的warn 提示

在分布式数据并行(DDP)构造函数中指定了find_unused_parameters=True,但在前向传播过程中没有发现任何未使用的参数。这个标志会导致每次迭代都会额外遍历自动微分图,这可能会对性能产生不利影响。如果你的模型在前向传播中确实没有任何未使用的参数,考虑关闭这个标志。请注意,如果模型的流程控制导致后续迭代中有未使用的参数,这个警告可能是误报。

如:

  DistributedDataParallel(self.model, device_ids=[opt.local_rank], output_device=opt.local_rank,
                              find_unused_parameters=any(isinstance(layer, nn.MultiheadAttention) for layer in self.model.modules()))


DDP 训练时第一个batch有结果第二个训练一直卡住且gpu 利用率100%

解决方法: 参考下面amp 打开调试模式 分析报错的内容,其中一部分是amp相关的问题还有一部分是下面ddp设置的报错
报错内容:

[rank0]: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.cuda.FloatTensor [512]] is at version 3; expected version 2 instead. Hint: the backtrace further above shows the operation that failed to compute its gradient. The variable in question was changed in there or anywhere later. Good luck!

解决方法

增加 broadcast_buffers=False,

DDP(self.models[k], device_ids=[opt.local_rank], output_device=opt.local_rank,broadcast_buffers=False,
                              # nn.MultiheadAttention incompatibility with DDP https://github.com/pytorch/pytorch/issues/26698
                              find_unused_parameters=any(isinstance(layer, nn.MultiheadAttention) for layer in self.models[k].modules()))

参考链接: https://blog.youkuaiyun.com/qq_39237205/article/details/125728708

用户线程数不够

报错内容

BlockingIOError: [Errno 11] Resource temporarily unavailable

解决方法:

# 查看linux 当前用户的线程数
ulimit -u
# 查看linux 当前用户已有的线程数
ps -xH |wc -l
# 查看

方法1 增加给用户分配的线程数

账户的线程数不够,增加用户的线程数

vim /etc/security/limits.d/20-nproc.conf
*          soft    nproc     40960
root       soft    nproc     unlimited

方法2 kill 部分无用的线程

# 查看linux 当前用户已有的线程
ps -xH 
# kill 掉一些无用的线程 如 Service.py 占用了太多的线程,并且现在已经不需要该程序 
ps -xH |grep Service.py | awk '{print $1}' |xargs kill -SIGKILL
# ps -xH |grep Service.py | awk '{print $1}' |sort -u |xargs kill -SIGKILL

amp 训练时

训练损失不像预计下降 ,训练过程中几个epoch之后loss全为NAN

在torch.nn.utils.clip_grad_norm_之前取消缩放

scaler = GradScaler()

for epoch in epochs:
    for input, target in data:
        optimizer.zero_grad()
        with autocast(device_type='cuda', dtype=torch.float16):
            output = model(input)
            loss = loss_fn(output, target)
        scaler.scale(loss).backward()

        # Unscales the gradients of optimizer's assigned params in-place
        scaler.unscale_(optimizer)

        # Since the gradients of optimizer's assigned params are unscaled, clips as usual:
        torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm)

        # optimizer's gradients are already unscaled, so scaler.step does not unscale them,
        # although it still skips optimizer.step() if the gradients contain infs or NaNs.
        scaler.step(optimizer)

        # Updates the scale for next iteration.
        scaler.update()

打开调试模式,找到可能有问题的代码

# 正向传播前
torch.autograd.set_detect_anomaly(True)

#反向传播
with torch.autograd.detect_anomaly():
	# losses["loss"].backward()
	self.scaler.scale(losses["loss"]).backward()

经过调试发现报错内容如下
“BmmBackward0” returned nan values in its oth output
代码位置为 M = torch.matmul(T, R)

原因为相机的内参矩阵之间乘积导致fp16问题

解决方法 在需要fp32精度的操作外面加上:

 with torch.autocast(device_type="cuda",dtype=torch.float32):
 		need_fp32_code
PyTorch多GPU训练避坑指南:从DataParallel到DistributedDataParallel的实战迁移 本文深入探讨了PyTorch多GPU训练的两种主要方案DataParallel和DistributedDataParallel,提供了从简单到复杂的完整迁移路径。通过分析显存分配效率、计算负载均衡和数据通信开销等核心挑战,帮助开发者实现训练模型的速度提升。文章包含实用技巧、性能对比和疑难问题解决方案,是优化GPU训练效率的必备指南。 阅读详情

相关推荐

PyTorch GPU环境配置与性能优化实战指南

GPU加速是深度学习的核心技术,其核心原理在于利用GPU的并行计算架构,将大量相似计算任务(如矩阵乘法、卷积运算)同时处理,相比CPU能实现数十倍甚至上百倍的性能提升。这一技术价值在于极大缩短了模型训练时间,使得处理大规模数据集(如ImageNet)和复杂模型(如Transformer、扩散模型)成为可能,广泛应用于计算机视觉、自然语言处理等领域。在PyTorch生态中,实现GPU加速依赖于CUDA平台,但环境配置常因驱动、CUDA Toolkit、cuDNN版本不匹配而出现各种错误。本文针对“gpu租用”

weixin_34200628的博客 666

[E ProcessGroupNCCL.cpp:737]和[E ProcessGroupNCCL.cpp:414] 解决

禁用P2P通信:通过设置NCCL_P2P_DISABLE=1,你实际上告诉NCCL不要尝试使用直接的GPU-GPU通信,而是使用其他通信方式(例如通过CPU或网络)。理想的情况是深入了解为何P2P通信在你的特定配置中存在问题,并找到一个更根本的解决方案。P2P通信问题:NCCL利用GPU之间的直接通信(如果可用)来加速操作。然而,在某些系统上,这种直接通信可能会有问题,特别是在复杂的多节点或多卡设置中。网络拓扑和硬件兼容性:在不同的硬件和网络配置下,P2P通信的性能和稳定性可能会有很大差异。

shysea2019的博客 2448

PyTorch从入门到实战:核心概念与高效学习路径

深度学习框架PyTorch以其动态计算图和易用性成为研究与实践的主流选择。其核心Tensor数据结构支持GPU加速与自动微分,通过计算图机制实现反向传播。在工程实践中,PyTorch的模块化设计(如nn.Module)和丰富的工具链(如TorchScript)显著提升开发效率。针对计算机视觉和时序预测等典型场景,合理运用数据增强、分布式训练和混合精度等技术可优化模型性能。本文基于CUDA环境配置、Tensor操作、模型定义范式等基础概念,深入解析自动微分原理和训练循环优化技巧,特别涵盖LSTM时序预测等实战

weixin_30299709的博客 390

【多卡训练错误】error indicates that your module has parameters that were not used in producing loss

RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss. You can enable unused parameter detection by passing the keyword

qq_43672756的博客 5871

PyTorch GPU环境配置全攻略:从驱动到多卡并行训练

在深度学习实践中,GPU加速是提升模型训练效率的核心技术。其原理在于利用GPU的并行计算架构,通过CUDA平台和cuDNN加速库,将计算密集型任务从CPU卸载到GPU上执行,从而大幅缩短训练时间。这项技术的价值在于,它使得复杂神经网络的训练从数周缩短到数天甚至数小时,成为人工智能落地的关键支撑。在应用场景上,无论是计算机视觉、自然语言处理还是科学计算,GPU加速都不可或缺。本文聚焦于PyTorch框架下的GPU环境配置,详细解析了NVIDIA驱动、CUDA工具包、cuDNN库与PyTorch版本之间的兼容性

weixin_34364071的博客 358

PyTorch深度学习框架核心特性与工程实践详解

深度学习框架作为现代人工智能开发的基础工具,其核心在于高效实现神经网络的计算与优化。PyTorch凭借动态计算图机制实现了'定义即运行'的编程范式,这种设计不仅支持实时调试和灵活控制流,还与Python生态无缝集成。在工程实践中,PyTorch通过GPU加速张量计算和自动微分系统显著提升了模型训练效率,广泛应用于计算机视觉、自然语言处理等领域。特别是其动态图特性在Transformer等复杂模型开发中展现出独特优势,配合分布式训练和混合精度技术可进一步优化大规模模型训练。本文通过具体代码示例剖析PyTorc

weixin_33698823的博客 407

PyTorch GPU加速实战:从环境配置到性能优化的完整指南

在深度学习领域,GPU加速已成为处理海量矩阵运算的核心技术。其原理基于GPU的并行计算架构,通过数千个计算核心同时处理张量操作,相比CPU串行计算可实现数十至上百倍的性能提升。这一技术价值在于极大缩短了模型训练时间,使研究者能在有限资源下尝试更复杂的网络结构和更大的数据集。应用场景涵盖计算机视觉、自然语言处理等所有需要大规模数值计算的领域。本文聚焦PyTorch框架下的GPU实战,详细解析环境部署中的CUDA版本匹配与驱动安装要点,并深入探讨混合精度训练与梯度累积等关键优化技术,帮助开发者充分发挥硬件潜力。

weixin_34268310的博客 333

PyTorch Wrapper:轻量封装实现可复现、可扩展的模型训练

在深度学习工程实践中,PyTorch 原生训练循环虽灵活却重复冗余,导致可复现性差、迭代效率低。其核心原理在于解耦模型定义与训练基础设施——通过轻量级封装统一管理设备调度、混合精度(AMP)、梯度裁剪、分布式训练(DDP)及钩子机制,既保留 nn.Module 的完全控制权,又提供类似 Keras 的声明式体验。该方案显著提升实验可维护性与跨团队协作效率,适用于医疗影像分割、工业质检等需快速验证模型变体的生产场景;尤其适合从 TensorFlow 转型的工程师、算法研究者及技术负责人构建标准化训练基座。

diche7031的博客 399

Pytorch多GPU笔记

pytorch多GPU并行化训练笔记

xiaobai111112的博客 988

PyTorch中forward()函数的调用时机与执行机制详解

在PyTorch中,forward()是nn.Module前向计算的核心入口,其调用并非显式函数调用,而是由模块的__call__方法隐式触发,并深度耦合于动态计算图构建、autograd梯度追踪及训练/推理模式切换。理解其原理,有助于规避梯度丢失、NaN loss、分布式同步异常等高频问题;技术价值体现在模型可调试性、混合精度兼容性与图优化可行性上;典型应用场景包括自定义模块开发、模型剪枝量化、DDP分布式训练及TorchScript部署。本文聚焦forward()被谁调、何时调、在何种上下文下调——直击

weixin_29061531的博客 146

torchrun在验证集使用一个GPU时报NCCL超时:Watchdog caught collective operation timeout的解决方案

有时候在分布式训练时,可能会出现nccl通信超时的问题,出现的原因好像是在某些数据处理、加载等过程,多个进程一起完成,但是某些计算(比如loss具体不知道都有啥)需要rank0自己来做,但是由于默认的30分钟没算完,没完成不同rank之间的正常通信,导致报错。增加超时时间:你可以尝试增加NCCL操作的超时时间。在PyTorch中,你可以通过设置。

拥抱具身智能,昇腾Ascend C 1万+

PyTorch 2.x 时代再看 Apex:混合精度与融合算子的工程价值解析

在大模型训练与推理加速的实践中,混合精度(AMP)与融合算子(Fused Kernel)是提升 GPU 利用率的关键技术。无论是 PyTorch 的原生 AMP 还是 NVIDIA 开源的 Apex 库,其底层都依赖对 CUDA 计算特性的深刻理解——通过减少 kernel 启动次数、优化内存访问模式,在保证数值精度的同时最大化 Tensor Core 算力。掌握这些机制,不仅有助于排查训练中的精度与性能问题,也能为自定义高性能算子提供设计参考。从自动混合精度到 FusedAdam、多张量并行处理,这些工程

weixin_34280237的博客 325

解决 NCCL 通信超时问题:NCCL_BLOCKING_WAIT 的使用与优化

使用是解决 NCCL 超时问题的一个有效方法,它让分布式训练过程中的通信操作更加稳定,尤其是在网络条件不理想或通信数据量较大的情况下。尽管这并不能直接提高通信性能,但它有效地避免了超时导致的训练中断问题。如果在分布式训练中遇到类似的通信超时问题,可以尝试开启阻塞等待模式,并结合其他优化措施,来提高训练的整体稳定性和效率。

q742971636的博客 4245

pytorch自带网络_Pytorch + Apex 训练流程记录

最近尝试用Pytorch的分布式训练API进行一系列实验,踩了不少坑,也看了很多资料。在这里简单做一下总结。内容包括有:Pytorch自带的分布式训练API,以及Nvidia的apex附带的API,最后再额外写一下Nvidia的DALI数据读取与处理加速的方法。文末是一些查看后觉得有用的链接,可以先看看里面的内容,本文只是对其做一些补充。在一些大的视觉任务例如语义分割和目标检测中由于数据IO不是瓶...

weixin_39580749的博客 696

PyTorch多GPU训练:DDP实战指南与DataParallel弃用原因

分布式训练是深度学习规模化落地的核心技术,其本质是通过数据并行、模型并行或流水并行,突破单卡显存与计算吞吐瓶颈。原理上,它依赖进程间通信(如AllReduce)同步梯度,关键技术价值在于线性扩展训练速度、均衡显存占用、提升硬件利用率。典型应用场景包括大模型微调、图像分类加速、NLP预训练等。然而,错误选择并行策略(如沿用已废弃的DataParallel)将导致PCIe带宽瓶颈、主卡过载、GPU利用率低下等问题。本文聚焦PyTorch原生分布式训练核心——DistributedDataParallel(DDP

weixin_33851177的博客 364

Frigate进阶玩法:如何用MQTT和Python脚本扩展你的自定义目标检测算法

本文详细介绍了如何通过MQTT和Python脚本扩展Frigate的自定义目标检测算法,无需修改源码即可实现特殊场景(如工业设备异常、农业病虫害识别)的高效检测。文章涵盖Frigate配置、外部检测服务构建、高级集成技巧及性能优化实践,帮助开发者灵活扩展智能监控能力。

weixin_42662293的博客 348

PyTorch工程化实践:从动态图到分布式部署的完整指南

深度学习框架作为现代人工智能应用的核心基础设施,其设计原理直接影响着模型开发与部署的效率。PyTorch以其动态计算图机制著称,为研究和原型开发提供了极大的灵活性。在工程实践中,动态图需要转换为静态图以获得更高的推理性能和跨平台部署能力,这涉及到TorchScript和JIT编译技术。同时,随着模型规模的增长,分布式训练成为处理海量数据和参数的必备方案,DistributedDataParallel通过多进程和梯度桶优化实现了高效的并行计算。这些技术共同支撑了从实验到生产的完整链路,帮助开发者构建健壮、可扩

weixin_33912246的博客 358

FIFO应用于UART串口(含代码)

FIFO(First in first out)即先入先出,可以把它理解成一个缓存器,对于收发两端速度不一致,位宽不一致的情况可以使用FIFO作为收发两端中间的“调节剂”使数据可以进行正常发送。

m0_58544042的博客 2749

告别Apex!用PyTorch Lightning轻松搞定半精度训练与多卡同步(附避坑指南)

本文详细介绍了如何使用PyTorch Lightning简化分布式训练与混合精度优化,替代复杂的Apex配置。通过LightningModule和Trainer等核心组件,开发者可以轻松实现多卡同步、混合精度训练及模型检查点管理,显著提升训练效率并降低代码复杂度。

weixin_30629653的博客 447

基于Python批量获取过去某地某时的天气数据

此段代码为经Visual Weather API官网样例后修改。原代码返回数据格式为json,经测试json风速字段不可用,后改为返回数据格式为csv。若修改weather_api_endpoint,还可获取该地点的预测数据,但返回数据字段可能发生变化,请以官网文档为准。获取到的字段包括:平均温度、露点、湿度、风速、降雨量、能见度、云量、天气类型等。目的:已知某一地址,获取过去某一时间该地的天气数据,并能够批量运行。这一步也会有获取不到的时间和地点,因此为空白。此段代码为经百度地图api官网样例后修改。

wiseman1233的博客 904

小白投资理财 - 解读威廉分形指标 Williams Fractals

威廉分形指标用于识别价格趋势中的关键点,帮助判断支撑位和阻力位。

wumingxiaoyao的博客 4334

PyTorch分布式训练踩坑实录:RuntimeError变量重复标记问题排查指南

本文深入剖析了PyTorch分布式训练中常见的RuntimeError变量重复标记问题。通过分析DistributedDataParallel机制,提供了从启用TORCH_DISTRIBUTED_DEBUG深度调试、静态代码审查到应用_set_static_graph工作区的系统性排查指南,帮助开发者从根本上解决这一复杂错误。

jump7的博客 666

uniapp - 微信支付报错 requestPayment:fail:HBuilder mainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,微信支付,报错,errMsg,requestPayment:fail:HBuildermainifest.json中配置的支付appid和生成订单使用的appid不一致,如果是HB调试请在线打包,http://ask.dcloud.net.cn/article/282,已经都检查了还是报错,如何解决这个问题,还是不行,错误,苹果微信支付报错,安卓app微信支付出错,打包,在线打包也不行,本地打包,支

🏆 前端领域优质创作者 3500
上一篇: 在kaggle或colab中的notebook 如何自定义 cuda 版本以及使用自定义的conda/python版本运行项目(二)
下一篇: 1700X 升级 5600 性能对比记录
Magicapprentice
博客等级 码龄12年 111粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值