
ValueError: `has_previous_state` can only be called on LinearAttention layers, and the current Cache seem to only contain Attention layers.
快速结论:该报错发生在调用 model.generate() 时,核心原因是 GraniteMoEHybrid 模型的缓存(Cache)内部仅包含普通 Attention 层,但代码试图对它们调用仅适用于 LinearAttention 层的 has_previous_state() 方法。优先排查 Transformers 版本是否为 5.13.0 或包含 PR #46738 的构建。
问题场景
用户使用 Hugging Face Transformers 加载 ibm-granite/granite-4.0-350m-base 模型,调用 model.generate() 进行文本生成时触发该错误。系统环境为 Ubuntu 24.04 with Python 3.12.12、Transformers 5.5.4,但后续评论指出 Transformers 5.13.0 仍存在问题。
报错原文
ValueError: `has_previous_state` can only be called on LinearAttention layers, and the current Cache seem to only contain Attention layers.
原因分析
可能原因:PR #46738(Commit 181beb3)引入了一个回归(regression),导致在 GraniteMoEHybrid 模型的掩码创建过程中错误地对所有缓存层调用了 has_previous_state() 方法。GraniteMoEHybrid 模型中同时包含普通 Attention 层和 LinearAttention 层,但缓存实例中只存储了 Attention 层,因此调用失败。开发者评论指出:“我猜测这是(缓存中)只有(全)注意力层导致的不匹配”。
环境排查
- Transformers 版本:确认是否为 5.13.0 或更新版本(含 PR #46738)
- 模型架构:GraniteMoEHybrid 混合注意力架构
- Python 版本:3.12.12
- CUDA 版本:12.9
解决步骤
- 升级 Transformers 到修复版本:根据 Issue 评论,此问题将由 PR #47087 间接修复,该 PR 将不再在掩码创建时直接依赖缓存调用
.has_previous_state()。升级到包含此修复的 Transformers 版本。 - 降级 Transformers:作为临时方案,退回到 PR #46738 之前的版本(如 5.4.x 或更早),避免该回归问题。
- 检查模型加载方式:确认是否使用
AutoModelForCausalLM.from_pretrained()加载模型,避免手动设置缓存参数可能导致的不一致。
注意:这些步骤基于 Issue 讨论中的推测(回归来源和修复方向),尚未在 Issue 中看到最终验证通过的代码提交。升级到 PR #47087 修复版本后可优先尝试。
验证方法
重新运行原始生成脚本 python generate_text.py --model-name ibm-granite/granite-4.0-350m-base --n-samples 256 --output-fl granite-350m-base.feather,若不再抛出 ValueError 且成功生成文本,则确认问题已解决。

![[Bug] Disabled Weaviate document vectors are not deleted by segment ID](https://www.chat-gpts.plus/wp-content/uploads/2026/07/39174-10c10356-768x403.jpg)

