又是寄人篱下使用服务器的一天...
造成错误的过程:
跑实验需要装一个新的虚拟环境来使用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).