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)
因为知道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).