在 TGI(Text Generation Inference)里做 RoPE 缩放因子实验,常见的落点是把缩放参数写进模型配置,而不是在启动命令中直接设置。TGI 加载模型时会读取 Hugging Face 格式的 config.json,其中 rope_scaling 字段控制位置编码的扩展方式;同时需要将 `--max-input-tokens` 调到大于目标上下文长度,否则缩放不会真正作用于推理。
判断:RoPE 缩放因子不是越大越好。先确定目标长度,再以 factor=1.0 为基线,对照 linear 和动态/NTK 两种缩放类型;验证要在三档输入长度下做,并用固定采样参数生成样本,综合自动指标与人工检查。修改配置后必须重启 TGI 并确认日志加载了新值。
下面给出一个可直接执行的实验流程,覆盖配置修改、服务重启、测试采样和结果对比。整个过程不掺杂特定模型,适用于大多数基于 LLaMA 结构的开源模型。
在 TGI 中配置 RoPE 缩放
先确认你的模型目录里有 config.json,且目标模型本身并没有在 config 中已经声明缩放。通常的做法是拷贝原始 config.json,为 rope_scaling 设置一个 group。
{ "rope_scaling": { "type": "linear", "factor": 2.0 } }
另一种常见选项是把 type 换成 dynamic 或 ntk,这两种都会在高频维度上调整缩放,适合比 linear 更平滑地扩展长度。具体支持哪些 type 取决于 Transformers 和 TGI 的版本,实验前需要先查该版本是否已包含对应实现。
修改完成后,启动 TGI 服务。以本地目录为例,命令形式如下:
text-generation-launcher `--model-id` ./my-model `--max-input-tokens` 16384 `--max-total-tokens` 17408 `--port` 8080
`--max-input-tokens` 是输入允许的最大长度,必须超过你的测试长度,否则 TGI 会在输入阶段截断。如果模型原本训练长度只有 4096,而你要测 8192,那么 factor 至少要让位置编码覆盖 8192;factor=2.0 配合 8192 输入属于常见起点。
建立实验矩阵
不要只测一组配置。先用同一个模型,保持温度、top_p、beam 数量一致,仅改变 rope_scaling 配置,按下面的矩阵记录生成结果。
| 实验组 | 缩放类型 | factor | 测试长度 |
|---|---|---|---|
| base | 无 | 1.0 | 2048 / 4096 / 8192 |
| linear | linear | 2.0 | 2048 / 4096 / 8192 |
| ntk | ntk | 2.0 | 2048 / 4096 / 8192 |
| ntk4 | ntk | 4.0 | 2048 / 4096 / 8192 |
注意:如果 base 组在 8192 下根本无法输入,就直接跳过并记录“超长未测”。每组至少生成 10 个样本,输入内容使用包含长程依赖的任务,比如从长文档中抽取指定实体、多轮指令跟随或开放续写。
生成质量验证
自动指标建议用两类:一是困惑度(PPL),用来粗略反映生成概率分布是否异常;二是任务准确率或 ROUGE,用来判断内容是否保持正确。注意 PPL 只计算生成部分的 token,而不是输入文本。TGI 服务可以通过 OpenAI 兼容的 /v1/completions 接口调用,请求样例:
curl http://localhost:8080/v1/completions -H 'Content-Type: application/json' -d '{ "model": "my-model", "prompt": "…长文本…", "max_tokens": 256, "temperature": 0.7, "top_p": 0.9 }'
将同一 prompt 发给不同 scale 配置的服务,记录返回文本。在 8192 长度下重点观察三点:是否存在重复片断、是否丢失开头信息、是否在中间段落出现语法混乱。把每组的输出按“首尾一致性、中间连贯性、事实正确性”做一个 1-5 分的人工打分,取平均数横向比较。
如果 factor=4.0 在 2048 长度下生成结果比 baseline 差很多,即使能处理超长,也要降低优先度。实际使用中,应保持“刚刚覆盖目标长度”的 factor,而不是越大越安全。
最后,每次修改 config.json 后,要重启 TGI,并检查启动日志中是否出现 rope scaling 相关提示。不同版本的 TGI 日志格式不同,但通常能看到模型的配置信息;如果没有明确输出,可以用一个极端长 prompt 请求,如果返回仍正常,说明配置生效。
实验完成后的下一步是结合任务特征选择最优配置。如果你只做 8k 以内的推理,linear factor=2.0 可能足够;如果目标在 32k 以上,需要优先测试 ntk 或动态缩放。请将上述步骤固化成一个脚本,方便在多个模型上重复。