【问题标题】:How to use map_location='cpu' due to "RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False"如何使用 map_location='cpu' 由于“RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False”
【发布时间】:2020-05-15 18:43:11
【问题描述】:

我试图在https://pytorch.org/hub/nvidia_deeplearningexamples_tacotron2/下载以下模型

import torch
tacotron2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2')

我收到了:

>>> import torch
>>> tacotron2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2')
Using cache found in .cache\torch\hub\nvidia_DeepLearningExamples_torchhub
...
  File "Anaconda3\envs\env3_pytorch\lib\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.

所以我将以下内容与map_location='cpu' 一起使用,但仍然得到相同的错误。

>>> tacotron2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2', map_location='cpu')

torch.version.cuda 显示一个版本,但 torch.cuda.is_available() 为假。

>>> import torch
>>> torch.version.cuda
'9.0'
>>> torch.cuda.is_available()
False
  • 当我使用了要求使用的命令错误消息时,如何解决与map_location 相关的错误?

  • 如何使用 cuda 加载模型?

【问题讨论】:

    标签: neural-network pytorch conda


    【解决方案1】:

    torch.hub.load 不具体支持map_location,它只是将额外的参数转发给模型的加载,因此它是否支持取决于实现。

    在这种情况下不支持,加载是在NVIDIA/DeepLearningExamples:torchhub - hubconf.py 中实现的,它不会将任何map_location 传递给torch.load when the checkpoint is loaded

    这意味着您需要手动加载检查点并将其应用于模型。值得庆幸的是,通过设置pretrained=False,可以在不加载检查点的情况下加载相同的模型,并且可以使用支持map_locationtorch.hub.load_state_dict_from_url单独加载检查点。状态字典只需要做一个很小的改变,因为它是用 DistributedDataParallel 训练的,它包装了模块,这样模型中的每个 layer 都变成了 module.layer。在状态字典中,module. 前缀需要被剥离。

    tacotron2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2', pretrained=False)
    
    checkpoint = torch.hub.load_state_dict_from_url('https://api.ngc.nvidia.com/v2/models/nvidia/tacotron2pyt_fp32/versions/1/files/nvidia_tacotron2pyt_fp32_20190306.pth', map_location="cpu")
    
    # Unwrap the DistributedDataParallel module
    # module.layer -> layer
    state_dict = {key.replace("module.", ""): value for key, value in checkpoint["state_dict"].items()}
    
    # Apply the state dict to the model
    tacotron2.load_state_dict(state_dict)
    

    【讨论】:

    • @michale Jungo 所以我理解 hub.load 的问题是 nvidia-github 链接中的 hubconf.py 没有像通常预期的那样实现,对吗?我试过>>> tacotron2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2', pretrained=False)。但我不断收到PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: '.cache\\torch\\hub\\torchhub.zip,即使没有其他进程。这是为什么呢?
    • 我能够使用此链接medium.com/@ron.warshawsky.2009/… 上的指令通过上面的 WinError,但现在我在加载检查点时看到另一个问题:IncompatibleKeys(missing_keys=[], unexpected_keys=[])。做load_state_dict的时候。有什么决议吗? ``` >>> tacotron2.load_state_dict(state_dict) IncompatibleKeys(missing_keys=[], unexpected_keys=[]) >>>```
    • 有没有办法逐层查看模型摘要并以图形形式查看?当我尝试>>> summary(tacotron2) 我得到TypeError: summary() missing 1 required positional argument: 'input_size'
    • 我猜summary() 指的是pytorch-summary。如果是这样,您需要提供要提供给模型的输入大小,因为它需要使用一些虚拟数据运行前向传递来确定实际使用了哪些层。除此之外,如果您直接打印模型,您将获得模块的概览。大多数情况下,这些都是有序的,但任何不按顺序通过它的东西(例如多个分支)都不会被它反映。
    • 我指的是 pytorch-summary,但无法弄清楚 tacotron-2 的 input_size 是什么,或者如何指定模型的输入。
    猜你喜欢
    • 2021-03-26
    • 2021-04-27
    • 1970-01-01
    • 2021-12-24
    • 2021-03-03
    • 2021-07-18
    • 2020-02-01
    • 2020-12-05
    • 2021-01-27
    相关资源
    最近更新 更多