AttributeError:模块“cupy”没有属性“scatter_add”

Posted

技术标签:

【中文标题】AttributeError:模块“cupy”没有属性“scatter_add”【英文标题】:AttributeError: module 'cupy' has no attribute 'scatter_add' 【发布时间】:2021-05-04 12:14:30 【问题描述】:

当尝试运行一个模型进行 spacy NER 训练时

spacy.require_gpu()

我收到了这个错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-6-a86608cac558> in <module>
      3 
      4 start_time = time.time()
----> 5 train_model(data)

<ipython-input-2-10f04ac303a6> in train_model(train_data)
     82     other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
     83     with nlp.disable_pipes(*other_pipes):
---> 84         optimizer = nlp.begin_training()
     85         for itn in range(1):
     86             print("Starting iteration " + str(itn))

c:\users\aventus\envs\py38\lib\site-packages\spacy\language.py in begin_training(self, get_gold_tuples, sgd, component_cfg, **cfg)
    623                 kwargs = component_cfg.get(name, )
    624                 kwargs.update(cfg)
--> 625                 proc.begin_training(
    626                     get_gold_tuples,
    627                     pipeline=self.pipeline,

nn_parser.pyx in spacy.syntax.nn_parser.Parser.begin_training()

_parser_model.pyx in spacy.syntax._parser_model.ParserModel.begin_training()

c:\users\aventus\envs\py38\lib\site-packages\thinc\check.py in checked_function(wrapped, instance, args, kwargs)
    154                     raise ExpectedTypeError(check, ["Callable"])
    155                 check(arg_id, fix_args, kwargs)
--> 156         return wrapped(*args, **kwargs)
    157 
    158     def arg_check_adder(func):

c:\users\aventus\envs\py38\lib\site-packages\thinc\neural\_classes\model.py in begin_training(self, train_X, train_y, **trainer_cfg)
    120     def begin_training(self, train_X, train_y=None, **trainer_cfg):
    121         for hook in self.on_data_hooks:
--> 122             hook(self, train_X, train_y)
    123         return self.Trainer(self, **trainer_cfg)
    124 

c:\users\aventus\envs\py38\lib\site-packages\spacy\_ml.py in <lambda>(model, X, y)
    149 
    150 @describe.on_data(
--> 151     _set_dimensions_if_needed, lambda model, X, y: model.init_weights(model)
    152 )
    153 @describe.attributes(

c:\users\aventus\envs\py38\lib\site-packages\spacy\_ml.py in init_weights(model)
    268         t_i = 0
    269         for t_i in range(t_max):
--> 270             acts1 = predict(ids, tokvecs)
    271             var = model.ops.xp.var(acts1)
    272             mean = model.ops.xp.mean(acts1)

c:\users\aventus\envs\py38\lib\site-packages\spacy\_ml.py in predict(ids, tokvecs)
    254                 (hiddens.shape[0] * model.nF, model.nO * model.nP)
    255             )
--> 256             model.ops.scatter_add(vectors, ids.flatten(), hiddens)
    257             vectors = vectors.reshape((vectors.shape[0], model.nO, model.nP))
    258             vectors += model.b

ops.pyx in thinc.neural.ops.CupyOps.scatter_add()

c:\users\aventus\envs\py38\lib\site-packages\cupy\__init__.py in __getattr__(name)
    873         value = _deprecated_attrs.get(name)
    874         if value is None:
--> 875             raise AttributeError(
    876                 f"module 'cupy' has no attribute name!r")
    877         attr, eq_attr = value

AttributeError: module 'cupy' has no attribute 'scatter_add'

用于训练模型的数据是 spacy NER 的标注。

运行 spacy.require_gpu() 时得到这个:

Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>import spacy
>>>spacy.require_gpu()
True
操作系统 - Windows 10 Python 3.8 spacy 2.2.4 cupy 9.0.0 Nvidia 驱动程序版本:466.11 CUDA 版本:11.1 NVIDIA GeForce GTX 1660Ti

如何摆脱这个错误?任何帮助将不胜感激。

【问题讨论】:

看起来an older version of cupy 曾经有cupy.scatter_add() latest version of cupy 似乎有它作为cupyx.scatter_add()。切换到旧版本的 cupy(可能在 8.0 之前)或者重构 spacy NER 代码以使用 cupyx.scatter_add()。您还没有给出 spacy NER 代码的链接或任何内容,所以我想我的建议就到此为止了。 如果您按照他们的说明在干净的机器上仔细安装 spacy,您可能会自动获得正确版本的 cupy。 我使用 pip install -U spacy 在虚拟环境中安装了 spacy 并使用 pip install cupy-cuda111 分别安装了 cupy 这可能是导致此问题的原因。 那我该怎么办? 【参考方案1】:

有几个选项可以避免此错误:

将 cupy 降级为 cupy&lt;8.0.0 (pip install "cupy-cuda110&lt;8.0.0") 将 spacy 升级到 v2.3.5+

从 cmets 我不知道您是如何从 pip install -U spacy 获得 spacy v2.2.4,但如果您特别不需要该版本,则升级到没有此错误的版本是最简单的解决方案,而较新的版本是兼容cupy v8。

如果您确实需要 spacy v2.2.4(需要 thinc==7.4.0)和更新版本的 cupy,您可以将此补丁应用到 Thinc v7.4.0 并从源安装:

https://github.com/explosion/thinc/pull/441/files#diff-742ac455f5934d8207f38852f68013706e9561e8832a5b7c5b85757fa295b5f0L47-R1090

另见:https://github.com/explosion/spaCy/issues/5380

【讨论】:

非常感谢您的回复。我在安装 req.txt 时得到了这个版本的 spacy。但是我无法正确配置 gpu。

以上是关于AttributeError:模块“cupy”没有属性“scatter_add”的主要内容,如果未能解决你的问题,请参考以下文章

Chainer 模块“cupy.cudnn”没有属性“softmax_forward”

Python 模块 Cupy 函数在使用 cupy.einsum() 时出错

如何更新 cupy/CUDA 以使其再次工作并修复我的 conda 环境?

AttributeError:模块 'dbus' 没有属性 'lowlevel'

AttributeError:模块'keras'没有属性'initializers'

AttributeError:模块'asyncio'没有属性'run'