本地部署 ChatGLM3 时,Transformers 和 Tokenizer 的版本冲突,通常在加载 Tokenizer 或调用模型生成时暴露出来。如果你已经按照官方 README 装好依赖,仍然看到“AttributeError”“TypeError”或与 tokenizer 相关的报错,优先检查这两者的版本是否一直处于“新版 Transformers + 旧版 ChatGLM3 代码”的错配状态。这一页不提供万能版本号,但给出一个可执行的降级思路和验证方法。
处理方向:先将 Transformers 降级到 4.30.x 系列,Tokenizer 配套降到 0.13.x 系列,再把 ChatGLM3 依赖的 accelerate 等一并固定到旧版本,随后用最小脚本验证 tokenizer 加载和模型生成。降级不是为了提升性能,只为恢复兼容性。
冲突通常出现在哪个环节
ChatGLM3 的 tokenizer 代码在 trust_remote_code=True 下加载,官方库里的 tokenization_chatglm.py 依赖较早的 Transformers 接口。新版 Transformers 在 v4.30 之后调整了 PreTrainedTokenizer 的初始化参数、save_pretrained 行为以及 tokenize 方法返回值,导致旧代码在新环境中出现属性缺失、参数名不匹配或输出格式变化。常见的表现:加载 tokenizer 时不报错,但实际 encode 或 batch_decode 时结果异常;或者直接报 TypeError。
另一种冲突发生在 AutoModel.from_pretrained 加载 ChatGLM3 模型权重时,新版 Transformers 对部分模型配置字段做了更严格校验,使得旧模型配置无法被正确解析。这类问题不能只靠降级 tokenizer 解决,需要同时盯住 Transformers 的版本。
版本搭配建议
从社区和实际部署记录来看,ChatGLM3 的官方依赖在不同时间点变化过,但一个稳妥的起点是:Transformers 4.30.2、tokenizers 0.13.3、accelerate 0.20.3,以及 PyTorch 2.0.x。这个组合并不是“最新”,但能保持 ChatGLM3 官方代码库中多数调用的兼容性。如果你当前环境已经有其他项目,务必先做隔离,不要直接改全局环境。
| 组件 | 建议版本 | 说明 |
|---|---|---|
| transformers | 4.30.2 | ChatGLM3 代码较多与 4.30.x 对齐 |
| tokenizers | 0.13.3 | 与 transformers 4.30.x 配套的 rust 解析层 |
| accelerate | 0.20.3 | 模型加载和推理时常用,版本过高可能出现冲突 |
这里给出的版本号是“先尝试的起点”,不是“保证答案”。如果你在 GPU 环境或特定 CUDA 版本下部署,还需要结合 PyTorch 版本一起判断。使用以下命令时,先创建独立的 virtualenv 或 conda 环境:
python -m venv chatglm3_env
source chatglm3_env/bin/activate
pip install transformers==4.30.2 tokenizers==0.13.3 accelerate==0.20.3
如果项目原本已经安装了 requirements.txt,最好在降级前执行 pip freeze > requirements.txt.bak 以备回退。
如何验证是否真的解决
降级后不要急着启动完整的 Web UI,先跑一段最小脚本,确认 tokenizer 和模型能协同工作。以下脚本负责检查 tokenizer 的基本行为:
import transformers
from transformers import AutoTokenizer
print("transformers", transformers.__version__)
tokenizer = AutoTokenizer.from_pretrained(
"THUDM/chatglm3-6b",
trust_remote_code=True
)
text = "你好,请介绍你自己。"
ids = tokenizer.encode(text)
print("token ids:", ids)
print("decoded:", tokenizer.decode(ids))
如果脚本能正常打印出 token ids 和还原后的文本,说明 tokenizer 层已通过。再运行模型生成时,注意观察是否出现 RuntimeError 或 IndexError;这类错误往往指向 tokenizer 输出的张量形状和模型不匹配,需要复查版本。
验证完成后,最好再跑一次官方对话 demo 中的 web_demo.py 或 cli_demo.py,不要跳过这一步。
注意事项与边界
- 如果 transformers 版本过低(例如 4.20.x),会出现新的兼容问题,因为 Python 3.10/3.11 与较老版本的部分依赖不兼容。建议先确认 Python 版本,再选择 transformers 版本。
- 不要单独降级 tokenizers 而忽略 transformers,两个包存在强绑定关系。
- 有些机器上已经安装了 FlashAttention 或自定义算子,这些库可能要求高版本 transformers,降级前需要确认是否冲突。
- 如果你只是跑推理,不要轻易使用
`--compile`或torch.compile加速,这会把版本兼容问题引入到编译路径中。 - 如果是 Windows 环境,注意 CUDA extension 的预编译包与编译器版本,不要关掉编译日志。
这一套降级思路的本质是:让 ChatGLM3 的远程代码在它“预期”的依赖范围里运行,而不是去追新。如果你在降级后仍然报错,下一步应检查本地模型文件是否完整,以及 Python 版本是否在支持范围内。