Assigning rope_scaling drops existing RoPE base parameters

该报错通常出现在已初始化的模型 config 上给 rope_scaling 赋值后:新值会整体替换 rope_parameters ,原有的 rope_theta 等基础参数被丢弃,随后 LlamaRotaryEmbedding 读取 rope_parameters["rope_type"] 时抛

快速结论:该报错通常出现在已初始化的模型 config 上给 rope_scaling 赋值后:新值会整体替换 rope_parameters,原有的 rope_theta 等基础参数被丢弃,随后 LlamaRotaryEmbedding 读取 rope_parameters["rope_type"] 时抛出 KeyError。优先排查赋值时是否已绕过了标准参数归一化路径。

适用环境:已确认 Transformers 5.19.0.dev0(未修改 main,commit ea92593;问题也存在于 3b82940);Linux 6.8.0 x86_64(glibc 2.39);Python 3.12.15;PyTorch 2.14.1+cpu。复现不需要模型权重或 GPU。

最快修复方案:Issue 只给出代码层面的修复方向(PR #49515 已在回复中确认合并),没有面向普通用户的一步修复方法,因此暂无确认的一步修复方案。若不想改动库源码,可优先尝试不要直接给已初始化 config 的 rope_scaling 赋值,或检查升级到包含该 PR 的 Transformers 版本。

注意事项:“不在已初始化配置上赋值”属于规避手段,Issue 未验证其等价性;PR #49515 的合并说明只能证明修复已进入主线,具体发布版本需自行核对。rope_type 这类规范化键名同样会丢掉原有 base,不能作为规避方式。

问题场景

使用 Transformers 构建 Llama 类模型配置时,先以 LlamaConfig(rope_theta=500000.0) 初始化,再以 v4 风格别名给已初始化 config 的 rope_scaling 赋值 {"type": "linear", "factor": 2.0}。随后打印 config.rope_parameters 或构造 LlamaRotaryEmbedding(config) 即触发问题。Issue 还提到这会波及真实下游覆盖场景,例如 sglang 中的长上下文配置出现 500000 回退到 10000,并影响 GSM8K 结果(前 200 例从 161 变为 106)。

报错原文

Assigning rope_scaling drops existing RoPE base parameters

{'type': 'linear', 'factor': 2.0}
Traceback (most recent call last):
  File "report-repro.py", line 28, in <module>
    LlamaRotaryEmbedding(config)
  File "src/transformers/models/llama/modeling_llama.py", line 80, in __init__
    self.rope_type = self.config.rope_parameters["rope_type"]
                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
KeyError: 'rope_type'

原因分析

最可能的原因在 configuration_utils.py 的 setter:给 rope_scaling 赋值时直接替换 rope_parameters,既不把旧参数名(如 type)归一化为 rope_type,也不保留已有的 rope_theta 等基础参数。因此构造 rotary embedding 时读取 rope_type 失败;即便使用规范键 rope_type 赋值,原有 base 仍会丢失,保存并重新加载配置后 base 会从 500000 恢复为构造默认值 10000。Issue 期望的行为是:setter 应归一化旧参数名,并在赋值未显式覆盖时保留现有基础参数。

环境排查

  • 确认 Transformers 版本与来源 commit:问题见于 5.19.0.dev0 未修改 main(ea92593,当前 main 3b82940 仍存在同一 setter)。
  • 确认复现是否在 CPU 环境即可,排除 GPU、CUDA、权重加载等无关变量(该复现报告 PyTorch 2.14.1+cpu,CUDA 信息未提供)。
  • 确认赋值顺序:是否先设置 rope_theta 等基础参数、再对已初始化 config 的 rope_scaling 赋值。
  • 确认赋值内容:使用 type 还是 rope_type;两者在未修复版本中都会丢失原有 base。
  • 若为下游框架覆盖场景,检查其传入的 RoPE 参数是否经过 config 初始化路径,或直接对已初始化属性赋值。

解决步骤

  1. 用 Issue 中的 CPU 最小脚本复现:创建 LlamaConfig(rope_theta=500000.0),赋值 rope_scaling,打印 rope_parameters 并构造 LlamaRotaryEmbedding,确认是否出现 KeyError: 'rope_type',以及 base 是否被替换。
  2. 根因定位到 setter 后,可优先尝试在模型 config 初始化阶段一次性提供 rope_scaling(即走构造函数路径),而不是先初始化再赋值,以规避 setter 的丢弃行为;该规避方式 Issue 未明确验证,需自行回归确认。
  3. 采用代码层修复时,对齐 PR #49515 的方向:在 setter 中归一化旧参数名,并合并而非覆盖已有 rope_parameters,仅在赋值显式提供时覆盖基础参数。
  4. 检查并升级到包含该修复的 Transformers 版本;如需确认,可核对发布版本是否包含 PR #49515。

验证方法

按 Issue 中的复现脚本重新运行:赋值后 rope_parameters 应同时保留基础参数并包含规范化的 rope_type,LlamaRotaryEmbedding(config) 不再抛出 KeyError;保存并重新加载配置后,rope_theta 应保持为 500000 而不是回退到 10000。Issue 提到修复 PR 附带 10 个新回归测试和全部 45 个 RoPE 测试通过,可作为完整验证参考。

参考来源

huggingface/transformers #49519

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 34870

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注