解决RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is F

报错问题:

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=torch.device('cpu') to map your storages to the CPU.

解决方法:

这个错误通常是由于在 CPU 机器上尝试加载在 GPU 上保存的 PyTorch 模型导致的。

为了解决这个问题,你需修改你的代码如下:要在加载模型时指定 map_location 参数,将模型映射到 CPU 设备上。

修改你的代码如下:

import torch  

# 加载模型  
model = torch.load('path/to/model.pth', map_location=torch.device('cpu'))

### 解决方案 当遇到 `RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False` 错误时,通常是因为 PyTorch 尝试加载一个存储在 GPU 上的模型权重文件,而当前环境中并未检测到可用的 CUDA 设备。 #### 方法一:仅适用于 CPU 环境 如果当前环境只支持 CPU,则可以通过指定参数 `map_location=torch.device('cpu')` 来将模型加载至 CPU。以下是修正后的代码示例: ```python import torch # 加载模型并映射到 CPU model = torch.load('textCNN.p', map_location=torch.device('cpu')) model.eval() ``` 通过上述方法可以有效避免因缺少 CUDA 支持而导致的错误[^2]。 --- #### 方法二:适用于 GPU 环境 如果当前环境具备 GPU 和 CUDA 支持,但仍出现该错误,可能的原因包括: 1. **CUDA 版本与 PyTorch 不匹配** 需要确认安装的 PyTorch 版本是否兼容当前系统的 CUDA 版本。可通过以下命令验证: ```python import torch print(torch.version.cuda) # 查看 PyTorch 使用的 CUDA 版本 print(torch.cuda.is_available()) # 检查是否有可用的 CUDA 设备 ``` 2. **初始化 CUDA 状态** 若发现 `torch.cuda.is_available()` 返回 `False` 或其他异常状态,可尝试手动设置 `_initialized` 属性为 `True`,如下所示: ```python import torch torch.cuda._initialized = True ``` 3. **动态适配设备类型** 可以根据实际硬件条件自动选择设备(CPU 或 GPU)。例如: ```python import torch device = 'cuda' if torch.cuda.is_available() else 'cpu' model = torch.load('textCNN.p', map_location=device) model.to(device).eval() ``` 对于特殊架构(如 Apple Silicon 的 MPS),需额外判断其可用性,并调整设备名称为 `'mps'`[^5]。 --- #### 完整代码实现 综合以上分析,提供一段通用代码来处理不同场景下的模型加载需求: ```python import torch def load_model(model_path): """ 动态加载模型,适应不同的计算设备。 参数: model_path (str): 模型路径 返回: model: 已加载的模型实例 """ # 自动检测设备类型 if torch.cuda.is_available(): device = torch.device('cuda') elif torch.backends.mps.is_available(): # 对于 Apple Silicon 用户 device = torch.device('mps') else: device = torch.device('cpu') # 加载模型并移动到目标设备 model = torch.load(model_path, map_location=device) model.to(device).eval() return model # 调用函数 model = load_model('textCNN.p') print(f"Model loaded successfully and moved to {next(model.parameters()).device}") ``` --- ### 注意事项 - 如果仍然无法解决问题,请检查是否存在多个版本的 PyTorch 并清理冲突依赖项。 - 确认所使用的 `.pth` 文件确实是由相同框架版本训练得到,否则可能导致进一步的不兼容问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值