运行时错误:尝试在 CUDA 设备上反序列化对象

Jos*_*ua 21 python machine-learning computer-vision python-2.7 python-3.x

我遇到了RunTimeError一段时间试图在我机器的 CPU 而不是 GPU 中运行代码的情况。代码最初来自这个 GitHub 项目 - IBD: Interpretable Basis Decomposition for Visual Explanation。这是一个研究项目。我尝试将 CUDA 作为false并查看此网站上的其他解决方案。

GPU = False               # running on GPU is highly suggested
CLEAN = False             # set to "True" if you want to clean the temporary large files after generating result
APP = "classification"    # Do not change! mode choide: "classification", "imagecap", "vqa". Currently "imagecap" and "vqa" are not supported.
CATAGORIES = ["object", "part"]   # Do not change! concept categories that are chosen to detect: "object", "part", "scene", "material", "texture", "color"

CAM_THRESHOLD = 0.5                 # the threshold used for CAM visualization
FONT_PATH = "components/font.ttc"   # font file path
FONT_SIZE = 26                      # font size
SEG_RESOLUTION = 7                  # the resolution of cam map
BASIS_NUM = 7                       # In decomposition, this is to decide how many concepts are used to interpret the weight vector of a class.
Run Code Online (Sandbox Code Playgroud)

这是错误:

Traceback (most recent call last):
  File "test.py", line 22, in <module>
    model = loadmodel()
  File "/home/joshuayun/Desktop/IBD/loader/model_loader.py", line 48, in loadmodel
    checkpoint = torch.load(settings.MODEL_FILE)
  File "/home/joshuayun/.local/lib/python3.6/site-packages/torch/serialization.py", line 387, in load
    return _load(f, map_location, pickle_module, **pickle_load_args)
  File "/home/joshuayun/.local/lib/python3.6/site-packages/torch/serialization.py", line 574, in _load
    result = unpickler.load()
  File "/home/joshuayun/.local/lib/python3.6/site-packages/torch/serialization.py", line 537, in persistent_load
    deserialized_objects[root_key] = restore_location(obj, location)
  File "/home/joshuayun/.local/lib/python3.6/site-packages/torch/serialization.py", line 119, in default_restore_location
    result = fn(storage, location)
  File "/home/joshuayun/.local/lib/python3.6/site-packages/torch/serialization.py", line 95, in _cuda_deserialize
    device = validate_cuda_device(location)
  File "/home/joshuayun/.local/lib/python3.6/site-packages/torch/serialization.py", line 79, in validate_cuda_device
    raise RuntimeError('Attempting to deserialize object on a CUDA '
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.
Run Code Online (Sandbox Code Playgroud)

Ban*_*ras 29

只是给出一个较小的答案。为了解决这个问题,你可以改变命名的函数的参数load()serialization.py的文件。这存储在:./site-package/torch/serialization.py

写:

def load(f, map_location='cpu', pickle_module=pickle, **pickle_load_args):
Run Code Online (Sandbox Code Playgroud)

代替:

def load(f, map_location=None, pickle_module=pickle, **pickle_load_args):
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。


Bip*_*Das 22

如果您没有 gpu,则使用map_location=torch.device('cpu')和 load model.load()

my_model = net.load_state_dict(torch.load('classifier.pt', map_location=torch.device('cpu')))
Run Code Online (Sandbox Code Playgroud)


Spi*_*ong 18

我尝试在加载函数中添加“map_location='cpu'”,但它对我不起作用。

如果您在仅使用 CPU 的计算机上使用由 GPU 训练的模型,那么您可能会遇到此错误。您可以尝试这个解决方案。

解决方案

class CPU_Unpickler(pickle.Unpickler):
    def find_class(self, module, name):
        if module == 'torch.storage' and name == '_load_from_bytes':
            return lambda b: torch.load(io.BytesIO(b), map_location='cpu')
        else: return super().find_class(module, name)

contents = CPU_Unpickler(f).load()
Run Code Online (Sandbox Code Playgroud)


小智 6

“如果您在仅使用 CPU 的机器上运行,请使用带有 map_location=torch.device('cpu') 的 torch.load 将您的存储映射到 CPU。”

model = torch.load('model/pytorch_resnet50.pth',map_location ='cpu')
Run Code Online (Sandbox Code Playgroud)


小智 6

您可能需要重新安装您所需的 CUDA Toolkit 版本的 torch。

从入门页面查找命令并重新安装。

# uninstall first
pip uninstall torch torchvision torchaudio

# e.g. for CUDA Toolkit 1.8
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以在加载时使用 torch.load 的 map_location 参数重新映射 Tensor 位置。

在以下存储库中,在文件“test.py”中,model = loadmodel() 调用 model_loader.py 文件以使用 torch.load() 加载模型。

虽然这只会映射来自 GPU0 的存储,但添加 map_location:

torch.load(settings.MODEL_FILE, map_location={'cuda:0': 'cpu'})
Run Code Online (Sandbox Code Playgroud)

在 model_loader.py 文件中,添加 map_location={'cuda:0': 'cpu'} 任何地方,torch.load() 函数被调用。


sta*_*an0 4

当您陈述问题时,提示您正在尝试在非 cuda 机器上使用 cuda 模型。请注意错误消息的详细信息 - please use torch.load with map_location='cpu' to map your storages to the CPU。当我尝试在我的仅 cpu 机器上加载(从检查点)预训练模型时,我遇到了类似的问题。该模型是在 cuda 机器上训练的,因此无法正确加载。一旦我将map_location='cpu'参数添加到load方法中,一切就正常了。

  • 情况可能并非如此。尽管我在训练过的同一台 GPU 机器上运行模型,但我还是遇到了这个问题。 (2认同)