li-plus / chatglm.cpp

C++ implementation of ChatGLM-6B & ChatGLM2-6B & ChatGLM3 & GLM4(V)
MIT License
2.93k stars 335 forks source link

transformers>=4.34.0 时 无法转换 codegeex2-6b #190

Closed StrayDragon closed 11 months ago

StrayDragon commented 11 months ago

python 3.11 / Debian12

复现步骤 按照README做到 python3 chatglm_cpp/convert.py... 之前, 然后

HF_ENDPOINT=https://hf-mirror.com
mkdir models
IN=./models
OUT=./models
pip install -U huggingface_hub && huggingface-cli download --resume-download THUDM/codegeex2-6b --local-dir $IN/codegeex2-6b
python3 chatglm_cpp/convert.py -i $IN/codegeex2-6b/ -t q4_0 -o $OUT/codegeex2-6b-ggml-q4_0.bin

报错为

Traceback (most recent call last):
  File "/home/l8ng/chatglm.cpp/chatglm_cpp/convert.py", line 543, in <module>
    main()
  File "/home/l8ng/chatglm.cpp/chatglm_cpp/convert.py", line 537, in main
    convert(f, args.model_name_or_path, dtype=args.type)
  File "/home/l8ng/chatglm.cpp/chatglm_cpp/convert.py", line 469, in convert
    tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/l8ng/chatglm.cpp/.venv/lib/python3.11/site-packages/transformers/models/auto/tokenization_auto.py", line 755, in from_pretrained
    return tokenizer_class.from_pretrained(pretrained_model_name_or_path, *inputs, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/l8ng/chatglm.cpp/.venv/lib/python3.11/site-packages/transformers/tokenization_utils_base.py", line 2024, in from_pretrained
    return cls._from_pretrained(
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/l8ng/chatglm.cpp/.venv/lib/python3.11/site-packages/transformers/tokenization_utils_base.py", line 2256, in _from_pretrained
    tokenizer = cls(*init_inputs, **init_kwargs)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/l8ng/.cache/huggingface/modules/transformers_modules/codegeex2-6b/tokenization_chatglm.py", line 69, in __init__
    super().__init__(padding_side=padding_side, clean_up_tokenization_spaces=clean_up_tokenization_spaces, **kwargs)
  File "/home/l8ng/chatglm.cpp/.venv/lib/python3.11/site-packages/transformers/tokenization_utils.py", line 367, in __init__
    self._add_tokens(
  File "/home/l8ng/chatglm.cpp/.venv/lib/python3.11/site-packages/transformers/tokenization_utils.py", line 467, in _add_tokens
    current_vocab = self.get_vocab().copy()
                    ^^^^^^^^^^^^^^^^
  File "/home/l8ng/.cache/huggingface/modules/transformers_modules/codegeex2-6b/tokenization_chatglm.py", line 112, in get_vocab
    vocab = {self._convert_id_to_token(i): i for i in range(self.vocab_size)}
                                                            ^^^^^^^^^^^^^^^
  File "/home/l8ng/.cache/huggingface/modules/transformers_modules/codegeex2-6b/tokenization_chatglm.py", line 108, in vocab_size
    return self.tokenizer.n_words
           ^^^^^^^^^^^^^^
AttributeError: 'ChatGLMTokenizer' object has no attribute 'tokenizer'. Did you mean: 'tokenize'?

但是 chatglm3-6b 可以转换...

li-plus commented 11 months ago

并没有复现这个报错,我看 Hugging Face 上 codegeex2-6b 的 tokenization_chatglm.py#L73,是有 self.tokenizer 这个成员的,可以检查一下你本地的 /home/l8ng/.cache/huggingface/modules/transformers_modules/codegeex2-6b/tokenization_chatglm.py 跟官方的代码是否有区别?

StrayDragon commented 11 months ago

并没有复现这个报错,我看 Hugging Face 上 codegeex2-6b 的 tokenization_chatglm.py#L73,是有 self.tokenizer 这个成员的,可以检查一下你本地的 /home/l8ng/.cache/huggingface/modules/transformers_modules/codegeex2-6b/tokenization_chatglm.py 跟官方的代码是否有区别?

嗯嗯 对比文件是一样的代码, 然后尝试降级下 transformers==4.33.3 (4.35.x, 4.34.x都不行) 后可以转换了... 问题应该不是这个, 可能是上游改了什么东西没来的及适配? 你看下你环境的版本是不是低于 4.34.x, 或许在README下标注下会好一些~

ref: https://github.com/chatchat-space/Langchain-Chatchat/issues/1835#issuecomment-1786711636

不管怎样, 这个问题暂时解决了, 谢谢作者回复哈~

watreyoung commented 10 months ago

vllm 0.2.2解决了https://github.com/vllm-project/vllm/issues/1713 这个问题 但是vllm-0.2.2要求transformers版本高于4.34.0 而像 @StrayDragon 所提transformers版本高于4.33.3就不可以了

感觉如果想要复现这个错误只需要把transformers升到最高版本(比如4.36.0

现在如果想用vllm加速推理chatglm2的话感觉还是得自己根据文档改一下,不知道是否后续有解决方案吗

watreyoung commented 10 months ago

刚刚发现chatglm3在5天前更新了tokenization_chatglm.py,替换掉原来下载的这个文件可以兼容高版本的transformers了。

StrayDragon commented 10 months ago

刚刚发现chatglm3在5天前更新了tokenization_chatglm.py,替换掉原来下载的这个文件可以兼容高版本的transformers了。

cool, 感谢提醒, 我回去试试~