MindSpore模型推理报错TypeError: cell_reuse() takes 0 positional arguments but 1 was given

1. 系统环境

硬件环境(Ascend/GPU/CPU): Ascend
MindSpore版本: 2.2.0
MF版本: r1.0
执行模式(PyNative/ Graph): 不限

2. 报错信息

2.1 问题描述

使用MindSpore进行模型推理时报错。

2.2 报错信息

ml#keyword-namespace-packages  
    declare_namespace(pkg)  
Traceback (most recent Tcall last):  
    File "pipeline_predict.py", line 5, in <module>  
        from wizardcoder import WizardCoderLMHeadModel  
    File "/home/wizardcoder/2_ wizardcoder-mindformers-1019/research/wizardcoder/wizardcoder.py", line 49, in <module>  
        class WizardcoderLMHeadModel (BaseModel):  
    File "/home/wizardcoder/2_wizardcoder-mindformers-1019/research/wizardcode r/wizardcoder.py", line 59, in Wiza rdcoderLMHeadModel  
        def __init__(self, config:WizardCoderConfig = None):  
TypeError: cell_reuse() takes 0 positional arguments but 1 was given

3. 根因分析

上述报错意思是调用cell_reuse()报错,这是由于mindspore2.2.0版本不支持cell_reuse()这种写法。

4. 解决方案

由于mindspore2.2.0版本不支持cell_reuse()这种写法,所以应该写成cell_reuse,代码如下。

@MindFormerRegister.register(MindFormerModuleType. MODELS)  
class WizardCoderLMHeadModel(BaseModel):  
    r"""..."""  
    @cell_reuse  
    def __init__ (self, config: WizardCoderConfig = None):  
        config = config if config is not None else WizardCoderConfig()  
        super (WizardCoderLMHeadModel, self).__init__(config, auto_prefix=True)  
        self.use_past = config.use_past

装饰器名称改为cell_reuse后如果还是报上面错误,这应该是因为本身环境安装了mindformers旧版本,代码可能调用了安装的旧版本mindformers的功能,导致出错。解决方法是添加调用路径,让cell_reuse调用我们当前的mindformers dev版本:

import os  
import sys  
    
sys.path.append(os.path.abspath("../.."))  
sys.path.insert(0, os.getcwd().split('research')[0])  
    
from mindspore import context  
from mindformers.pipeline import pipeline