1、RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.FloatTensor) sh

2、 assert len(optimizer_state["found_inf_per_device"]) > 0, "No inf checks were recorded for this optimizer." AssertionError: No inf checks were recorded for this optimizer.

这两个问题我调试了1天半:结果发现!!都是cuda的问题,

1是batch[image]没有放到cuda上,添加一个batch["image"]=batch["image"].cuda,把batch[image]放到gpu上(我这里单卡)

2是优化的数据和优化器不在同一张显卡上。不会改的同学建议去云端租一张大显卡跑!!

1、RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.FloatTensor) sh

是在这一步遇到的:di = net(batch["image"].to(device))

with torch.cuda.amp.autocast(enabled=(scaler is not None)):

        # 确保所有输入都在指定设备上

        di = net(batch["image"].cuda()!!!!!这里

        labels = batch["label"].cuda()

当时又是问ai又是自己百度,答案都是清一色的:方法 1:让模型转换为 float16;方法 2:让输入转换为 float32。

但是我都严格的排除了上面的错误,并不存在此问题,我的图像和网络都是float32,我曾尝试把batch[image]=batch[image].half().结果还是数据不匹配。我是咋想到要这样的呢,因为我最近总是出一些数据不在同张显卡上报错等等,我就想是不是这个原因,因为在gpu上可以进行半精度计算并且可以自动管理浮点数类型,如果我的batch[image]不在cuda上,可能就不能被半精度管理?不太清楚,最近改多了,感觉全靠直觉!

2、 assert len(optimizer_state["found_inf_per_device"]) > 0, "No inf checks were recorded for this optimizer." AssertionError: No inf checks were recorded for this optimizer.

这个我记得去gpt,一堆可能的错误,比如说:

  • 检查 loss.backward() 是否被正确调用。
  • 确保 scaler = GradScaler() 正确初始化。
  • 打印 loss 值,确保它不是 0 或 NaN。
  • 临时关闭 AMP 进行调试。
  • 尝试降低 learning rate 解决梯度爆炸问题。

我每一种可能都排查了一遍我保证没有问题,最后琢磨琢磨,好像是从我分配了不同卡跑不同网络后开始有这个问题的,我就开了个大卡跑,发现这个问题解决了!!所以议后疑难杂症就看cuda吧~

Logo

欢迎来到FlagOS开发社区,这里是一个汇聚了AI开发者、数据科学家、机器学习爱好者以及业界专家的活力平台。我们致力于成为业内领先的Triton技术交流与应用分享的殿堂,为推动人工智能技术的普及与深化应用贡献力量。

更多推荐