You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何反序列化含未转CPU的PyTorch模型的Pickle字典?

解决CUDA模型字典反序列化失败的问题

方法一:使用torch.load指定map_location

虽然你用Pickle保存的字典,但PyTorch张量(包括模型参数)的序列化格式与torch.load兼容。直接用torch.load加载并指定map_location为CPU,就能自动将所有CUDA张量映射到CPU:

import torch
import pickle

with open("你的文件路径.pkl", "rb") as f:
    loaded_dict = torch.load(f, map_location=torch.device('cpu'))

加载完成后,字典内的模型和所有张量都会自动切换到CPU设备,可正常使用。

方法二:自定义Pickle反序列化钩子

如果必须使用pickle.load,可以注册一个对象钩子,在反序列化时自动将CUDA张量转成CPU张量:

import pickle
import torch

def convert_cuda_to_cpu(obj):
    if isinstance(obj, torch.Tensor) and obj.is_cuda:
        return obj.cpu()
    return obj

with open("你的文件路径.pkl", "rb") as f:
    loaded_dict = pickle.load(f, object_hook=convert_cuda_to_cpu)

这个钩子会遍历反序列化的每个对象,仅处理CUDA张量,其余内容保持原样。加载后若需使用模型,可手动执行loaded_dict["你的模型键"].cpu()确保模型完全在CPU上。

关键提示

  • 两种方法都能解决CPU环境下的反序列化问题,优先推荐方法一,因为torch.load对PyTorch对象的兼容性更好。
  • 若字典内包含其他CUDA相关非张量对象,需针对性扩展钩子函数,但绝大多数场景下上述方法足够覆盖需求。

内容的提问来源于stack exchange,提问作者user202542

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:52:06