RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location='cpu' to map your storages to the CPU.
谷歌翻译结果:
超时错误:尝试反序列化 CUDA 设备上的对象,但 torch.cuda.is_available() 为 False。 如果您在仅有CPU 的机器上运行,请使用带有 map_location='cpu' 的 torch.load 将您的存储映射到 CPU。
说明:torch.cuda.is_available()语句是判断GPU是否可用的语句,返回true说明GPU可用。但是我们现在的返回结果是false。
那么应该这么解决这个问题呢?经过分析有两种可能性:
1.你的电脑没有自带GPU
这个可能性的验证十分简单,只需打开任务管理器,点击性能选项,即可看到总体配置情况:
可以看到我的电脑是自带GPU的,说明不是这个错误。
(如果没有GPU,请参照下文的“笼统版解决思路”)
2.CUDA与pytorch的版本不符
在cmd中输入nvidia-smi语句即可查看
nvidia-smi
我的显示结果是这样的:
可以看到CUDA版本为11.2,由下文的“根源版解决思路”可以验证确实是版本不符的问题。
1.笼统版解决思路:
根据谷歌翻译的提示,找到所有的torch.load()语句,将map_location='cpu'字段加入其中即可,以下列语句举例:
torch.load(model_file)
只需改为:
model = torch.load(model_path, map_location='cpu')
总结:这种方法并不治本,对于有GPU的电脑来说不仅浪费了硬件资源,而且每次跑代码都需要在后面加上这一个选项,并修改所有使用到GPU的语句,因此并不推荐。
2.根源版解决思路
(1)查看原有的pytorch包类型,找到Anaconda文件夹中site-packages文件:
比如我的是存放在:D:\ProgramData\Anaconda3\Lib\site-packages 路径下的,结果如下:
可以看到大多都是cpu类型的,难怪会报错。所以我们将其全部删除并前往pytorch官网下载对应版本。(地址:https://pytorch.org/get-started/locally/#no-cuda-1)
(2)查找CUDA版本对应的pytorch包类型
可以看到11.3版本的CUDA需要三个包,序号4是地址(后面要用这个)。
如果发现没有相应的CUDA类型,可到点击install previous versions of PyTorch选项进入查找:
比如我是windows下11.2的CUDA,因为匹配不到对应的型号,所以安装11.1对应的pytorch类型即可。
注意:此步pytorch类型一定要严格和CUDA的版本对应。因为pytorch官方没有给出对应的11.2版本,我在查阅资料后才使用11.1版本对应的pytorch。
(3)下载相应的包
此处推荐以包的形式进入序号4中的地址分别下载:https://download.pytorch.org/whl/torch_stable.html
当然也可以通过fanqiang或换源的方式在cmd控制台中直接输入命令下载,但可能因为网速原因会下载不成功:
pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
以CUDA11.2版本举例,参照上图,共有以下的三个包:
torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0
进入地址页面发现长长的一串,下面以此句为例解释说明各字段含义:
cu111/torch-1.9.0%2Bcu111-cp39-cp39-win_amd64.whl
其中cu111表示cuda10.1 ,cp39表示CPython 3.9 版,win_amd64表示这是为 64 位 Windows 编译的。详细说明请参照:python下载包文件名中一些常见字段的含义_云隐雾匿的博客-CSDN博客
那么如何查看python版本呢?在搜索框中输入cmd,控制台里输入命令即可:
python --version
我的python版本是3.9的,而windows现在一般都是64位的。
准备工作完毕,下面依次下载:
torch==1.9.0+cu111
torchvision==0.10.0+cu111:
torchaudio==0.9.0:
最后找到刚下载的三个包,将它们复制到site-packages文件夹下,也就是之前你删除不正确的pytorch包的地方。
在jupyter notebook中输入下列语句:
python
import torch
torch.cuda.is_available()
如果输出结果为True,那么恭喜你,已经大功告成了。