torch报错AssertionError: Torch not compiled with CUDA enabled解决方法 torch适配CUDA降版本选择gpu版本最终方案

Posted zrc007007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了torch报错AssertionError: Torch not compiled with CUDA enabled解决方法 torch适配CUDA降版本选择gpu版本最终方案相关的知识,希望对你有一定的参考价值。

报错情况

报错一

在任意python文件下运行这几行命令

print("是否可用:", torch.cuda.is_available())        # 查看GPU是否可用
print("GPU数量:", torch.cuda.device_count())        # 查看GPU数量
print("torch方法查看CUDA版本:", torch.version.cuda)  # torch方法查看CUDA版本
print("GPU索引号:", torch.cuda.current_device())    # 查看GPU索引号
print("GPU名称:", torch.cuda.get_device_name(1))    # 根据索引号得到GPU名称

输出、报错如下:

是否可用: True
...
RuntimeError: The NVIDIA driver on your system is too old (found version 10020).

然后在尝试降版本后出现第二个报错:

报错二

同样的命令

print("是否可用:", torch.cuda.is_available())        # 查看GPU是否可用
print("GPU数量:", torch.cuda.device_count())        # 查看GPU数量
print("torch方法查看CUDA版本:", torch.version.cuda)  # torch方法查看CUDA版本
print("GPU索引号:", torch.cuda.current_device())    # 查看GPU索引号
print("GPU名称:", torch.cuda.get_device_name(1))    # 根据索引号得到GPU名称

输出结果:

是否可用: False
...
AssertionError: Torch not compiled with CUDA enabled

解决办法

首先命令行输入nvidia-smi,查看CUDA版本:

nvidia-smi

查看得到结果:

得到服务器的CUDA版本为10.2.

然后去torch官网中查看老版本CUDA适配的torch版本:

https://pytorch.org/get-started/previous-versions/

下面就要在镜像源中找到这样的torch版本:1.12.1以及适配gpu

比如我们在北外的torch镜像源中找:

https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

我们是linux版本,就选linux:

看到了如下的:

这就是我们要找的。右键点击蓝字,'右键'-'复制链接地址',得到下载链接,直接用这个包安装pytorch:

conda install https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/linux-64/pytorch-1.12.1-py3.8_cuda10.2_cudnn7.6.5_0.tar.bz2

然后用以下命令,自动安装适配的依赖包:

conda install pytorch

这样就安装成功了,再次调用以上python命令测试CUDA:

print("是否可用:", torch.cuda.is_available())        # 查看GPU是否可用
print("GPU数量:", torch.cuda.device_count())        # 查看GPU数量
print("torch方法查看CUDA版本:", torch.version.cuda)  # torch方法查看CUDA版本
print("GPU索引号:", torch.cuda.current_device())    # 查看GPU索引号
print("GPU名称:", torch.cuda.get_device_name(1))    # 根据索引号得到GPU名称

得到结果:

True
2
10.2
0
Tesla T4

torchvision也是同理:

conda install https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/linux-64/torchvision-0.13.1-py38_cu102.tar.bz2
conda install torchvision

然后具体介绍一下这几个报错,这样也把我一路摸着石头过河的经历给复述一下。

报错RuntimeError: The NVIDIA driver on your system is too old (found version 10020).的原因

你安装的torch和你的CUDA版本不匹配

比如我的环境中就是10.2的CUDA和1.13.0(或者1.13.1,反正是1.13版本)的pytorch冲突了。

NVIDIA too old解决办法

  1. 降低pytorch版本

  1. 升级CUDA。

解决办法很多,可以参考网上其他文章。本文重点在第二个报错Torch和CUDA的编译(compile)问题,因为我自己是使用学校的机房,没权限升级CUDA,所以介绍一下我尝试过的第一个办法,降低pytorch版本:

你在看这一段时,会发现前面和我最终的解决方法是一样的,但后面不同的方法让我走了弯路。

首先确定你的CUDA版本,在Linux命令行终端中输入nvidia-smi:

nvidia-smi

查看得到结果:

得到服务器的CUDA版本为10.2.

然后去torch官网中查看老版本CUDA适配的torch版本:

https://pytorch.org/get-started/previous-versions/

好了,到这一步,你可能就会按照它上面的操作,安装这几个版本的库了。

conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=10.2 -c pytorch

不过你可能会碰到的问题有:

  1. 某个包版本不匹配当前python版本

  1. 某个包版本和其他包冲突

  1. 某个包安装的版本和CUDA版本不匹配

可能你改进了第一、二个问题,终于把整套pytorch、torchvision下下来了,但你还是要面对第三个问题,就是继而报错AssertionError: Torch not compiled with CUDA enabled,不过我一步步介绍我的经历,先看看如何面对第一和第二个问题的:

自己调试去安装,我试过,最后还是选择了使用如下命令:

