SD软件NansException: A tensor with all NaNs 原因与解决方法

今天,一位群友在用“Stable Diffusion”的时候,打开提示类似错误如下:

NansException: A tensor with all NaNs was produced in Unet. Use –disable-nan-check commandline argument to disable this check.

Time taken 9.09s Torch active/reserved: 4184/4236 MiB, Sys VRAM: 6094/6144 MiB(99.19%)

中文翻译

NansException:Unet中生成了一个包含所有NaN的张量。使用 –disable-nan-check 命令行参数可以禁用此检查。

所用时间9.09秒 Torch active/保留:4184/4236 MiB,系统 显存:6094/6144 MiB(99.19%)

微信截图_20230629182059

原因

由于这个问题原因很多,大家解决之前一定要先去看报错提示具体是什么?只有根据具体的错误提示才能找出最佳的解决方法。

 

一般来说,报“NansException: A tensor with all NaNs was produced in Unet”错误,主要的原因无非就是以下这些,如下:

什么是Python Torch?

Pytorch是一个基于 Torch的 Python开源机器学习库,用于自然语言处理等应用程序它主要由Facebook的人工智能小组开发,不仅能够实现强大的GPU加速,同时还支持动态神经网络,这点是现在很多主流框架如 Tensorflow都不支持的。

Pytorch提供了两个高级功能:

1.具有强大的GPU力加速的张量计算(例如 Numpy)。

2.包含自动求导系统的深度神经网络。

 

什么是Unet?

Unet是一种用于图像分割的神经网络架构。它由一个编码器-解码器结构组成,其中相应的层之间有跳跃连接。编码器逐渐降低输入图像的空间分辨率,而解码器上采样特征图并恢复原始分辨率。

一个全是NaN的张量意味着张量中的值不是数字,而是未定义或无效的。这可能有各种原因,比如除以零、溢出、下溢或数据类型错误。

 

一个可能的解决方案是将交叉注意力层提升为float32,这是一种比half(float16)更高精度的数据类型。这可以防止数值错误并提高计算的准确性。你可以通过在设置>稳定扩散中设置“将交叉注意力层提升为float32”选项或在运行Unet时使用–no-half命令行参数来实现这一点。

 

另一个可能的解决方案是使用支持half类型的不同显卡,这是一种低精度的数据类型,可以减少内存使用和加速计算。但是,这可能取决于你的硬件和预算,可能不可行或不可取。

 

你也可以通过使用 –disable-nan-check 命令行参数来禁用NaN检查。这将忽略任何NaN值并继续执行。但是,这不推荐,因为它可能导致不正确的结果或后续的错误。

 

交叉注意力层是Unet中的一个模块,它可以在编码器和解码器之间传递信息,从而提高分割性能。交叉注意力层可以根据输入图像的内容自动调整特征图的权重,从而过滤掉不相关的特征。

如果你在 设置 – 稳定扩散中设置了“将交叉注意力层提升为float32”选项或在运行Unet时使用了–no-half命令行参数,但仍然出现NaNs的错误,可能有以下几种原因:

  • 你的显卡不支持float32类型,或者显存不足以存储高精度的张量。
  • 你的输入图像有异常值,比如负数、无穷大或非数字,导致计算出错。
  •  你的网络参数有错误,比如学习率过大、激活函数不合适或损失函数不稳定,导致梯度爆炸或消失。

 

为了解决这个问题,你可以尝试以下几种方法:

  • 检查你的显卡是否支持float32类型,并确保显存足够。如果不支持或不足,你可以考虑更换显卡或降低输入图像的分辨率。
  • 检查你的输入图像是否有异常值,并进行预处理,比如归一化、裁剪或填充。
  • 检查你的网络参数是否合理,并进行调整,比如降低学习率、更换激活函数或损失函数。

 

解决方法

以这位群友的报错为例子,他之所以报这个错误,主要就是因为:

内存不够,显存不够所引起的。

之所以引起这个内存、显存不足,大多数也是因为生成的张数太多或者分辨率太高。

 

通过报错,其实也能知道一个具体的解决方法,例如:

 

第一种方法:

提高自己物理电脑的配置,例如:内存与显存。

 

第二种方法:

把生成的张数或分辨率修改小一点。

 

第三种方法:

以这位群友为例子,例如,如果你想要添加 –disable-nan-check 参数,你可以在最后一行加上:python main.py –disable-nan-check,然后保存文件,并把后缀改回 .bat,再运行它即可。

 

 

© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容