训练模型时梯度出现NAN或者INF(禁用amp的不同level)
判断参数梯度位nan或inf的代码:
for name, param in model.named_parameters():if param.grad is not None:if torch.isnan(param.grad).any() or torch.isinf(param.grad).any():print(f"grad layer [{name}] is NaN or Inf")
首先来说可能得原因:
1. 模型中存在未初始化或未更新的参数(层)
2. 除以0或者log引起
3.输入数据存在你nan或者inf
4. 学习率过大造成梯度不稳定
5.数据类型问题
这里着重讲下第5点。
我的错误是前1-2个epoch的grad norm出现 nan, 后面又稳定了,偶尔又会出现inf,有点随机。
可参考类似的情况和回答:
After several iterations gradient norm and loss becomes nan · Issue #287 · microsoft/Swin-Transformer · GitHub
Got a nan loss and gradient norm when training swin-l on imagenet22k with O1 · Issue #82 · microsoft/Swin-Transformer · GitHub
因为debug了发现都不是1,2,3,4的问题所以最后调试问题出在数据类型上。
PyTorch 的 AMP(自动混合精度) 默认支持动态切换精度。它会在前向和后向传播中自动判断是否切换为 float16 精度,以节省显存并加速计算。在使用 AMP 时,通常采用以下几种机制来选择精度:
-
按操作动态调整精度:AMP 会根据具体操作的数值稳定性来选择
float32或float16,对于稳定性较好的操作(如矩阵乘法)使用float16,对精度要求较高的操作(如归一化)则保留float32。 -
GradScaler动态调整梯度缩放:AMP 默认使用GradScaler对梯度进行缩放,以避免因float16造成的数值下溢(过小梯度被舍去)。
这种自动化过程旨在最大程度保持数值稳定性,并降低显存需求。只需使用 torch.cuda.amp.autocast 上下文管理器和 GradScaler,AMP 就能完成动态精度切换
回到我的错误中来,若主函数里面有两个参数:
parser.add_argument('--disable_amp', action='store_true', help='Disable pytorch amp')
parser.add_argument('--amp-opt-level', type=str, choices=['O0', 'O1', 'O2'],help='mixed precision opt level, if O0, no amp is used (deprecated!)')
解决方案
1. 禁用自动混合精度(AMP): 如果你不依赖于 bfloat16 的性能优化,可以选择禁用 AMP。你可以在你的主函数中设置 --disable_amp 参数,或者在代码中直接注释掉与 GradScaler 和 autocast 相关的代码。这将避免因 bfloat16 引起的问题。
. --disable_amp
- 类型: 布尔型(
action='store_true') - 功能: 如果指定了这个参数,将会禁用 PyTorch 的自动混合精度功能。在训练过程中,这意味着模型将会使用全精度(通常是
float32)进行计算,而不使用混合精度。 - 适用场景: 在调试或遇到精度问题时,可以选择禁用 AMP。
2. 使用 bfloat16:
需要设置这3处
[1]
model = model.to(torch.bfloat16)[2]
samples = samples.to(torch.bfloat16)
targets = targets.to(torch.bfloat16)[3]
with torch.cuda.amp.autocast(dtype=torch.bfloat16): outputs = model(samples)
在 PyTorch 中,使用 torch.bfloat16 时,可能会遇到与 torch.cuda.amp(自动混合精度)相关的问题,特别是关于梯度不稳定性和 unscale 操作的支持。
3. --amp-opt-level(推荐使用):参数用于指定自动混合精度(AMP)的优化级别。而不是
主要有以下几种可选的优化级别:
-
O0:
- 含义: 不使用混合精度,所有计算都在全精度(
float32)下进行。 - 适用场景: 当模型需要最高的数值精度或在调试时。
- 含义: 不使用混合精度,所有计算都在全精度(
-
O1:
- 含义: 使用混合精度,但在关键操作中保持全精度(例如,反向传播)。大多数操作在
float16下进行,只有在必要时(例如,loss 计算)切换回float32。 - 适用场景: 在保证较高性能的同时,尽量减少数值不稳定性,适合大多数场景。
- 含义: 使用混合精度,但在关键操作中保持全精度(例如,反向传播)。大多数操作在
-
O2:
- 含义: 尽可能多地使用
float16,仅在少数操作中使用float32。几乎所有的计算都是在float16下进行,可能会导致数值稳定性的问题。 - 适用场景: 性能优先的情况下使用,但需确保模型能够在
float16下稳定运行。
- 含义: 尽可能多地使用
-
O3:
- 含义: 强制所有操作都使用
float16,可能会导致更高的计算性能,但也可能引入更多的数值不稳定性。 - 适用场景: 仅适用于对性能要求极高且能够处理数值不稳定性的模型。
- 含义: 强制所有操作都使用
选择建议
- O1: 通常是最推荐的选项,适合大多数任务。
- O0: 如果遇到数值不稳定性或调试问题,可以选择。
- O2 和 O3: 适合在确保模型稳定性的前提下追求性能的高级用户。
相关文章:
训练模型时梯度出现NAN或者INF(禁用amp的不同level)
判断参数梯度位nan或inf的代码: for name, param in model.named_parameters():if param.grad is not None:if torch.isnan(param.grad).any() or torch.isinf(param.grad).any():print(f"grad layer [{name}] is NaN or Inf") 首先来说可能得原因&…...
Maven核心概念
一、项目对象模型(POM) 1. 定义 POM(Project Object Model)是 Maven 项目的核心配置文件,它以 XML 格式描述了项目的基本信息、项目依赖、构建配置等。可以说,POM 是 Maven 理解和处理项目的基础。 2. 基…...
Sonatype Nexus 部署手册
文章目录 一、前言二、软件环境2.1 版本变更:2.1.1 变更存储的原因2.2.2 H2作为存储的注意点 三、资源配置四、开始部署4.1 部署jdk174.2 离线部署nexus4.2.1 下载4.2.2 部署1. 上传到服务器2. 解压3. 添加用户4. 修改启动参数5. 迁移sonatype-work ,并授…...
TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风
TLV320AIC3104 是一款低功耗立体声音频编解码器,具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制,可实现立体声 48kHz DAC 回放,在 3.3V 模拟电源电压下的功耗低至 14mW࿰…...
(8)结构体、共用体和枚举类型数据
1. 结构体、共用体的定义及区别,typedef 定义别名 结构体的定义 结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起。例如,定义一个表示学生信息的结构体: // 定义结构体类型 struct Student struct Student {char name[20];int age;float score; };共…...
Jedis操作和springboot整合redis
Jedis-springboot整合redis Jedis 引入jedis依赖 注意事项 测试相关数据类型 Key String List set hash zset 案例 spring boot整合redis 引入相关依赖 在application.properties中配置redis 配置 创建redis配置类 创建测试类 Jedis 引入jedis依赖 <depen…...
基于AI大模型的复杂扫描件PDF信息提取与规整
前言 场景大致是会上传一个几十页的扫描件PDF,让AI在当中找出我需要的字段,本文会隐去具体行业信息和具体的AI提示词内容,只分享技术相关内容,请见谅。 AI模型选择 针对我们行业的使用场景,我主要测试了GPT、Claude以…...
为什么https先非对称加密,然后对称加密?
HTTPS之所以先使用非对称加密,然后在对称加密,主要是基于两者在加密效率与安全性方面的特性考虑。 首先,非对称加密具有极高的安全性,因为它使用了公钥和私钥这一对密钥。公钥是公开的,任何人都可以使用它来加密数据&…...
【Coroutines】Full Understanding of Kotlinx.Corutines Framework
文章目录 What is CorutinesDifference between Corutine and ThreadFast UsageSuspend FunctionAdvanced Usage of CoroutineCoroutine EssentialsCoroutineContextCoroutineScopePredefined CoroutineScopePredefined DispatchersPredefined CoroutineStartJobCreate a Corou…...
Python面向对象,实现图片处理案例,支持:高斯模糊、Canny边缘检测、反转边缘图像、生成手绘效果、调亮度......等等
实验图片如下: 命名为img1.jpg, 放在项目下新建文件夹images下 项目构造如下: app.py源码如下 import cv2 import os from matplotlib import pyplot as plt import numpy as npclass ImageProcessor:def __init__(self, image_path):self.image cv…...
SOLID - 依赖倒置原则(Dependency Inversion Principle)
SOLID - 依赖倒置原则(Dependency Inversion Principle) 定义 依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计中的五大基本原则之一,通常缩写为SOLID中的D。DIP由Robert C. Martin提出&…...
【.NET 8 实战--孢子记账--从单体到微服务】--需求拆分与规划
在上一篇文章中我们收集了需求,并对需求进行了简单的分析和规划,但是对于开发人员来说,上一篇文章的需求还不够详细,并且没有形成计划。因此本篇文章将带领大家来拆分需求并规划开发里程碑。 一、详细需求列表 项目组进行了多次…...
在macOS的多任务处理环境中,如何平衡应用的性能与用户体验?这是否是一个复杂的优化问题?如何优化用户体验|多任务处理|用户体验|应用设计
目录 一 多任务处理与应用性能 1. macOS中的多任务处理机制 2. 性能优化的基本策略 二 用户体验的关键要素 1. 响应速度 2. 界面友好性 3. 功能的直观性 三 平衡性能与用户体验的策略 1. 资源管理 2. 优化数据加载 3. 使用合适的线程模型 4. 实时监测和调整 四 使…...
Vscode配置CC++编程环境的使用体验优化和补充说明
文章目录 快速编译运行👺code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)😊使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…...
十个方法杜绝CAD图纸泄密风险!2024年图纸防泄密指南!「必看」
随着信息技术的发展,CAD图纸的应用日益普遍,然而随之而来的图纸泄密风险也愈加严重。企业在提升效率的同时,更需重视信息安全。为此,本文将介绍十个有效的方法,帮助企业杜绝CAD图纸泄密风险,保障商业机密。…...
技术干货|HyperMesh CFD功能详解:虚拟风洞 Part 1
虚拟风洞VWT 从2023版本开始,虚拟风洞VWT(Virtual Wind Tunnel)模块合并到HyperMesh CFD中。 用户在VWT模块中完成LBM求解器ultraFluidX的前处理设置,导出参数文件XML和模型文件STL,并在GPU服务器上提交计算。 VWT目前…...
022集——统计多条线的总长度(CAD—C#二次开发入门)
如下图所示,选择多条线并统计长度: c#中不包含直接获取curve曲线长度 属性,需用如下方法:curve.GetDistanceAtParameter(item.EndParam) 附部分代码如下: using Autodesk.AutoCAD.ApplicationServices; using Autode…...
大模型重要技术系列三:高效推理
接上一篇高效训练,这一篇汇总下高效推理的方法。高效推理的两个主要优化目标是低延迟(快速得到推理结果)和高吞吐量(能同时处理很多请求),同时还要尽可能地少用资源(算力、存储、网络带宽&#…...
Android 刘海屏适配指南
如果您不希望您的内容与刘海区域重叠, 以确保您的内容不会与状态栏及 导航栏。如果您要呈现在刘海区域中,请使用 WindowInsetsCompat.getDisplayCutout() 检索 DisplayCutout 对象 包含每个刘海屏的安全边衬区和边界框。借助这些 API 您需要检查视频内容…...
微信小程序服务通知
项目中用到了小程序的服务消息通知,通知订单状态信息,下边就是整理的一下代码,放到项目中,把项目的小程序appid和小程序的secret写进去,直接运行即可 提前申请好小程序服务信息通知短信模板,代码需要用到模…...
解析日本工程塑料厂家代理新日铁住金产品的核心价值与
在众多日本工程塑料供应商中,新日铁住金凭借其在特种工程塑料领域的技术积累和稳定品质,成为众多制造企业的优选合作伙伴。对于寻求高性价比、稳定供应的塑胶制品厂、精密注塑厂及汽车零部件厂商而言,选择专业代理商是平衡品质与成本的关键。…...
告别HDR格式混乱:用Python代码实战HLG与PQ曲线互转(附完整代码)
告别HDR格式混乱:用Python代码实战HLG与PQ曲线互转(附完整代码) 在视频处理领域,HDR(高动态范围)技术已经成为提升视觉体验的关键要素。然而,HLG(Hybrid Log-Gamma)和PQ&…...
Excel MCP Server 完整部署指南:无需安装Excel的自动化数据处理解决方案
Excel MCP Server 完整部署指南:无需安装Excel的自动化数据处理解决方案 【免费下载链接】excel-mcp-server A Model Context Protocol server for Excel file manipulation 项目地址: https://gitcode.com/gh_mirrors/ex/excel-mcp-server Excel MCP Server…...
影刀RPA跨境店群自动化实战:Python协同Chromium打破风控“垄断”的高并发调度系统架构
定了。彻底打破传统商业指纹浏览器的生态「垄断」与电商巨头风控体系的「底层封锁」,我们用一套基于 Python 深度协同的分布式微服务调度架构,重塑了跨境千店矩阵的自动化底座。 这几天,科技圈被“DeepSeek V4 首发华为芯片,国产…...
智能安卓主板选型指南:从需求分析到量产落地的全流程解析
1. 项目概述:智能安卓主板选型的核心价值在嵌入式开发和智能硬件项目里,选对一块主板,往往意味着项目成功了一半。我见过太多团队,前期功能设计得天花乱坠,结果卡在了硬件选型上,要么性能过剩成本失控&…...
Rerank:为什么它是 RAG 效果的分水岭?
在一个典型 RAG 流程中: 很多 Demo 系统会省略中间这一步: 直接把 Top-K 丢给模型 看起来能跑,但一旦进入真实场景,很快就会出现: 命中了,但排在后面噪声太多,污染上下文模型“理解错重点” 本…...
5分钟快速上手:Parsec VDD虚拟显示器完整指南,彻底释放游戏串流潜能
5分钟快速上手:Parsec VDD虚拟显示器完整指南,彻底释放游戏串流潜能 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 想要在没有物理显示器的情况下畅享4K游…...
边缘机器学习实战:模型量化、剪枝与TensorRT部署全解析
1. 项目概述:当机器学习遇见边缘“边缘计算”和“机器学习”这两个词,这几年在技术圈里都快被说烂了。但当你真正把一个训练好的模型,塞进一个算力有限、功耗敏感、网络时有时无的边缘设备里,让它去实时处理摄像头画面、分析传感器…...
应对2026AIGC检测算法:5大热门降AI工具实测与免费提示词秘籍
为了找到真正靠谱的解决方案,我过去测试了市面上大部分号称能降低ai率的方法。从一分钱不花的模型指令,到各种付费的专业降ai率工具,用手头的文本做了几十次实操对比。说心里话,里面套路确实不少,有些方法用完后语句颠…...
深入STM32F103定时器:用TIM2输入捕获精准测量脉冲宽度与频率
深入STM32F103定时器:用TIM2输入捕获精准测量脉冲宽度与频率 在嵌入式开发中,精确测量外部信号的脉冲宽度和频率是一项常见但极具挑战性的任务。无论是工业控制中的旋转编码器、消费电子中的红外遥控信号,还是无人机领域的PPM控制信号&#x…...