conda install --override-channels -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ pytorch torchvision cudatoolkit=10.2

这条命令是说,指定使用镜像源https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/,指定cudatoolkit版本适配10.2的CUDA,然后根据这个适配,下载pytorch包和torchvision包。

下载好了,尝试代码,你会得到:

print("是否可用:", torch.cuda.is_available())        # 查看GPU是否可用
print("GPU数量:", torch.cuda.device_count())        # 查看GPU数量
print("torch方法查看CUDA版本:", torch.version.cuda)  # torch方法查看CUDA版本
print("GPU索引号:", torch.cuda.current_device())    # 查看GPU索引号
print("GPU名称:", torch.cuda.get_device_name(1))    # 根据索引号得到GPU名称

(输出结果:)
是否可用: False
...
AssertionError: Torch not compiled with CUDA enabled

这就是第二个报错了。

报错AssertionError: Torch not compiled with CUDA enabled的原因

而第二个报错则是因为你安装的torch是cpu版本的。比如你可以在你的conda环境下查找torch版本:

conda list | grep torch

结果如下:

(base) weinz@dlp01:~$ conda list | grep torch
(正常使用命令无法看到下面注释的一行,为了直观显示,我粘贴过来了)
# Name                    Version                   Build  Channel
pytorch                   1.12.1          cpu_py38he8d8e81_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
torchvision               0.13.1          cpu_py38h164cc8f_0    https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main

其中包版本号Version后面的Build列,就能看到torch适配的是cpu版本。

发现问题后,改成gpu版本的就可以了。

具体方法就接上我最终的解决方案了:

具体解决方法

首先回顾一下我们需要的torch版本:

在镜像源中找到1.12.1以及适配gpu的pytorch、torchvision

进入镜像源https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

这就是我们要找的。右键-复制链接地址,直接用这个包安装pytorch:

conda install https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/linux-64/pytorch-1.12.1-py3.8_cuda10.2_cudnn7.6.5_0.tar.bz2

可以查看一下,这样下载的是否是gpu版本的。输入查找命令:

conda list | grep torch

得到结果:

可以看到,显示的是cuda,这个就是gpu版本的了。

然后用以下命令,自动安装适配的依赖包:

conda install pytorch

这样就安装成功了,再次调用以上python命令测试CUDA:

print("是否可用:", torch.cuda.is_available())        # 查看GPU是否可用
print("GPU数量:", torch.cuda.device_count())        # 查看GPU数量
print("torch方法查看CUDA版本:", torch.version.cuda)  # torch方法查看CUDA版本
print("GPU索引号:", torch.cuda.current_device())    # 查看GPU索引号
print("GPU名称:", torch.cuda.get_device_name(1))    # 根据索引号得到GPU名称

得到结果:

True
2
10.2
0
Tesla T4

torchvision也是同理:

conda install https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/linux-64/torchvision-0.13.1-py38_cu102.tar.bz2
conda install torchvision

总结

看着网上的文章,还有问chatGPT,一步步解决了这个问题,还是值得的。

有的方法在选择gpu版本的时候,选择这样:

conda install -c 镜像源 后面调试版本
conda install -c 'http...' pytorch=1.12.1 torchvision=0.13.0 cudatoolkit=10.2
conda install -c 'http...' pytorch=1.9.1 torchvision=0.8.0 cudatoolkit=10.2
...

一步步调版本,我在调的时候发现太搞了,而且试出来下好配套的了,可能下的也是cpu版本的。

具体可参考这篇文章:

https://blog.csdn.net/u013468614/article/details/125910538

可能更了解镜像源内部选择的方式,会有更好的解决方法。不过在此之前,这种直接下载你需要的版本然后让镜像源给你补依赖包才是最高效的方法。

AssertionError:Torch 未在启用 CUDA 的情况下编译

【中文标题】AssertionError:Torch 未在启用 CUDA 的情况下编译【英文标题】:AssertionError: Torch not compiled with CUDA enabled 【发布时间】:2019-05-29 13:35:30 【问题描述】:

来自https://pytorch.org/

要在 MacOS 上安装 pytorch,说明如下:

conda install pytorch torchvision -c pytorch
# MacOS Binaries dont support CUDA, install from source if CUDA is needed

为什么要在不启用 cuda 的情况下安装 pytorch?

我问的原因是我收到错误:

----------------------------------- ---------------------------- AssertionError Traceback(最近调用 最后)在() 78 # 预测 = 输出.data.max(1)[1] 79 ---> 80 输出 = 模型(torch.tensor([[1,1]]).float().cuda()) 81 预测 = output.data.max(1)[1] 82

~/anaconda3/lib/python3.6/site-packages/torch/cuda/init.py _lazy_init() 第159章 160“无法在分叉的子进程中重新初始化 CUDA。” + msg) --> 161 _check_driver() 162 火炬._C._cuda_init() 第163章

