问题描述
当准备好数据集进行训练时,其余正常,可以识别到label,但是P,R,map这些地方都是0,或者出现预训练几轮是正常的数值,但是后几轮就全部为0,如图等异常情况。
如果确保数据原图和标签是匹配的,或者上传的文件也不是损坏的,那就有可能是梯度的问题了。
总览:导致问题的原因
导致这一问题的原因主要分为如下几个方面,在这里先作总结,具体方法在之后展开。有经验的同学可以直接根据本节进行快速排查,以提高效率。
1.CUDA版本与驱动程序不兼容:CUDA版本需与GPU驱动程序兼容。
2.CUDA库的路径设置存在问题:如果CUDA库路径未正确配置,PyTorch将无法找到CUDA库文件。
3.PyTorch版本与CUDA版本不匹配:安装的PyTorch版本需与CUDA版本匹配。
4.编译问题:如果使用预编译的PyTorch二进制文件,可能存在与CUDA版本不匹配的问题。
5.冲突:可能存在其他软件包或库与PyTorch或CUDA发生冲突,可能代码和pytorch本身问题-例如半精度混合。
6.有答案提出梯度爆炸更换优化器。
可能1:CUDA版本与驱动程序不兼容
驱动程序与CUDA的兼容,指的是GPU驱动程序与安装的CUDA版本相匹配,并且能够正确地与CUDA库进行通信和协作。可以按照如下步骤排查二者是否兼容:
1. 查看CUDA版本。
在终端输入如下指令:
nvcc -V
查看信息如下:
这里的CUDA版本是12.2。
2. 查看GPU驱动程序版本。
在终端输入指令:
nvidia-smi
找到Driver Version,例如我的是537.13
3. 检查二者是否兼容。
驱动程序与CUDA的兼容性匹配才能用,因为PyTorch和其他基于CUDA的库需要与GPU驱动程序进行交互才能正确运行。如果驱动程序与CUDA不兼容,可能会导致无法正常使用CUDA功能或出现错误
浏览此链接即可查看对应版本。
4. 更新驱动程序或更改CUDA版本。
若二者不匹配,可以选择更新驱动程序或更改CUDA版本。
可以通过访问NVIDIA官方网站下载并安装适当的驱动程序版本。在安装新的驱动程序之前,请确保先卸载旧的驱动程序,并按照安装指南进行正确的安装,
可能2:CUDA库的环境变量路径设置错误
简单来说,如果CUDA库路径未正确配置,PyTorch将无法找到CUDA库文件。在这种情况下,即便CUDA与Pytorch的安装都是正确的,也会导致错误。先按照需求下载好cuda和cudnn
引用此篇回答此篇回答
1.cuda的官网下载地址:cuda-toolkit-archive
2.示例在这里选择的是 CUDA Toolkit 12.2.1
简单步骤如下:
3.点击后等待一会即可进行下载,最后“Download”进行本地下载
4.下载完成后运行exe文件进行下载
无脑安装后输入cmd进入终端窗口输入nvcc -V查看是否安装完成。
设置环境变量:默认安装路径下,都在c盘固定位置。
这里借用其他人的配置图
1.我们打开“编辑系统环境变量”
2.点击“环境变量”
3.查看系统变量中是否有变量CUDA_PATH和CUDA_PATH_V12_2(不同版本V后数字不同),并检查路径是否正确
若没有则添加两变量并添加正确路径;若错误则修改成正确路径(路径为选项,自定义安装位置时选择的路径)
4.查看系统变量中的Path是否有v12.2\bin,若没有则添加正确路径;若错误则修改成正确路径(路径为选项,自定义安装位置时选择的路径)
不对的话需要重装cuda,注意把之前的cuda删除干净。
CUDNN的安装与配置
(1)CUDNN的下载
1.CUDNN官网下载地址:cudnn-archive
2.选择CUDNN支持CUDA版本下载,进入登陆邮箱即可下载。
(2)CUDNN的安装与配置
1.下载好CUDNN的压缩包后进行解压,得到如图所示文件
2.打开\NVIDIA Computing Toolkit\CUDA\v12.2,将CUDNN对应bin、lib、include三个文件与CUDA对应的bin、lib、include进行合并,将CUDNN内文件全部复制到CUDA对应文件夹内
3.打开“编辑系统环境变量”,点击“环境变量”,点击“系统变量”中Path添加C:\Program Files\NVIDIA Computing Toolkit\CUDA\v12.2\lib和v12.2\libnvvp以及v12.2\include,点击“确定”完成配置
借用示例:
(3)检查CUDNN是否安装成功
打开C:\Program Files\NVIDIA Computing Toolkit\CUDA\v12.2\extras\demo_suite,查看是否有文件bandwidthTest.exe以及deviceQuery.exe,若存在则在该文件中打开cmd运行两.exe文件
运行bandwidthTest.exe和运行deviceQuery.exe出现信息即可。
可能3:PyTorch版本与CUDA版本不匹配
如果在anaconda prompt中直接使用pip install pytorch和conda install pytorch命令直接下载,不指定版本肯定是不行的。大多数其他匹配正确的情况下是此问题疏忽导致,可更换不同版本pytorch进行试验。如实在不行那就回退cuda版本
需要在pytorch官网去下载相对应的版本。
这里分为conda下载连接和pip下载。但是注意这里的pytorch版本是不一样的,查看本地cuda寻找对应的pytorch,例如示例为cuda12.2,即可下载12.2以下的任意版本,这里第一次下载为
# CUDA 12.1
pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 --index-url https://download.pytorch.org/whl/cu121
这里遇到的问题真是这个,对应好cuda,cudnn,pytorch后出现map为0
此问题解决:更换不同的版本进行适配,最终更换v2.2.2解决问题。
可能4:编译问题
我没有遇到过这种情况,我也不推荐使用源代码编译PyTorch。如果排查到这一步依旧没有解决问题,建议首先更换Pytorch版本尝试(例如由conda安装改为pip安装)。如果依旧无法解决,再参照使用源代码编译PyTorch的相关文章。
可能5:软件包或库冲突
为了避免这种情况,建议新建一个conda环境,在新的conda环境下安装Pytorch。
由于NVIDIA 官方的一些软件问题,导致了PyTorch里面一些
具体解决方案:借用此示例说明此篇回答
1、_amp注释掉直接把amp赋值为False,如下图:
2、这样做之后在运行train.py发现训练时就不会有nan值了。如果还有,那就应该就关闭这篇博客了,考虑下其他方法了。
然后,你就会发现validation时会出现P/R/map全部为0。然后你就继续在train.py里面搜索half关键字,把所有有.half()变为.float(),如下图:
到这一步为止,我train时出现为nan和0的问题已经解决了。
3、如果发现问题依旧没有解决,还需要在val.py里面将所有的half改为False,同时im.half() if half else im.float() 改为 im.float()。如下图:
以上3步完成之后,再次运行train.py发现没有问题了。
这个解决办法的原理,就是把显卡半精度浮点型数据改为单精度的浮点型去运算。这样虽然精度高了,但是训练时长也相应会增加一些、显存占用也会增加一些,
可能6:优化器梯度爆炸
有回答归类于梯度爆炸导致map参数为0,
解决方法:把优化器SGD更改为ADAM或者ADAMW实验。