PEFT RoAd 实战指南:用 2D 旋转实现参数高效微调、批量混合适配器推理与可组合性
人工智能大模型微调LoRA【免费下载链接】peft PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.项目地址https://gitcode.com/gh_mirrors/pe/peft点击查看免费下载RoAd2D Rotary Adaptation是 PEFT 中新增的一种参数高效微调PEFT方法它不引入低秩矩阵而是为每个隐藏维度对学习一组 2×2 旋转矩阵及可缩放因子以不足 0.1% 的可训练参数取得与主流 PEFT 方法相当甚至更优的效果。本文以 RoAd 示例目录 为核心结合仓库中 RoadConfig 配置类、RoadLayer 层实现、RoadModel 模型封装 与 完整微调脚本 的源码系统讲解 RoAd 的原理、配置、训练脚本、量化支持与混合适配器批处理推理帮助你直接上手用 RoAd 微调 LLaMA 等大模型。RoAd 是什么3-in-1 的旋转式适配RoAd 全称3-in-1: 2D Rotary Adaptation for Efficient Finetuning, Efficient Batching and Composability论文见docs/source/package_reference/road.md其核心思想非常简洁把输入向量的隐藏维度拆成若干 2D 向量对每个 2D 向量施加一个可训练的 2×2 旋转矩阵再乘上一个可训练的缩放因子。由此带来三重收益参数高效适配器只存储每个旋转对的角度 θ 与缩放 α而不是完整的旋转矩阵 R可训练参数占比低于 0.1%。高效批处理与 LoRA 依赖批量低秩矩阵乘法不同RoAd 的稀疏旋转在前向推理时被重写为逐元素运算因此在同一个 batch 内服务多个异构适配器请求时只产生逐元素计算开销推理吞吐显著更高。可组合性RoAd 的稀疏 2D 旋转可以视为隐藏表示学习子空间中的任务级干预不同任务的旋转子空间正交且可组合能够在无需额外微调的情况下合并多种任务行为例如多语言能力、指令遵循能力带来更强的模型可解释性与模块化适配能力。从仓库源码结构看RoAd 在 PEFT 中以独立 tuner 形式注册见 tuners/road/init.pyregister_peft_method(nameroad, ...)并声明为is_mixed_compatibleTrue即支持与 LoRA 等其他方法混用以及同 batch 混合适配器推理。在 PeftType 枚举 中也有对应的ROAD类型。底层数学原理源码级在 RoadLayer 的文档字符串 中给出了精确的变换公式对向量 x 的每个元素对施加y₀ x₀ · α · cosθ − xₙ · α · sinθ yₙ x₀ · α · sinθ xₙ · α · cosθ其中缩放 α 与角度 θ 对每个元素对分别学习并且在 variant 2/4 下旋转矩阵的 4 个实例可以各不相同。值得注意的实现细节是RoAd不是把相邻的两个元素 x₀、x₁ 配对而是先把整个向量按group_size分组然后将组内前半段元素与后半段元素一一配对元素 0 配 group_size/2元素 1 配 group_size/21……这种配对方式对模型性能无影响元素本身无序但能让推理实现更高效也方便 vLLM 等推理引擎做优化。前向实现_apply_roadlayer.py对应论文公式 4核心只有一步x * first_col rotate_half_x * second_col即一次逐元素乘加没有任何矩阵乘法x_grouped x.reshape(-1, 2, group_size // 2) x1 x_grouped[:, 0, :] x2 x_grouped[:, 1, :] rotate_half_x torch.stack((-x2, x1), dim1).reshape(x.shape) result x * first_col rotate_half_x * second_col而在合并权重时mergelayer.py利用旋转矩阵与仿射变换的可交换性质R (W x b) (R W) x R b即未合并状态下使用高效的逐元素实现合并后R W成为新的权重矩阵、R b成为新的偏置完全等价且可以安全卸载/恢复unmerge通过torch.linalg.inv求逆还原layer.py。RoadConfig 配置参数详解RoAd 的配置类是 RoadConfig继承自PeftConfig核心参数如下均可在__post_init__中看到校验逻辑参数类型/默认值说明variantstr默认road_1RoAd 变体可选road_1/road_2/road_4详见下文group_sizeint默认64元素分组大小决定 2D 向量如何配对须为正偶数且目标层out_features必须能被其整除init_weightsbool默认True是否执行 RoAd 权重初始化非特殊情况不要改动target_moduleslist[str]或str默认None要应用适配器的模块名列表或正则all-linear通配所有线性层不指定时按模型架构自动匹配未知架构会报错modules_to_savelist[str]默认None除 RoAd 层外需要置为可训练并保存的模块如分类头三种 variant 的参数规模根据 config.py 的字段注释 与 layer.py 的 update_layer 实现三种变体的参数量关系为road_1所有元素对共用同一组缩放与角度参数量最少每个应用层仅存储out_features // 2个参数road_2每个元素拥有各自的缩放与角度参数量为road_1的 2 倍out_featuresroad_4每个元素拥有两组不同的缩放与角度分别作用于旋转矩阵两列参数量为road_1的 4 倍out_features * 2。对应地RoadLayer只维护两个参数容器road_theta角度与road_alpha缩放。默认初始化init_weightsTrue下角度 θ 置零、缩放 α 置 1layer.py保证初始状态等价于恒等变换微调从原模型行为出发。group_size虽然不影响模型性能但会显著影响 vLLM 等场景的推理速度源码注释建议至少取 32 或 64默认 64。同时注意模型隐藏维度或张量并行下每分区的隐藏维度必须能被group_size整除因此很小的模型可能需要调低该值。配置校验config.py 的__post_init__会在 variant 非法时抛出ValueError并在group_size非正或为奇数时报错RoadLayer.update_layer还会在out_features % group_size ! 0时拒绝创建层。快速上手Quick Start示例 README 给出了最精简的接入方式——只需三步加载基座模型、构造RoadConfig、通过get_peft_model包装import torch from peft import RoadConfig, get_peft_model from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer from datasets import load_dataset model AutoModelForCausalLM.from_pretrained(huggyllama/llama-7b, device_mapauto) tokenizer AutoTokenizer.from_pretrained(huggyllama/llama-7b) dataset load_dataset(timdettmers/openassistant-guanaco, splittrain) road_config RoadConfig( variant1, ) peft_model get_peft_model(model, road_config) trainer transformers.Trainer( modelpeft_model, train_datasetdataset, dataset_text_fieldtext, max_length2048, tokenizertokenizer, ) trainer.train() peft_model.save_pretrained(road-llama-3-8b)注意仓库当前版本的variant合法取值为road_1/road_2/road_4见 config.py 的RoadVariant类型README 中variant1属于早期写法实际运行时请使用上述合法字符串否则配置校验会直接报错。学习率是关键差异点RoAd 相比 LoRA 等方法需要更高的学习率README 与 API 文档road.md均建议设置在1e-3 附近仓库的 方法对比实验配置 同样以 1e-3 作为默认学习率。示例脚本 road_finetuning.py 的 argparse 默认值则设为 3e-3见脚本 L165两者都明显高于 LoRA 常用量级实践中可按任务在 1e-3 ~ 3e-3 区间调整。完整微调脚本逐参数解析仓库在 examples/road_finetuning/road_finetuning.py 提供了可直接运行的端到端微调脚本使用 transformersTrainer Hugging Facedatasets覆盖数据加载、分词、训练、保存与推送 Hub 的完整流程。其命令行参数与脚本内部行为如下参数默认值作用--base_modelhuggyllama/llama-7b基座模型名称或本地路径--data_pathtimdettmers/openassistant-guanaco数据集名称或路径--output_dirpath/to/output微调产物输出目录--batch_size1训练/评估 batch size--num_epochs1训练轮数--learning_rate3e-3学习率RoAd 建议 ~1e-3--cutoff_len512分词截断长度--val_set_size500验证集大小该脚本以数据集自带test划分为验证集--quantizeFalseflag启用 4-bit bitsandbytes 量化--eval_step10评估间隔同时作为日志步长--save_step100检查点保存间隔--devicecuda:0训练设备--variantroad_1RoAd 变体仅接受road_1/road_2/road_4--road_target_modulesNone逗号分隔的目标模块列表--hub_model_idpath/to/repo推送 Hub 的仓库名--push_to_hubFalseflag是否推送 Hub脚本内部若干实现要点对照 road_finetuning.py目标模块默认集未指定--road_target_modules时RoAd 默认作用在q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj七个模块上脚本 L80-L84即同时覆盖注意力投影与 MLP 全部门控投影最大化旋转适配的覆盖面训练配置TrainingArguments固定了warmup_steps100、weight_decay0.01、gradient_accumulation_steps16、fp16True、save_total_limit2脚本 L108-L125配合per_device_train_batch_size1可在单卡上完成大批量等效训练分词细节以paddingmax_length填充到cutoff_len并把input_ids复制为labels用于因果语言建模脚本 L96-L99收尾动作push_to_hub开启时调用trainer.push_to_hub随后统一save_pretrained保存模型与分词器到本地脚本 L143-L149。一条命令启动微调python examples/road_finetuning/road_finetuning.py --base_model meta-llama/Meta-Llama-3-8B --data_path timdettmers/openassistant-guanaco完整参数示例python road_finetuning.py \ --base_model PATH_TO_MODEL \ --data_path PATH_TO_DATASET \ --output_dir PATH_TO_OUTPUT_DIR \ --batch_size 1 \ --num_epochs 3 \ --learning_rate 1e-3 \ --cutoff_len 512 \ --val_set_size 500 \ --quantize \ --eval_step 10 \ --save_step 100 \ --device cuda:0 \ --variant 1 \ --road_target_modules q_proj,k_proj,v_proj,o_proj \ --hub_model_id YOUR_HF_REPO \ --push_to_hub需要说明的是README 示例中的--variant 1与--road_target_modules的逗号写法对应早期版本当前脚本的--variant通过choices[road_1, road_2, road_4]约束脚本 L172-L174而--road_target_modules由脚本内部split(,)解析为列表脚本 L80-L84两种形式均可正常解析但建议直接使用road_1等完整变体名。4-bit 量化训练bitsandbytesRoAd 原生支持 bitsandbytes 量化模型README 明确指出 4-bit 与 8-bit 量化均可用API 文档 road.md 亦有说明。开启量化只需加一个 flagpython examples/road_finetuning/road_finetuning.py --base_model meta-llama/Meta-Llama-3-8B --quantize量化分支的内部实现脚本 L60-L74使用BitsAndBytesConfigload_in_4bitTrue、bnb_4bit_quant_typenf4、bnb_4bit_use_double_quantTrueNF4 双重量化计算精度自动选择CUDA 支持 bf16 时用torch.bfloat16否则退回torch.float16随后调用prepare_model_for_kbit_training(model, use_gradient_checkpointingTrue)为量化训练做好准备启用梯度检查点以进一步节省显存。源码层面RoAd 针对 bnb 量化层提供了专门的派发与实现RoadModel._create_new_module会按顺序尝试 8-bitLinear8bitLt与 4-bitLinear4bit的 bnb 派发匹配失败才回落到普通Linearmodel.py相关实现位于 bnb.py。这一能力在测试中得到了系统验证tests/test_common_gpu.py中的test_road_bnb_8bit_quantization与test_road_bnb_4bit_quantization分别在 Flan-T5、OPT、Whisper 上断言目标模块被替换为RoadLinear8bitLt/RoadLinear4bit并进一步验证了 8-bit / 4-bit 下 merge/unmerge 前后的 logits 一致性test_8bit_road_merging、test_4bit_road_mergingtests/test_common_gpu.py。从 Hub 加载与复用 RoAd 模型微调产物与任何 模型一样可直接加载使用示例模型为 SQL 场景的 LLaMA-2-7Bfrom transformers import AutoModel model AutoModel.from_pretrained(ppetrushkov/llama-2-7b-sql-road-test)如果加载的是保存了 adapter 的 PEFT 模型使用PeftModel.from_pretrained(base_model, adapter_path)即可恢复由于 RoAd 适配器只含road_theta与road_alpha两组轻量参数checkpoint 极小save_pretrained/from_pretrained的读写开销远小于全量权重。进阶同 batch 混合适配器推理与可组合性RoAd 的一个突出卖点是高效服务混合适配器请求。当同一个 batch 中不同样本需要不同适配器时只需在前向时传入adapter_names列表RoadModel._enable_peft_forward_hooks 会通过 forward pre-hook 把该参数注入每个RoadLayer由_mixed_batch_forwardlayer.py按适配器名将 batch 拆分为子批、逐元素应用各自的旋转后写回原输出位置。由于旋转是逐元素运算而非矩阵乘法这种混合批处理的开销极小。注意两点限制混合批推理仅在推理模式下可用训练时传入adapter_names会直接抛错存在已合并merged的适配器时禁止传入adapter_names需先unmerge_adapter见 layer.py 的_check_forward_args。结合仓库测试RoAd 的适配器管理能力还有更多保障tests/test_custom_models.py在多层感知机上系统验证了三种 variantroad_1/road_2/road_4与不同target_modules组合tests/test_custom_models.pytests/test_common_gpu.py的test_road_add_new_adapter_does_not_change_device验证了新增适配器不会改变原适配器所在设备state_dict 回归测试 覆盖了 RoAd 的 checkpoint 序列化兼容性。官方建议想深入混合批推理的读者参考 LoRA 文档中 “Inference with different LoRA adapters in the same batch” 一节二者的接口约定一致。引用与进一步阅读如果你在论文或项目中使用了 RoAd请引用原始论文citation 见 示例 READMEinproceedings{ liao2024in, title{3-in-1: 2D Rotary Adaptation for Efficient Finetuning, Efficient Batching and Composability}, author{Baohao Liao and Christof Monz}, booktitle{The Thirty-eighth Annual Conference on Neural Information Processing Systems}, year{2024}, url{https://openreview.net/forum?idrYjYwuM6yH} }进一步深入可阅读仓库内以下资源RoadConfig 配置类源码variant、group_size 等参数的完整校验逻辑RoadLayer / Linear 层实现旋转公式、参数初始化、逐元素前向、merge/unmergeRoadModel 模型封装模块派发、混合适配器 forward hooks、目标模块映射RoAd API 文档官方能力概述与基准测试入口GPU 量化与合并测试8-bit / 4-bit 量化与 merge 一致性的可复现验证。小结RoAd 用“旋转而非加性低秩增量”的思路把 PEFT 的可训练参数压到 0.1% 以下同时借助逐元素运算天然适配混合适配器批处理与任务可组合场景。使用时只需记住两个关键实践一是学习率要提高到 1e-3 量级二是配合--quantize即可在消费级显存上微调 7B~8B 级别模型。从 RoadConfig 到 road_finetuning.py仓库提供了从原理到落地的完整闭环。赞分享人工智能大模型微调LoRA【免费下载链接】peft PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.项目地址https://gitcode.com/gh_mirrors/pe/peft点击查看免费下载相关推荐PEFT 中的 RoAd2D 旋转适配从原理到微调、量化与混合批次推理的完整实践指南PEFT 中的 RoAd2D 旋转适配从原理到微调、量化与混合批次推理的完整实践指南 RoAd2D Rotary Adaptation是 PEFT 提人工智能大模型微调LoRAPEFT 混合适配器类型Mixed Adapter Types实战指南使用 PeftMixedModel 组合不同 PEFT 方法PEFT 混合适配器类型Mixed Adapter Types实战指南使用 PeftMixedModel 组合不同 PEFT 方法 本文是 PEFT人工智能大模型微调LoRAPEFT 中的 RandLora以随机基线性组合实现全秩参数高效微调PEFT 中的 RandLora以随机基线性组合实现全秩参数高效微调 RandLoraRandom basis LoRA是 PEFT 中继 LoRA人工智能大模型微调LoRA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考