最近在微调 ChatGLM3-6b 时,训练好模型之后,调用inference_hf.py
函数验证模型的时候报了如下错误,下面是解决方案。
我在训练时使用的是ptuning_v2.yaml
配置文件,训练运行代码如下:
CUDA_VISIBLE_DEVICES=1 python finetune_hf.py data/AdvertiseGen_fix/ ../chatglm3-6b configs/ptuning_v2.yaml
错误信息
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/admin/ChatGLM3-6B/ChatGLM3/finetune_demo/inference_hf.py:50 in main │
│ │
│ 47 │ │ model_dir: Annotated[str, typer.Argument(help='')], │
│ 48 │ │ prompt: Annotated[str, typer.Option(help='')], │
│ 49 ): │
│ ❱ 50 │ model, tokenizer = load_model_and_tokenizer(model_dir) │
│ 51 │ response, _ = model.chat(tokenizer, prompt) │
│ 52 │ print(response) │
│ 53 │
│ │
│ /home/admin/ChatGLM3-6B/ChatGLM3/finetune_demo/inference_hf.py:30 in load_model_and_tokenizer │
│ │
│ 27 def load_model_and_tokenizer(model_dir: Union[str, Path]) -> tuple[ModelType, TokenizerT │
│ 28 │ model_dir = _resolve_path(model_dir) │
│ 29 │ if (model_dir / 'adapter_config.json').exists(): │
│ ❱ 30 │ │ model = AutoPeftModelForCausalLM.from_pretrained( │
│ 31 │ │ │ model_dir, trust_remote_code=True, device_map='auto' │
│ 32 │ │ ) │
│ 33 │ │ tokenizer_dir = model.peft_config['default'].base_model_name_or_path │
│ │
│ /home/admin/anaconda3/envs/chatglm/lib/python3.10/site-packages/peft/auto.py:123 in │
│ from_pretrained │
│ │
│ 120 │ │ │ ) │
│ 121 │ │ │
│ 122 │ │ if tokenizer_exists: │
│ ❱ 123 │ │ │ tokenizer = AutoTokenizer.from_pretrained( │
│ 124 │ │ │ │ pretrained_model_name_or_path, trust_remote_code=kwargs.get("trust_remot │
│ 125 │ │ │ ) │
│ 126 │ │ │ base_model.resize_token_embeddings(len(tokenizer)) │
│ │
│ /home/admin/anaconda3/envs/chatglm/lib/python3.10/site-packages/transformers/models/auto/tokeniz │
│ ation_auto.py:810 in from_pretrained │
│ │
│ 807 │ │ │ _ = kwargs.pop("code_revision", None) │
│ 808 │ │ │ if os.path.isdir(pretrained_model_name_or_path): │
│ 809 │ │ │ │ tokenizer_class.register_for_auto_class() │
│ ❱ 810 │ │ │ return tokenizer_class.from_pretrained( │
│ 811 │ │ │ │ pretrained_model_name_or_path, *inputs, trust_remote_code=trust_remote_c │
│ 812 │ │ │ ) │
│ 813 │ │ elif config_tokenizer_class is not None: │
│ │
│ /home/admin/anaconda3/envs/chatglm/lib/python3.10/site-packages/transformers/tokenization_utils_ │
│ base.py:2048 in from_pretrained │
│ │
│ 2045 │ │ │ else: │
│ 2046 │ │ │ │ logger.info(f"loading file {file_path} from cache at {resolved_vocab_fil │
│ 2047 │ │ │
│ ❱ 2048 │ │ return cls._from_pretrained( │
│ 2049 │ │ │ resolved_vocab_files, │
│ 2050 │ │ │ pretrained_model_name_or_path, │
│ 2051 │ │ │ init_configuration, │
│ │
│ /home/admin/anaconda3/envs/chatglm/lib/python3.10/site-packages/transformers/tokenization_utils_ │
│ base.py:2287 in _from_pretrained │
│ │
│ 2284 │ │ │
│ 2285 │ │ # Instantiate the tokenizer. │
│ 2286 │ │ try: │
│ ❱ 2287 │ │ │ tokenizer = cls(*init_inputs, **init_kwargs) │
│ 2288 │ │ except OSError: │
│ 2289 │ │ │ raise OSError( │
│ 2290 │ │ │ │ "Unable to load vocabulary from file. " │
│ │
│ /root/.cache/huggingface/modules/transformers_modules/checkpoint-3000/tokenization_chatglm.py:10 │
│ 8 in __init__ │
│ │
│ 105 │ │ │ "<pad>": self.tokenizer.pad_id │
│ 106 │ │ } │
│ 107 │ │ self.encode_special_tokens = encode_special_tokens │
│ ❱ 108 │ │ super().__init__(padding_side=padding_side, clean_up_tokenization_spaces=clean_u │
│ 109 │ │ │ │ │ │ encode_special_tokens=encode_special_tokens, │
│ 110 │ │ │ │ │ │ **kwargs) │
│ 111 │
│ │
│ /home/admin/anaconda3/envs/chatglm/lib/python3.10/site-packages/transformers/tokenization_utils. │
│ py:363 in __init__ │
│ │
│ 360 │ │ self._added_tokens_encoder: Dict[str, int] = {k.content: v for v, k in self._add │
│ 361 │ │ │
│ 362 │ │ # 4 init the parent class │
│ ❱ 363 │ │ super().__init__(**kwargs) │
│ 364 │ │ │
│ 365 │ │ # 4. If some of the special tokens are not part of the vocab, we add them, at th │
│ 366 │ │ # the order of addition is the same as self.SPECIAL_TOKENS_ATTRIBUTES following │
│ │
│ /home/admin/anaconda3/envs/chatglm/lib/python3.10/site-packages/transformers/tokenization_utils_ │
│ base.py:1603 in __init__ │
│ │
│ 1600 │ │ # Stores a Jinja template that formats chat histories into tokenizable strings │
│ 1601 │ │ self.chat_template = kwargs.pop("chat_template", None) │
│ 1602 │ │ │
│ ❱ 1603 │ │ super().__init__(**kwargs) │
│ 1604 │ │
│ 1605 │ @property │
│ 1606 │ def max_len_single_sentence(self) -> int: │
│ │
│ /home/admin/anaconda3/envs/chatglm/lib/python3.10/site-packages/transformers/tokenization_utils_ │
│ base.py:861 in __init__ │
│ │
│ 858 │ │ │ │ │ ), "One of the tokens is not a string or an AddedToken" │
│ 859 │ │ │ │ │ setattr(self, key, value) │
│ 860 │ │ │ │ elif isinstance(value, (str, AddedToken)): │
│ ❱ 861 │ │ │ │ │ setattr(self, key, value) │
│ 862 │ │ │ │ else: │
│ 863 │ │ │ │ │ raise TypeError(f"Special token {key} has to be either str or AddedT │
│ 864 │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
AttributeError: can't set attribute 'eos_token'
解决办法
- 找到模型保存文件夹中的
tokenizer_config.json
。路径为:../output/checkpoint-xxxx/tokenizer_config.json
- 编辑
tokenizer_config.json
,删除其中的eos_token
、pad_token
、unk_token
就可以了
注意:删除这三项后,要删除最后一行最后面的逗号!
重新运行代码,即可运行模型:
python inference_hf.py your_finetune_path --prompt your prompt