CUDNN_STATUS_EXECUTION_FAILED 错误原因:显卡版本和cuda版本不匹配

又是寄人篱下使用服务器的一天...

造成错误的过程:

跑实验需要装一个新的虚拟环境来使用cuda,别人的readme上面要用torh1.3, 搜了一下教程,适配的cuda版本是10.1,目前显卡支持的最高cuda版本是11.4(使用

nvidia-smi

 nvidia-smi命令查看)。按以往经验以为正常创建cuda10.1的torch环境。使用的时候报错CUDNN_STATUS_EXECUTION_FAILED。大哭,网上都说是cuda,cudann,torch版本不匹配呜呜呜。然后去Linux查询当前使用的cuda版本。居然发现是cuda11.1(使用命令

ls -l /usr/local | grep cuda 

ls -l /usr/local | grep cuda 查看),于是安装一个cuda10.1以及对应的cudnn版本,切换到新安装的cuda10.1版本上(使用命令

sudo ln -s /usr/local/cuda-10.1 /usr/local/cuda

sudo ln -s /usr/local/cuda-10.1 /usr/local/cuda切换)。再次运行代码,还是相同错误!大哭!再去看看是不是torch版本和cuda版本不匹配,网上搜了一下是pytorch1.3.0支持cuda10.1,当前安装的是1.3.1,于是紧接着重新建了一个虚拟环境,安装torch1.3.0,运行实验,报错:GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.啊啊啊气死我我了!说当前cuda算力不匹配。很好,一天过去了。
第二天,继续查询前一日的错误。因为已经确认了是在代码中使用cuda时出现了问题(具体表现为模型开始使用GPU训练了就报错),实验的代码及环境要求太麻烦,所以去搜了minist数据集和一个简单的网络来使用GPU进行训练测试当前环境是否可行。代码如下(建议先下载好minist数据集到代码文件目录下)。

  1 """
  2 一个简单的调用GPU的卷积神经网络示例!
  3 """
  4 import gzip
  5 import numpy as np
  6 import os
  7 import torch
  8 import torchvision
  9 from torchvision import datasets
 10 from torchvision import transforms
 11 from torch.utils.data import DataLoader, Dataset
 12 
 13 batch_size = 64
 14 device = torch.device("cuda:1")
 15 
 16 def load_data(data_folder, data_name, label_name):
 17     """
 18         data_folder: 文件目录
 19         data_name: 数据文件名
 20         label_name:标签数据文件名
 21     """
 22     with gzip.open(os.path.join(data_folder,label_name), 'rb') as lbpath: # rb表示的是读取二进制数据
 23         y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)
 24 
 25     with gzip.open(os.path.join(data_folder,data_name), 'rb') as imgpath:
 26         x_train = np.frombuffer(
 27             imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)
 28     return (x_train, y_train)
 29 
 30 class DealDataset(Dataset):
 31     """
 32         读取数据、初始化数据
 33     """
 34     def __init__(self, folder, data_name, label_name,transform=None):
 35         (train_set, train_labels) = load_data(folder, data_name, label_name) # 其实也可以直接使用torch.load(),读取之后的结果为torch.Tensor形式
 36         self.train_set = train_set
 37         self.train_labels = train_labels
 38         self.transform = transform
 39 
 40     def __getitem__(self, index):
 41 
 42         img, target = self.train_set[index], int(self.train_labels[index])
 43         if self.transform is not None:
 44             img = self.transform(img)
 45         return img, target
 46 
 47     def __len__(self):
 48         return len(self.train_set)
 49 
 50 class CNN(torch.nn.Module):
 51     def __init__(self):
 52         super(CNN, self).__init__()
 53         self.convl1 = torch.nn.Conv2d(1, 10, 5)
 54         self.convl2 = torch.nn.Conv2d(10, 20, 5)
 55         self.pooling = torch.nn.MaxPool2d(2)
 56         self.activate = torch.nn.ReLU()
 57         self.linear = torch.nn.Linear(320, 10)
 58 
 59     def forward(self, x):
 60         x = x.view(-1, 1, 28, 28)
 61         x = self.convl1(x)
 62         x = self.pooling(x)
 63         x = self.activate(x)
 64         x = self.convl2(x)
 65         x = self.pooling(x)
 66         x = x.view(-1, 320)
 67         x = self.linear(x)
 68         return x
 69 
 70 
 71 def train(train_loader, model, criterion, optimizer, epoch):
 72     loss_sum = 0.0
 73     for index, (x, y) in enumerate(train_loader):
 74         x = x.to(device)
 75         y = y.to(device)
 76         y_hat = model(x)
 77         loss = criterion(y_hat, y)
 78         loss_sum += loss.item()
 79         optimizer.zero_grad()
 80         loss.backward()
 81         optimizer.step()
 82 
 83         if (index % 300 == 299):
 84             print(epoch, ",", index // 300, ":", loss_sum / 300)
 85             loss_sum = 0.0
 86 
 87 
 88 def test(test_loader, model):
 89     total = 0
 90     correct = 0
 91     for x, y in test_loader:
 92         x = x.to(device)
 93         y = y.to(device)
 94         y_hat = model(x)
 95         _, guess = torch.max(y_hat, 1)
 96         correct += (guess == y).sum().item()
 97         total += y.size(0)
 98     print("ACC == ", correct / total)
 99 
100 
101 if __name__ == '__main__':
102     transformer = torchvision.transforms.Compose(
103         [torchvision.transforms.ToTensor(), torchvision.transforms.Normalize(0.1307, 0.3018)])
104     print("load data...")
105     train_data = DealDataset('', "train-images-idx3-ubyte.gz", "train-labels-idx1-ubyte.gz", transform=transforms.ToTensor())
106     test_data = DealDataset('', "t10k-images-idx3-ubyte.gz", "t10k-labels-idx1-ubyte.gz", transform=transforms.ToTensor())
107     # train_data = datasets.MNIST('MNIST', True, transformer, download=False)
108     # test_data = datasets.MNIST('MNIST', True, transformer, download=False)
109 
110     train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=False, num_workers=2)
111     test_loader = DataLoader(test_data, batch_size=batch_size, shuffle=False, num_workers=2)
112     print("begin training...")
113     model = CNN()
114     model.to(device)
115     criterion = torch.nn.CrossEntropyLoss()
116     criterion.to(device)
117     optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
118     for epoch in range(10):
119         print("epoch: {}  ".format(epoch))
120         train(train_loader, model, criterion, optimizer, epoch)
121 
122     # test(test_loader, model)
View Code

