Pytorch 用CPU加载pickle保存的GPU张量?

Pytorch 用CPU加载pickle保存的GPU张量?,pytorch,gpu,cpu,Pytorch,Gpu,Cpu,我使用GPU上的pickle保存了最后一个隐藏的Bert层,以备后续处理 # output is the last hidden layer of bert, transformed on GPU with open(filename, 'wb') as f: pk.dump(output, f) 可以在没有GPU的情况下将其加载到我的个人笔记本电脑上吗?我尝试了以下代码,但都失败了 # 1st try with open(filename, 'rb') as f: torch

我使用GPU上的pickle保存了最后一个隐藏的Bert层,以备后续处理

# output is the last hidden layer of bert, transformed on GPU
with open(filename, 'wb') as f:
    pk.dump(output, f)
可以在没有GPU的情况下将其加载到我的个人笔记本电脑上吗?我尝试了以下代码,但都失败了

# 1st try
with open(filename, 'rb') as f:
    torch.load(f, map_location='cpu')

# 2nd
torch.load(filename, map_location=torch.device('cpu'))
所有人都会得到以下错误

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.

可以将文件加载到我的笔记本电脑上吗?

如果您使用Pytork,您可以通过保存模型的
状态而不是模型本身来避免一些麻烦。
state\u dict
是一个有序字典,用于存储神经网络的权重

保存例程:

import torch
model = MyFabulousPytorchModel()
torch.save(model.state_dict(), "best_model.pt")
加载它需要您首先初始化模型:

import torch
device = 'cuda' if torch.cuda.is_available() else 'gpu' 
model = MyFabulousPytorchModel()
model.load_state_dict(torch.load(PATH_TO_MODEL))
model.device(device)
保存
状态_dict
而不是直接保存对象有许多优点。其中之一与您的问题有关:将您的模型移植到不同的环境并不像您希望的那样轻松。另一个优点是,保存检查点要容易得多,这些检查点允许您恢复训练,就好像训练从未停止过一样。您只需保存优化器的状态和损失:

保存检查点:

# somewhere in your training loop:
opt.zero_grad()
pred = model(x)
loss = loss_func(pred, target)

torch.save({"model": model.state_dict(), "opt": opt.state_dict(), "loss":loss}, "checkpoing.pt")
我强烈建议查看文档,以了解有关如何使用pytorch保存和加载模型的更多信息。如果你了解它的内部运作,这是一个相当顺利的过程

希望这有帮助()

编辑:

更直接地说,为了解决您的问题,我推荐以下内容

1-在用于训练模型的计算机上:

import torch
model = torch.load("PATH_TO_MODEL")
torch.save(model.state_dict(), "PATH.pt")
2-在另一台计算机上:

import torch
from FILE_WHERE_THE_MODEL_CLASS_IS_DEFINED import Model

model = Model() # initialize one instance of the model)
model.load_state_dict(torch.load("PATH.pt")

我腌制了一个cuda张量,我想把它加载到CPU上。使用OP给出的相同的两种方法是行不通的。如果不是
状态_dict()
,可以做什么?我使用pickle.dump(f'some_cuda_tensor.pkl')保存了文件。