raise ValueError(f'mutable default {type(f.default)} for field ' ValueError: mut

320 阅读1分钟

报错代码来源

THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 (github.com)

版本(2024.1.31) 5293ef2

报错信息

Traceback (most recent call last):
  File "xxxg/yyy/ChatGLM3/finetune_demo/finetune_hf.py", line 146, in <module>
    @dc.dataclass
     ^^^^^^^^^^^^
  File "xxxg/anaconda3/envs/zzz/lib/python3.11/dataclasses.py", line 1230, in dataclass
    return wrap(cls)
           ^^^^^^^^^
  File "xxxg/anaconda3/envs/zzz/lib/python3.11/dataclasses.py", line 1220, in wrap
    return _process_class(cls, init, repr, eq, order, unsafe_hash,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "xxxg/anaconda3/envs/zzz/lib/python3.11/dataclasses.py", line 958, in _process_class
    cls_fields.append(_get_field(cls, name, type, kw_only))
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "xxxg/anaconda3/envs/zzz/lib/python3.11/dataclasses.py", line 815, in _get_field
    raise ValueError(f'mutable default {type(f.default)} for field '
ValueError: mutable default <class 'transformers.training_args_seq2seq.Seq2SeqTrainingArguments'> for field training_args is not allowed: use default_factory

环境

python=3.11

报错原因

没在issue里搜到,推测是python3.11的dataclasses有变化 按照报错提示,将报错位置下的

training_args: Seq2SeqTrainingArguments = dc.field(
    default=Seq2SeqTrainingArguments(output_dir='./output')
)

修改为:

training_args: Seq2SeqTrainingArguments = dc.field(
    default_factory=Seq2SeqTrainingArguments(output_dir='./output')
)

然后就可以正常运行拉!