【问题标题】:RuntimeError: Attempting to deserialize object on a CUDA deviceRuntimeError:尝试反序列化 CUDA 设备上的对象
【发布时间】:2019-10-15 13:34:21
【问题描述】:

当我尝试在机器的 CPU 而不是 GPU 中运行代码时,我遇到了 RunTimeError。代码最初来自这个 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.

这是错误:

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.

【问题讨论】:

  • 为清晰起见编辑了问题。

标签: python python-3.x python-2.7 machine-learning computer-vision


【解决方案1】:

没有什么对我有用- 我的泡菜是一个自定义对象-在脚本文件中的行

device = torch.device("cuda")

最后,我设法采用 Spikes solution,并通过简单的 open(path,"rb") 使其适应我的需求,因此对于其他不幸的开发者来说:

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(open(path,"rb")).load()

【讨论】:

    【解决方案2】:

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

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

    solution

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

    【讨论】:

    • 谢谢!非常有用,我打开另一个(登录的)浏览器配置文件只是为了回来投票。 :-)
    • 由于某种原因,每当我使用它时,torch 都会忽略map_location=torch.device("cpu"),但这有效!
    【解决方案3】:

    由于某种原因,portainer 也会发生这种情况,即使您的机器有 GPU。一个粗略的解决方案是重新启动它。如果您在部署容器后摆弄容器的状态(例如,在容器运行时更​​改重启策略),通常会发生这种情况,这让我认为这是一些搬运工问题。

    【讨论】:

      【解决方案4】:

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

      model = torch.load('model/pytorch_resnet50.pth',map_location ='cpu')
      

      【讨论】:

      • 这对我有用。试图将 PyTorch 模型序列化和反序列化为泡菜,这在 OP 的问题中出现了错误,并导致我得到了这个答案
      【解决方案5】:

      我遇到了同样的问题,我没有修改昨天运行良好的现有代码,而是首先检查我的 GPU 是否空闲

      nvidia-smi

      我可以看到,它没有得到充分利用,因此作为传统解决方案,我关闭笔记本电脑并重新启动它,它开始工作了。

      (我牢记一件事,早些时候它可以工作,我没有更改代码中的任何内容,因此一旦我重新启动它并且它开始工作并且我能够使用 GPU,它应该可以工作)

      【讨论】:

        【解决方案6】:

        如果您没有 gpu,请使用 ma​​p_location=torch.device('cpu') 和 load model.load()

        my_model = net.load_state_dict(torch.load('classifier.pt', map_location=torch.device('cpu')))
        

        【讨论】:

          【解决方案7】:

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

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

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

          torch.load(settings.MODEL_FILE, map_location={'cuda:0': 'cpu'})
          

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

          【讨论】:

            【解决方案8】:

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

            写:

            def load(f, map_location='cpu', pickle_module=pickle, **pickle_load_args):
            

            代替:

            def load(f, map_location=None, pickle_module=pickle, **pickle_load_args):
            

            希望对你有帮助。

            【讨论】:

              【解决方案9】:

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

              【讨论】:

              • 可能并非如此。尽管我在训练过的同一台 GPU 机器上运行模型,但我遇到了这个问题。
              • 我也在 GPU 机器上看到了这个错误,torch.cuda.is_available() --&gt; True
              猜你喜欢
              • 1970-01-01
              • 2021-06-17
              • 2020-09-17
              • 2023-02-16
              • 2014-12-19
              • 1970-01-01
              • 2011-09-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多