
Model quantized via sinq broken after save_pretrained and from_pretrained
快速结论:使用 SinqConfig 量化模型后,通过 save_pretrained 和 from_pretrained 保存再加载会导致 KeyError: 'packing' 错误。根本原因在 SINQ 库本身,而非 transformers。优先排查 SINQ 版本并应用上游修复。
问题场景
用户在 Hugging Face Transformers 中使用 SinqConfig 量化模型(如 google/gemma-4-E4B-it),执行 model.save_pretrained(save_dst) 后,再通过 AutoModelForCausalLM.from_pretrained(save_dst, device_map='cpu') 加载量化模型时触发报错。如果量化后不保存直接使用,模型行为正常。
报错原文
KeyError: 'packing'
原因分析
根因在 SINQ 库(huawei-csl/SINQ)中的 SINQLinear.load_state_dict 方法。对于 nbits=8 的检查点,由于 N*K*8//8 == N*K(即”已解包”分支始终触发),该方法在重载时合法地从状态字典中弹出 "packing" 键。但后续 Transformers 的 Quantizer.dequantize 方法使用括号访问 "packing" 键,导致 KeyError。该问题已在 SINQ 上游被修复。
环境排查
- Python 版本:3.12.13
- transformers 版本:5.8.1
- PyTorch 版本:2.11.0+cu130(CUDA 支持)
- GPU 类型:NVIDIA GeForce GTX 1650
- SINQ 版本:确认是否为最新或包含 huawei-csl/SINQ#26 的修复
- gemlite 安装状态:影响 SINQ 量化模型的加载行为
解决步骤
- 确认 SINQ 库版本,检查是否已包含 huawei-csl/SINQ#26 的一行修复。
- 如果未修复,手动应用该 PR 的更改:在
SINQLinear.load_state_dict中确保"packing"键在解包操作后仍然保留或正确处理。 - 或等待 SINQ 发布包含修复的新版本,然后升级 sinq。
- 升级后可向 transformers 发送 PR 提升 sinq 最低版本依赖,但这不是必需步骤。
验证方法
重新执行量化、保存、加载和推理的完整流程(使用 Issue 中的测试代码),确认不再抛出 KeyError: 'packing',并且模型能正常生成聊天响应(如 {'role': 'assistant', 'content': ...})。



