in <module>报错_pytorch报错消息及其解决纪录

本文记录了PyTorch使用中遇到的多种错误,包括在指定优化器变量时的错误、CUDA相关问题、计算图错误、版本迭代警告以及CUDNN错误。提供了解决方案,例如将列表转换为Tensor,确保权重和输入类型一致,避免in-place操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言: 本文主要记载在pytorch使用过程中遇到的一些报错以及解决方案等,在以前的文章[1]中,主要涉及的是比较容易出现的原理上的,或者难以发现的bug,而这里的主要是系统抛出的error或者warning的解决方法,其各有侧重,欢迎各位贡献idea。如有谬误,请联系指出,如需转载,请注明出处,谢谢。

联系方式:

e-mail: FesianXu@gmail.com

QQ: 973926198

github: https://github.com/FesianXu


在指定优化器的优化变量时

  • 1 pytorch 版本号: 1.0.0 with python 3.6.1 报错内容: optimizer can only optimize Tensors, but one of the params is list 原因:在指定优化器的优化变量时,其必须是一个可迭代的参数对象或者是一个定义了优化组的字典[3],具体见[4]的操作。这个可迭代的参数对象一般可以是list解决方案:将所有需要优化的对象用list进行包裹,如:
trained_vars = list(model.submodel_1.parameters()) + 
               list(model.submodel_2.parameters())
opt = torch.optim.SGD(trained_vars, lr=...)

注意到此时的trained_vars是一个可迭代的list,其中每个元素都是一个参数组。


CUDA相关

  • 1 报错内容:RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same 版本: 1.0.0 with python 3.6.1 原因:有部分变量未加载进入显存,注意,在如下情况
class model(nn.Module):
 def __init__(self):
  super().__init__()
  self.convs = [
   nn.Conv2d(...),
   nn.Conv2d(...)
  ]

m = model().cuda()

此时convs因为只是个list而不是集成了nn.Module的对象,因此是不会被迭代地放置到GPU中的,model().cuda()这种方式只会对model类中的__init__()方法中定义的继承了nn.Module的类的实例有效。 解决方法

self.convs = [
 nn.Conv2d(...),
 nn.Conv2d(...)
]
self.convs = nn.ModuleList(self.convs)

  • 2 报错内容:RuntimeError: cuDNN error: CUDNN_STATUS_BAD_PARAM 版本: pytorch 1.0 原因: 输入的tensor的数据类型不匹配,应该是torch.float32() 解决方法
inputv = inputv.float()
model(inputv)

pytorch计算图相关

  • 1 报错内容:RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation 版本: 1.0.0 with python 3.6.1 原因: 注意到有些操作属于in-place操作,比如x += 1,x[0] = 5等,这类操作如果是在如下情况发生的:
c = x+b
x += 1

compute_gradient(ys=c, xs=x)

如果此时cx对梯度,而x的值已经在后续的计算中发生了in-place的变化,那么就会导致出错[5]

解决方案:将x += 1改成x = x+1即可解决。

补充: x += 1pytorch中是一个in-place操作,所谓in-place就是进行了该操作是对该变量直接进行处理后返回的,也就是说该变量的地址是不会改变的,只是值变了而已;而非in-place操作就是,在内存中另外开辟了一个空间存放新的值,然后将指针指向那个新的地址,在这种情况下,该变量的地址是会改变的。下面是一个例子:

In [1]: import torch
In [2]: a = torch.tensor(5)
In [3]: a
Out[3]: tensor(5)
In [4]: id(a)
Out[4]: 139636046877104
In [5]: a += 8
In [6]: a
Out[6]: tensor(13)
In [7]: id(a)
Out[7]: 139636046877104  # inplace操作,其地址不变

In [1]: import torch
In [2]: a = torch.tensor(6)
In [3]: id(a)
Out[3]: 139938915856816
In [4]: a = a+1
In [5]: a
Out[5]: tensor(7)
In [6]: id(a)
Out[6]: 139938915829584 # 非in-place操作,地址不同了

在pytorch中,计算梯度的时候有时候要求前面的相关变量不能被in-place操作改变,不然将会导致梯度计算问题,从而报错。


版本迭代

  • 1 警告内容:/pytorch/torch/csrc/autograd/python_function.cpp:622: UserWarning: Legacy autograd function with non-static forward method is deprecated and will be removed in 1.3. Please use new-style autograd function with static forward method. 原因: 自定义层的时候,在新的版本的pytorch中将会抛弃旧的用法,旧的用法指的是其forward方法为非静态方法,在1.3版本之后,forward方法要求定义成静态方法,具体参考[6]。

CUDNN相关

  • 1 报错信息: RuntimeError: cuDNN error: CUDNN_STATUS_MAPPING_ERROR 原因: 原因不明,偶尔会触发,但是又不是进程性的,一般和代码无关,可能是CuDNN的bug,见[9] 解决方法: 在代码中添加torch.backends.cudnn.enabled = False
import torch
torch.backends.cudnn.enabled = False

