人工智能大模型微调模型评测强化学习多模态【免费下载链接】LMFlowAn Extensible Toolkit for Finetuning and Inference of Large Foundation Models. Large Models for All.项目地址https://gitcode.com/gh_mirrors/lm/LMFlow点击查看免费下载位置插值Position Interpolation, PI是突破大模型固定上下文窗口的关键技术之一。LMFlow 已内置对 LLaMA 系列模型的 Linear 缩放与 NTKNeural Tangent Kernel缩放支持仅需在命令行中开启--do_rope_scaling并指定缩放比例即可让原本最长 2048/4096 上下文的模型在更长序列上继续训练、微调与评估。读完本文你将掌握 LMFlow 中位置插值两个开关与两个比例参数的完整含义、底层CondenseRotaryEmbedding的实现原理以及一份可直接复用的长上下文评估脚本。为什么需要位置插值RoPE 与上下文长度瓶颈LLaMA 系列模型采用旋转位置编码Rotary Position Embedding, RoPE。RoPE 通过一组随位置变化的旋转频率inv_freq为每个 token 的位置注入旋转角使注意力分数天然带有相对位置信息。模型预训练时位置编码表只在有限的max_position_embeddings例如 2048内完成计算一旦输入序列超过该长度注意力计算就会超出位置编码的支撑区间导致困惑度perplexity急剧恶化、生成质量大幅下降。位置插值的思路是不改变频率本身的分布形态而是把更长序列的坐标压缩回预训练阶段见过的位置区间内。具体有两类主流做法Linear scaling线性缩放PI将位置坐标直接除以一个比例因子s即t t / s。原始 2048 的位置编码被拉伸覆盖到2048 × s的长度模型无需任何训练即可在更长上下文上工作配合少量长文本微调效果更佳。理论依据见论文Extending Context Window of Large Language Models via Positional InterpolationarXiv:2306.15595。NTK-aware scalingNTK 缩放不直接压缩坐标而是按公式放大 RoPE 的 base频率基数使高频分量保持原有分辨率、低频分量获得更大波长从而在不改变短序列行为的同时扩展可表示的最大位置。该思路源自社区对 Neural Tangent KernelNTK外推特性的讨论Reddit r/LocalLLaMA 上的 NTK-aware scaled RoPE 帖子。LMFlow 将这两种技术统一收口为四个模型参数在加载 LLaMA 模型时以模块替换的方式生效。参数速览位置插值的四个核心开关位置插值相关参数统一定义在src/lmflow/args.py的ModelArguments中args.py因此微调examples/finetune.py、评估examples/evaluation.py、推理examples/inference.py等所有基于模型加载的流水线均能复用同一套参数。参数默认值类型含义--truncate_to_model_max_lengthTruebool是否将数据集截断到模型最大长度。使用位置插值前必须设为False否则长序列会被预处理阶段直接截断插值无从发挥作用--do_rope_scalingFalsebool是否对 LLaMA 模型启用 RoPE 缩放即位置插值。False时比例参数即使传入也不生效--rope_pi_ratio1intLinear 缩放PI的比例因子s。例如4表示把上下文扩展为原来的 4 倍--rope_ntk_ratio1intNTK 缩放的比例因子。例如4表示按 4 倍扩展 NTK 频率范围参数帮助文本中 LMFlow 也明确标注了技术来源Linear scaling 归功于 Reddit 用户 /u/kaiokendev 与论文 arXiv:2306.15595NTK scaling 归功于 Reddit 用户 /u/bloc97 与 /u/emozilla见 args.py。源码级原理CondenseRotaryEmbedding与 monkey patch位置插值的核心实现位于src/lmflow/utils/position_interpolation/llama_rope_scaled_monkey_patch.py通过猴子补丁替换 Transformers 库中 LLaMA 的默认旋转嵌入模块。触发链路从命令行参数到模块替换在src/lmflow/models/hf_model_mixin.py的__model_module_inject中hf_model_mixin.py模型加载时会检查两个条件model_args.do_rope_scaling为True模型架构列表self.model_config.architectures中包含LlamaForCausalLM。两者同时满足时才从lmflow.utils.position_interpolation.llama_rope_scaled_monkey_patch导入replace_llama_with_condense并把rope_pi_ratio、rope_ntk_ratio传入。该方法在__init__阶段即被调用hf_model_mixin.py因此替换发生在任何前向传播之前。替换逻辑replace_llama_with_condensedef replace_llama_with_condense(pi_ratio, ntk_ratio): transformers.models.llama.modeling_llama.LlamaRotaryEmbedding partial( CondenseRotaryEmbedding, pi_ratiopi_ratio, ntk_rationtk_ratio )它通过functools.partial把 Transformers 内部的LlamaRotaryEmbedding替换为CondenseRotaryEmbedding并将两个比例参数预先绑定。从此所有LlamaForCausalLM实例化时都会使用压缩过的旋转嵌入训练与推理路径同步生效。核心实现CondenseRotaryEmbedding该类同时融合了 NTK 与 Linear 两种缩放llama_rope_scaled_monkey_patch.py初始化逻辑可分三步理解NTK 缩放先作用于 basebase 10000 × ntk_ratio^(dim/(dim-2))同时max_position_embeddings * ntk_ratio。base 放大后低频分量的波长相应变长模型可表示的位置范围随之扩展dim为注意力头维度dim/(dim-2)这一指数是 NTK 缩放保持相邻分量比值的经典构造。Linear 缩放再压缩坐标max_position_embeddings * pi_ratio随后位置序列按比例缩放t torch.arange(self.max_seq_len_cached, deviceself.inv_freq.device, dtypeself.inv_freq.dtype) / pi_ratio freqs torch.einsum(i,j-ij, t, self.inv_freq)缓存 sin/cos 表将freqs复制拼接后取cos/sin并注册为cos_cached、sin_cached缓冲区供注意力计算直接查表。forward中还保留了防御性逻辑若实际seq_len超过缓存的最大长度会按相同公式重新生成更长的 cos/sin 表保证超长输入不会越界llama_rope_scaled_monkey_patch.py。值得注意注释明确指出其排列方式与论文略有不同——它采用torch.cat((freqs, freqs), dim-1)而非论文中的交错排列但二者在最终旋转计算中等价。实战长上下文困惑度评估完整脚本原文档给出了一份可直接运行的评估脚本。要点在于必须同时关闭数据截断--truncate_to_model_max_length False并开启 RoPE 缩放--do_rope_scaling True然后用--block_size指定目标上下文长度用--rope_pi_ratio与--rope_ntk_ratio指定扩展比例。#!/bin/bash CUDA_VISIBLE_DEVICES0 \ deepspeed examples/evaluation.py \ --answer_type text \ --model_name_or_path pinkmanlove/llama-7b-hf \ --dataset_path data/wiki_en_eval \ --deepspeed examples/ds_config.json \ --inference_batch_size_per_device 1 \ --truncate_to_model_max_length False \ --block_size 4096 \ --use_flash_attention True \ --do_rope_scaling True \ --rope_pi_ratio 2 \ --rope_ntk_ratio 4 \ --metric ppl对这份脚本的逐项说明--deepspeed指定 DeepSpeed 配置文件。若示例路径examples/ds_config.json在你的仓库中不存在可替换为仓库自带配置例如 configs/deepspeed/zero2_no_offload.json 或 configs/deepspeed/zero3_no_offload.json。--block_size 4096评估时把序列按 4096 token 切块配合位置插值即可在 4K 上下文中计算困惑度。evaluate_block_size参数默认值为 1控制评估时每个 token 的条件似然计算所依赖的前置上下文长度必要时可一并调整见 args.py。--use_flash_attention True启用 Flash Attention 降低长序列注意力计算的内存开销该参数默认关闭args.py长上下文场景建议开启。--rope_pi_ratio 2 --rope_ntk_ratio 4同时指定两种比例时实现会先应用 NTK 缩放作用于 base再应用 PI 缩放作用于坐标最终等效扩展倍数为ntk_ratio × pi_ratio 8。实际使用时通常只需二选一。--dataset_path data/wiki_en_eval示例数据集路径请替换为你自己准备好的长文本评测集data/目录下提供的是下载脚本 data/download.sh。--metric ppl使评估以困惑度作为指标——这正是检验位置插值是否生效最直观的方式插值前后在同一长序列上的困惑度应显著下降。常见问题与使用限制只支持 LLaMA 架构__model_module_inject明确校验architectures中必须包含LlamaForCausalLM因此该特性当前只对 LLaMA 系列含 Llama-7B 等生效。若模型配置中不存在该架构标识do_rope_scaling会被静默忽略不会报错。比例默认值为 1rope_pi_ratio与rope_ntk_ratio默认均为1此时不产生任何扩展效果必须显式传入大于 1 的整数。不要忘记关闭截断truncate_to_model_max_length默认True若保持默认长序列在数据预处理阶段就被截断到模型原始最大长度位置插值形同虚设两个开关必须成对使用。插值 ≠ 免费午餐位置插值可以在零训练的情况下让模型看懂更长的序列但要让长上下文能力稳定可用通常还需配合长文本数据的继续微调。本文的评估脚本即是验证插值效果的标准手段可在此基础上对长文本数据集执行examples/finetune.py微调以进一步巩固长程能力。实现路径参考完整实现位于 llama_rope_scaled_monkey_patch.py参数定义见 args.py模块注入逻辑见 hf_model_mixin.py需要深入定制如更换频率公式或增加动态缩放时可从这三处入手修改。赞分享人工智能大模型微调模型评测强化学习多模态【免费下载链接】LMFlowAn Extensible Toolkit for Finetuning and Inference of Large Foundation Models. Large Models for All.项目地址https://gitcode.com/gh_mirrors/lm/LMFlow点击查看免费下载相关推荐Long-Context 上下文扩展微调实战AI-Research-SKILLs 中 RoPE 位置插值与 YaRN 微调全流程指南Long Context 上下文扩展微调实战AI Research SKILLs 中 RoPE 位置插值与 YaRN 微调全流程指南 本指南以 fine_tuAI 技能人工智能大模型深度学习深入理解 RoPE 旋转位置编码数学推导、PyTorch 实现与长上下文扩展实战指南深入理解 RoPE 旋转位置编码数学推导、PyTorch 实现与长上下文扩展实战指南 RoPERotary Position Embeddings旋转位置AI 技能人工智能大模型深度学习突破100万字上下文LMDeploy动态NTK-RoPE与logN缩放技术全解析突破100万字上下文LMDeploy动态NTK RoPE与logN缩放技术全解析 长文本外推LLM推理的关键挑战 长文本外推指LLM大语言模型推理时处理人工智能大模型模型推理服务推理引擎本地部署模型量化上一篇终极iOS设备降级指南让旧iPhone/iPad重获新生下一篇终极iOS降级工具实战指南Legacy-iOS-Kit完整配置与应用解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考