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

目录

  • 环境
  • 问题
    • 单机多卡时:
      • 超时错误
        • 部分报错内容:
        • 解决方法:
      • 存在没有使用梯度的参数
        • 报错内容:
        • 解决方法:
        • 方法1 找到不参与梯度计算的层**且**没有用处的层,删除
        • 方法2 DistributedDataParallel 增加参数:find_unused_parameters = True
      • DDP 训练时第一个batch有结果第二个训练一直卡住且gpu 利用率100%
        • 解决方法: 参考下面amp 打开调试模式 分析报错的内容,其中一部分是amp相关的问题还有一部分是下面ddp设置的报错
          • 报错内容:
          • 解决方法
    • 用户线程数不够
      • 报错内容
      • 解决方法:
    • amp 训练时
      • 训练损失不像预计下降 ,训练过程中几个epoch之后loss全为NAN
      • 在torch.nn.utils.clip_grad_norm_之前取消缩放
      • 打开调试模式,找到可能有问题的代码

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/26698find_unused_parameters=any(isinstance(layer, nn.MultiheadAttention) for layer in self.models[k].modules()))

参考链接: https://blog.csdn.net/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-placescaler.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455282.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2 两数相加

解题思路: \qquad 这道题可以用模拟很直观的解决,模式加法的计算过程,只不过套了一层链表的外衣。题目给出的数字在链表中是按照逆序排列的,即链表头节点的值代表相加数字的个位,这样只需要从链表头开始计算加法即可得…

系统登录接口文档Demo

接口描述 该接口用于用户登录验证。通过用户名和密码进行身份验证,成功后返回一个用于后续请求的认证 token。这个 token 是访问受保护资源的凭证。 时序图: 登录请求: 登录查询接口: POST {url}/api/user/login 请求体: {"username…

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目,需要到客户那边进行项目部署,项目部署完成后我们需要进行项目后端接口的测试功能,但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

Linux:进程优先级 进程调度切换 调度算法

#1024程序员节|征文# 目录 1.进程优先级 1.1 概念 1.2 为什么有优先级 1.3 Linux进程优先级 2. 概念预备 2.1 并发 2.2 寄存器 主要类型: 2. 进程的调度与切换 3.1 进程调度 3.2 进程切换 4. 调度算法 4.1 runqueue内部结构 4.2 如何调度…

Git使用GUI界面实现任意历史版本对比

首先进入版本历史查看界面 标记某次提交 选择某次提交并和标记的提交对比 可以查看比较结果了,具体到每一个文件每一行代码

一篇文章快速认识 YOLO11 | 目标检测 | 模型训练 | 自定义数据集

本文分享YOLO11的目标检测,主要内容是自定义数据集、数据标注、标签格式转换、模型训练、模型推理等。 目录 1、数据标注 2、Labelme的json转为YOLO的txt 3、配置YOLO11代码工程 4、数据集yaml配置文件 5、YOLO11模型结构配置文件 6、编写训练代码 7、开始训…

Unity 开发学习笔记(0):

文章目录 前言为什么要去学Unity安装国际版Unity总结 前言 我最近打算学习一下Unity。所以打算从零开始做一下相关的学习笔记。 为什么要去学Unity 上位机的上限就这样,没有运动控制和机器视觉,薪资上不去C# 我非常熟练,所以学习Unity成本…

excel判断某一列(A列)中的数据是否在另一列(B列)中

如B列如果有7个元素,在A列右边的空白列中,输入如下公式: COUNTIF($B$1:$B$7,A1), 其中,$B$1:$B$7代表A列中的所有数据即绝对范围,A1代表B列中的一个单元格.

JVM 加载 class 文件的原理机制

JVM 加载 class 文件的原理机制 JVM(Java虚拟机)是一个可以执行Java字节码的虚拟机。它负责执行Java应用程序和应用程序的扩展,如Java库和框架。 文章目录 JVM 加载 class 文件的原理机制1. JVM1.1 类加载器1.2 魔数1.3 元空间 2. 类加载2.1 …

openpnp - 底部相机视觉识别CvPipeLine的参数bug修正

文章目录 openpnp - 底部相机视觉识别的CvPipeLine的参数bug概述笔记openpnp的视觉识别参数的错误原因备注补充 - 如果要直接改默认的底部视觉要注意END openpnp - 底部相机视觉识别的CvPipeLine的参数bug 概述 底部相机抓起一个SOD323的元件,进行视觉识别。 识别…

点餐系统需求分析说明书(软件工程分析报告JAVA)

目录 1 引言 4 1.1 编写目的 4 1.2 项目背景 4 1.3 定义 4 1.4 预期的读者 5 1.5 参考资料 5 2 任务概述 5 2.1 目标 5 2.2 运行环境 5 2.3 条件与限制 6 3 数据描述 6 3.1 静态数据 6 3.2 动态数据 6 3.3 数据库介绍 6 3.4 对象模型 6 3.5 数据采集 7 4 动态模型 7 4.1 脚本 …

《深度学习》 了解YOLO基本知识

目录 一、关于YOLO 1、什么是YOLO 2、经典的检测方法 1)one-stage单阶段检测 模型指标介绍: 2)two-stage多阶段检测 二、关于mAP指标 1、概念 2、IOU 3、关于召回率和准确率 4、示例 5、计算mAP 一、关于YOLO 1、什么是YOLO YOL…

