用CPU加载pickle保存的GPU张量



我在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.

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

如果您使用pytorch,您可以通过保存模型的state_dict而不是模型本身来省去一些麻烦。state_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)

保存state_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保存和加载模型的更多信息。如果你了解它的内部工作原理,这是一个相当顺利的过程。https://pytorch.org/tutorials/beginner/saving_loading_models.html#saving-推理的加载模型

希望能有所帮助

编辑:

更直接地说,为了解决您的问题,我建议使用以下

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")

相关内容

最新更新