因为知道torch1.3.1版本算力会出现问题,所以尝试使用之前的1.3.0版本试一下,但是在model.to(device)就卡住了,我想,这么简单的网络不至于会卡住啊,更何况服务器资源并不差。于是百度了一下,所示cuda版本有问题,这时候弹出来了一句话:【据说GeForce RTX 30系列显卡仅支持CUDA 11.1及以上版本】。

解决问题:

确认自己的显卡是否支持当前cuda版本:

先去查询自己的显卡型号(使用命令

lspci | grep -i vga

lspci | grep -i vga查询),出现下图:

该网址搜索上图框住的数字(比如我的是2204),点击jump,出现你的显卡是哪个系列的。如下图我的显卡:

很明显,RTX3090. 也就是不支持11.1以下的cuda版本。(因为之前环境有人装了cuda10.0,以为可以正常使用,就没有去检查,后来去问了以下装cuda10.0的同学,测试了才知道她一直用的就是cuda11.1版本...)

所以,装一个cuda11.1及其cudnn(服务器以前就有的话就切换一下),在cuda11.1的环境下安装其适配的torch版本。在简单的minist网络测试cuda是否可行(先使用

torch.cuda.is_available()

torch.cuda.is_available()测试cuda是否可用)。

 

后续:

为了节省服务器内存,删掉之前的虚拟环境(使用命令

conda remove -n your_env_name --all

conda remove -n your_env_name --all),卸载cuda(使用命令:

cd /usr/local/cuda-10.1/bin
./cuda-uninstaller

cd /usr/local/cuda-10.1/bin
./cuda-uninstaller).

posted @ 2023-01-15 13:29  achived  阅读(892)  评论(0编辑  收藏  举报