基于泊松洞过程建模的异构蜂窝网络信干比增益与近似覆盖率分析

大家好,我是带我去滑雪! 移动通信业务的高速增长使得传统同构蜂窝网络结构不能满足用户对通信质量的要求,而异 构网络架构可以有效解决这种问题。文中对泊松洞过程下异构蜂窝网络的覆盖率进行研究。首 先,利用泊松洞过程( Poisson…

求助帖:ubuntu22.10 auto install user-data配置了为何还需要选择语言键盘(如何全自动)

0-现象:配置好autoinstll的PXE与user-data文件安装过程仍然要人工选语言、键盘等,非全自动;—— 1.硬件环境:x86_64机器 U盘(/dev/sda); 2.软件环境:DHCPPXE启动做好grub与pxe的aut…

【AI绘画】Midjourney进阶:留白构图详解

博客主页: [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯什么是构图为什么Midjourney要使用构图 💯留白构图特点使用场景提示词书写技巧测试 💯小结 💯前言 【AI绘画】Midjourney进阶&…

Springboot 的手动配置操作讲解

1.创建新项目: 手动创建使用maven 项目 并选择骨架: quickstart 骨架用来搭建spingboot 2.手动输入pom.xml依赖: 要想创建springboot 首先继承springboot 的父类 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo…

算法的学习笔记—两个链表的第一个公共结点(牛客JZ52)

&#x1f600;前言 在链表问题中&#xff0c;寻找两个链表的第一个公共结点是一个经典问题。这个问题的本质是在两个单链表中找到它们的相交点&#xff0c;或者说它们开始共享相同节点的地方。本文将详细讲解这个问题的解题思路&#xff0c;并提供一种高效的解决方法。 &#x…

python 爬虫抓取百度热搜

实现思路&#xff1a; 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…

[手机Linux PostmarketOS]七, Linux使用selenium爬虫

一&#xff0c;selenium安装 # 用pip 安装 selenium pip3 install selenium --break-system-packages 二&#xff0c;安装浏览器Chrome Alpine Linux 环境中没有google Chrome&#xff0c; 使用 Chromium 浏览器作为 Chrome 的替代品&#xff0c;Chromium 是 Chrome 的开源版本…

定时任务使用kafka

定时任务使用kafka 在上述业务场景中使用 Kafka 而不是直接定时执行任务有以下几个重要原因&#xff1a; 一、解耦 任务触发与执行分离&#xff1a; 使用 XXL-JOB 定时触发任务并将任务消息发送到 Kafka&#xff0c;实现了任务触发端&#xff08;通常是调度系统&#xff09;和…