# your code here

6de49129fd97b687958d00a6e119d915.png

其他

  • 1 报错内容:undefined symbol: THPVariableClass 原因: 在导入某些和pytorch有关的第三方包时,如果先导入第三方包,容易发生这种错误,正确的做法是首先导入pytorch,例如:[7]
import torch
import your_extension
  • 2 报错内容: CUDA error 59: Device-side assert triggered 原因: 这个运行时错误太经典了,经常是因为定义的分类器的输出类别和标签的数量不匹配,比如分类器输出100个类,而期待的标签范围应该是[0,99],如果你输入一个标签是100,那么就会报出这种错误[8]

Reference

[1]. 用pytorch踩过的坑 [2]. https://discuss.pytorch.org/t/giving-multiple-parameters-in-optimizer/869 [3]. https://pytorch.org/docs/stable/optim.html?highlight=sgd#torch.optim.ASGD [4]. https://blog.youkuaiyun.com/LoseInVain/article/details/81708474 [5]. https://discuss.pytorch.org/t/encounter-the-runtimeerror-one-of-the-variables-needed-for-gradient-computation-has-been-modified-by-an-inplace-operation/836/5 [6]. https://discuss.pytorch.org/t/custom-autograd-function-must-it-be-static/14980 [7]. https://github.com/pytorch/extension-cpp/issues/6 [8]. https://towardsdatascience.com/cuda-error-device-side-assert-triggered-c6ae1c8fa4c3 [9]. https://github.com/pytorch/pytorch/issues/27588#issuecomment-603315518

<think>嗯,用户遇到了在导入PyTorch Lightning时出现的ImportError,错误信息是“cannot import name 'Mapping' from 'collections'”。我需要先分析这个问题可能的原因。根据经验,Python 3.10之后,collections模块中的一些类被移到了collections.abc,所以如果代码中直接从collections导入Mapping,就会出错。PyTorch Lightning可能在某些版本中存在这样的问题,尤其是在较新的Python环境中。 首先,用户可能使用的是Python 3.10或更高版本,而PyTorch Lightning的某个旧版本没有适配这个变化。这时候需要检查PyTorch Lightning的版本,并考虑升级到兼容的版本。另外,用户可能没有正确安装依赖,或者存在版本冲突。解决方法可能包括升级PyTorch Lightning、降级Python版本,或者修改代码中的导入语句。 接下来,我需要验证这些解决方案的有效性。比如,升级到PyTorch Lightning 1.6.0及以上版本是否解决了这个问题。另外,如果用户无法升级,手动替换导入语句是否可行,比如将“from collections import Mapping”改为“from collections.abc import Mapping”。此外,检查Python版本是否过高,可能需要使用3.9版本来避免这个问题。 还要考虑用户的环境配置,比如是否使用了虚拟环境,是否有其他库的依赖冲突。可能需要建议用户创建一个干净的虚拟环境,重新安装最新版本的PyTorch Lightning和相关依赖。同时,提醒用户检查错误发生的具体位置,是否是第三方库的问题,可能需要等待库的更新或寻找替代方案。 最后,确保提供的步骤清晰,用户能够逐步操作,比如具体的pip安装命令,版本号的选择,以及代码修改的位置。同时,引用相关的资料,比如PyTorch Lightning的官方文档或GitHub issue,以增加解决方案的可信度。</think>### 解决方法:PyTorch Lightning ImportError 无法从 'collections' 导入 'Mapping' #### 1. 问题原因分析 该错误通常由Python版本与库的兼容性问题引起。从Python 3.10开始,标准库`collections`中的抽象基类(如`Mapping`)已迁移至`collections.abc`子模块[^1]。若使用的PyTorch Lightning版本未适配此变更,会触发此错误。 #### 2. 解决方案步骤 ##### 方法一:升级PyTorch Lightning PyTorch Lightning >=1.6.0 已修复此问题: ```bash # 升级到最新稳定版 pip install pytorch-lightning --upgrade # 或指定最小兼容版本 pip install "pytorch-lightning>=1.6.0" ``` ##### 方法二:修改Python环境 * 降级Python至3.9.x(推荐使用pyenv管理多版本): ```bash pyenv install 3.9.18 pyenv local 3.9.18 ``` * 或添加代码补丁(临时方案): ```python # 在导入PyTorch Lightning前添加 import collections if not hasattr(collections, 'Mapping'): collections.Mapping = collections.abc.Mapping ``` ##### 方法三:检查依赖冲突 ```bash # 创建干净虚拟环境 python -m venv lightning_env source lightning_env/bin/activate # Linux/macOS lightning_env\Scripts\activate # Windows # 重新安装最新版本 pip install torch pytorch-lightning ``` #### 3. 验证修复 ```python import pytorch_lightning as pl print(pl.__version__) # 应显示>=1.6.0 ``` #### 4. 特殊情况处理 若错误来自其他依赖库(如transformers),需同时升级相关库: ```bash pip install transformers --upgrade ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值