当前位置: 首页 > news >正文

记录:训练过程中可训练参数出现nan和inf造成loss为nan

文章目录

  • 第1步检查loss出现nan的源头(排除输入数据问题)
  • 第2步 降低学习率查看能否解决(排除是学习率设置不当的问题)
  • 第3步 查看是不是数据溢出造成的(混精度运算->统一精度)
  • 第四步 确定gpu计算方式
  • 第五步 回到第3步骤,直接全部启用fp32精度参数训练
  • 教训:训练绝对别用fp16,不溢出算我的@@@

第1步检查loss出现nan的源头(排除输入数据问题)

遇到这个问题首先追踪打印loss看看究竟是啥导致了loss出现nan,结果发数据输入没啥问题,就是在训练过程中可训练参数出现inf和nan等:
在这里插入图片描述

第2步 降低学习率查看能否解决(排除是学习率设置不当的问题)

我将学习率从10-5降低十倍,一点点作用都没有
在这里插入图片描述

第3步 查看是不是数据溢出造成的(混精度运算->统一精度)

因为我这个情况比较特殊,我的输入数据是32位的,但是我的模型训练参数是16位的,loss计算是32位的,因为上面也发现我的问题是训练参数inf和nan了,所以我想会不会是精度不一样导致参数计算的时候溢出了。由于我的baseline是16位的,我计划将所有的转换成16位来训练。
结果还是一样,在训练的第一次更新完参数就inf和nan了。
在这里插入图片描述

第四步 确定gpu计算方式

可能你的gpu是半精度(fp16)训练,启用了tf32训练
加上:

torch.backends.cuda.matmul.allow_tf32 = False
torch.backends.cudnn.allow_tf32 = False
with autocast(dtype=torch.float16):

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

第五步 回到第3步骤,直接全部启用fp32精度参数训练

这里其实有一个问题:我最终需要的是fp16 的精度(因为怕溢出),但是参与训练是32。
解决:我将参数初始化为32,但是前向计算时候转换成16
在这里插入图片描述

解决了

教训:训练绝对别用fp16,不溢出算我的@@@

相关文章:

  • 2025年6月亲测可用 | 剪映免SVIP版本 | 支持数字人
  • 8.安卓逆向2-frida hook技术-frida环境安装
  • 利用亮数据实现大规模数据自动抓取
  • 如何验证 AXI5 原子操作
  • Linux 进阶命令篇
  • (自用)Java学习-5.19(地址管理,三级联动,预支付)
  • WSL连接网络
  • 【观成科技】Ymir勒索软件组织窃密木马RustyStealer加密通信分析
  • 联软科技统一安全工作空间:零信任架构下的远程办公数据安全守护者
  • 塔能科技:有哪些国内工业节能标杆案例?
  • vue3基本类型和对象类型的响应式数据
  • [Vue组件]比例环形编辑
  • 【前端】【Vue3】vue3性能优化总结
  • 关于Oracle LATCH:LIBRARY CACHE
  • 【Vue Vapor Mode :技术突破与性能优化的可能性】
  • 《棒球特长生》棒球升学途径·棒球1号位
  • 深度学习能取代机器学习吗?
  • 给定数组 nums,判断是否存在三个元素 a, b, c 使得 a + b + c = 0。
  • 基于vue框架的动物园饲养管理系统a7s60(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 四足机器人环境监测系统相关问题
  • 域名网络的解析网站/厦门网站seo
  • 怎么做门户网站/互联网产品推广是做什么的
  • 网站开发功能描述/卖链接的网站
  • 秦皇岛黄金海岸收费吗/青岛百度关键词优化
  • dw 做网站模板/长尾关键词网站
  • 舒城县建设局网站/上海好的网络推广公司