~/anaconda3/lib/python3.6/site-packages/torch/cuda/init.py _check_driver() 73 定义_check_driver(): 74 如果没有属性(torch._C,'_cuda_isDriverSufficient'): ---> 75 raise AssertionError("Torch 未在启用 CUDA 的情况下编译") 76 如果不是 torch._C._cuda_isDriverSufficient(): 77 如果torch._C._cuda_getDriverVersion() == 0:

尝试执行代码时:

x = torch.tensor([[0,0] , [0,1] , [1,0]]).float()
print(x)

y = torch.tensor([0,1,1]).long()
print(y)

my_train = data_utils.TensorDataset(x, y)
my_train_loader = data_utils.DataLoader(my_train, batch_size=2, shuffle=True)

# Device configuration
device = 'cpu'
print(device)

# Hyper-parameters 
input_size = 2
hidden_size = 100
num_classes = 2


learning_rate = 0.001

train_dataset = my_train

train_loader = my_train_loader

pred = []


for i in range(0 , model_iters) : 
    # Fully connected neural network with one hidden layer
    class NeuralNet(nn.Module):
        def __init__(self, input_size, hidden_size, num_classes):
            super(NeuralNet, self).__init__()
            self.fc1 = nn.Linear(input_size, hidden_size) 
            self.relu = nn.ReLU()
            self.fc2 = nn.Linear(hidden_size, num_classes)  

        def forward(self, x):
            out = self.fc1(x)
            out = self.relu(out)
            out = self.fc2(out)
            return out

    model = NeuralNet(input_size, hidden_size, num_classes).to(device)

    # Loss and optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)  

    # Train the model
    total_step = len(train_loader)
    for epoch in range(num_epochs):
        for i, (images, labels) in enumerate(train_loader):  
            # Move tensors to the configured device
            images = images.reshape(-1, 2).to(device)
            labels = labels.to(device)

            # Forward pass
            outputs = model(images)
            loss = criterion(outputs, labels)

            # Backward and optimize
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
:.4f'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))

    output = model(torch.tensor([[1,1]]).float().cuda())

要修复这个错误,我需要从源代码安装 pytorch 并安装 cuda 吗?

【问题讨论】:

"为什么要在不启用 cuda 的情况下安装 pytorch?" :那些没有支持 CUDA 的 GPU 的人可能想要。你是Mac平台的吗?如果是这样,您确定您的 Mac 中安装了支持 CUDA 的 GPU 吗?很明显,如果您按照您的指示(通过 conda)安装,那么您的 pytorch 没有启用 CUDA。这将与断言错误一致。同样令人费解的是,为什么您在 pytorch 脚本中指定了device = 'cpu',而且:output = model(torch.tensor([[1,1]]).float().cuda()) @RobertCrovella 感谢罗伯特。我错误地认为为了运行 pyTorch 代码需要 CUDA,因为我也没有意识到 CUDA 不是 PyTorch 的一部分。为了编写在 CPU 和 GPU 之间交叉兼容的代码,我需要包含/排除 .cuda() 吗? @blue-sky。删除任何 cuda() 并改用device 来实现这种兼容性。 详细说明:您需要使用.to(device) 而不是.cuda()。根据“设备”的值,可以使用 GPU。通常这样做是这样的:device = torch.device('cuda' if torch.cuda.is_available() else 'cpu'). 【参考方案1】:

总结和扩展cmets:

CUDA 是 Nvidia 专有(显然未经许可)技术,允许在 GPU 处理器上进行通用计算。 很少有 Macbook Pro 配备支持 Nvidia CUDA 的 GPU。看看here,看看你的 MBP 是否有 Nvidia GPU。然后,查看表here,看看那个GPU是否支持CUDA iMac、iMac Pro 和 Mac Pro 也是如此。 因此,在 MacOS 上默认安装 PyTorch 时不支持 CUDA

这个 PyTorch github 问题提到很少有 Mac 有 Nvidia 处理器:https://github.com/pytorch/pytorch/issues/30664

如果您的 Mac 确实有支持 CUDA 的 GPU,那么要在 MacOS 上使用 CUDA 命令,您需要使用正确的命令行选项从源代码重新编译 pytorch。

【讨论】:

您需要使用正确的命令行选项从源代码重新编译 pytorch。 这是什么意思?

以上是关于torch报错AssertionError: Torch not compiled with CUDA enabled解决方法 torch适配CUDA降版本选择gpu版本最终方案的主要内容,如果未能解决你的问题,请参考以下文章

AssertionError: Torch not compiled with CUDA enabled

AssertionError:Torch 未在启用 CUDA 的情况下编译

基于torch函数TransformerEncoder出现AssertionError问题的解决

报错记录torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 90.00 MiB (GPU 0; 7.93 GiB to

torch.tensor() 和 torch.to_tensor() 的区别

EasyMock set方法报错: java.lang.AssertionError