今天,一位群友在用“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%)
原因
由于这个问题原因很多,大家解决之前一定要先去看报错提示具体是什么?只有根据具体的错误提示才能找出最佳的解决方法。
一般来说,报“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,再运行它即可。
暂无评论内容