
人工智能大模型微调LoRA【免费下载链接】peft PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.项目地址https://gitcode.com/gh_mirrors/pe/peft点击查看免费下载LoRA-GALow-Rank Adaptation with Gradient Approximation基于梯度近似的低秩适配是 PEFT 库中一种特殊的 LoRA 初始化方案它在初始化阶段利用一小批数据估计梯度并对梯度做 SVD 分解从而将适配器权重初始化为与全量微调方向对齐的状态实现 2–4 倍收敛加速而最终性能不降。本指南以 lora_ga_finetuning 示例 为核心结合 LoRA-GA 源码实现 与 LoraGAConfig 配置定义系统讲解 LoRA-GA 的原理、完整训练流程、方向/缩放策略、保存细节、量化模型两阶段工作流与工程注意事项读完即可在 GPT-2、Llama 等模型上复现并调优 LoRA-GA 微调。为什么需要 LoRA-GA从随机初始化到梯度对齐标准 LoRA 在初始化时使用随机高斯分布初始化 lora_A、全零初始化 lora_B这意味着微调开始时适配器必须从头摸索优化方向。LoRA-GA 的核心改进在于用数据驱动的方式取代随机初始化在少量批次通常 64–128 个 iteration上执行前向与反向传播累积目标权重矩阵的梯度对估计出的梯度矩阵做 SVD 分解得到与全量微调梯度方向对齐的奇异向量将分解出的左右奇异向量分配给 lora_A 与 lora_B使初始适配器更新方向与全量微调方向一致同时从基座权重中减去该初始化更新W_new W_old - scaling * (B A)保证初始化前后模型输出不变训练过程稳定。该方法的优点在 示例 README 中总结为四点收敛更快梯度对齐的初始化带来约 2–4 倍的收敛加速最终性能不变最终效果与标准 LoRA 相当甚至更好初始化开销可摊薄梯度估计阶段通常仅需 1–2 分钟64 个 iteration训练中很快被摊薄与其他方法正交可与 DoRA、LoRA、量化等 LoRA 增强技术组合使用。在源码层面loraga.py 顶部明确标注了参考实现与论文https://arxiv.org/abs/2407.05000实现上分为preprocess_loraga预处理/梯度估计与lora_ga_init初始化两个阶段与 PiSSA、OLoRA、CorDA 采用相同的预处理 配置 初始化API 模式。五分钟快速上手WikiText-2 上的 LoRA-GA 微调示例 README 的 Quick start 给出了一条完整的最小链路。整个流程分为 5 步加载模型 → 定义梯度估计回调 → 配置 LoRA-GA → 预处理估计梯度 → 创建 PEFT 模型并训练。import torch from datasets import load_dataset from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments from torch.utils.data import DataLoader from peft import LoraConfig, get_peft_model from peft.tuners.lora import LoraGAConfig, preprocess_loraga # Load model and tokenizer model AutoModelForCausalLM.from_pretrained(gpt2) tokenizer AutoTokenizer.from_pretrained(gpt2) dataset load_dataset(wikitext, wikitext-2-raw-v1) # Prepare dataloader for gradient estimation train_dataloader DataLoader(dataset[train], batch_size2, shuffleTrue) # Define train_step callback for gradient estimation def train_step(): Run forward and backward passes for gradient estimation. data_iter iter(train_dataloader) for _ in range(64): # 64 iterations batch next(data_iter) outputs model(**batch) loss outputs.loss loss.backward() # Step 1: Create LoRA-GA config lora_ga_config LoraGAConfig( directionArB2r, scalestable, stable_gamma16, ) lora_config LoraConfig( r8, lora_alpha16, target_modules[c_attn], init_lora_weightslora_ga, lora_ga_configlora_ga_config, task_typeCAUSAL_LM, ) # Step 2: Preprocess with LoRA-GA to estimate gradients preprocess_loraga(model, lora_config, train_step) # Step 3: Create PEFT model with LoRA-GA initialization peft_model get_peft_model(model, lora_config) # Step 4: Train normally trainer Trainer( modelpeft_model, train_datasetdataset[train], argsTrainingArguments(output_dir./output, num_train_epochs3), ) trainer.train() # Step 5: Save the trained adapter peft_model.save_pretrained(./output)需要特别强调代码中两个关键连接点LoraConfig中必须同时设置init_lora_weightslora_ga与lora_ga_configLoraGAConfig(...)。源码 config.py 中的字段说明与 loraga.py 的校验逻辑都明确指出两者缺一不可否则会抛出ValueErrorIf you want to use LoRA-GA, please initialize the LoraConfig with init_lora_weightslora_ga and lora_ga_configLoraGAConfig(...)。preprocess_loraga必须在get_peft_model之前调用因为初始化阶段 lora_ga_init 会读取预处理阶段挂在目标模块上的_peft_loraga_grad梯度张量若该属性不存在例如从已保存适配器加载模型则回退到标准高斯初始化——此时权重随后会被 state_dict 覆盖不会影响加载结果。源码视角LoRA-GA 的梯度估计与初始化是如何实现的预处理阶段preprocess_loraga与estimate_gradientspreprocess_loraga 是整个流程的入口它依次完成三件事参数校验与目标模块补齐要求lora_config.lora_ga_config非空若target_modules为空会参照BaseTuner._prepare_adapter_config的逻辑从模型配置中按架构自动推断默认目标模块LoraModel.target_module_mapping保证在get_peft_model之前就能定位目标层。量化模型检查遍历目标模块一旦发现模块带有quant_state属性即 BitsAndBytes 量化层立即抛出异常——LoRA-GA 需要全精度梯度。缓存加载或梯度估计若提供了cache_file且文件已存在且非空则直接从缓存加载每个模块的_peft_loraga_grad否则调用 estimate_gradients 执行估计并可选择把梯度保存到缓存文件供后续量化模型复用。estimate_gradients 在内存效率上做了精细设计值得关注先记录并关闭模型所有参数的requires_grad仅对目标模块的weight打开梯度enables gradient computation ONLY on target module weights ... more memory-efficient than enabling gradients globally为目标模块注册register_full_backward_hook用计数器记录每个模块实际参与反向传播的次数在torch.enable_grad()上下文内运行用户提供的train_step回调利用 PyTorch 天然的梯度累加机制跨 iteration 累积梯度结束后恢复所有参数的requires_grad原状并计算平均梯度module._peft_loraga_grad module.weight.grad.detach() / module._peft_loraga_grad_count随后清理临时字段。初始化阶段lora_ga_init的 SVD 分解与基座权重修正get_peft_model 创建适配层时会依据init_lora_weights lora_ga触发 lora_ga_init调度入口见 layer.py。其核心步骤读取_peft_loraga_grad转换为 float32 后按fan_in_fan_out转置使用torch.svd_lowrank(grad, qmin(4 * r, min(grad.shape)), niter4)得到grad ≈ U diag(S) V.T并截取前2*r个奇异分量根据direction策略将 Vh对应 lora_A与 U对应 lora_B分配到两个低秩矩阵并乘上对应奇异值对角阵根据scale策略缩放 lora_B或 lora_A修改基座权重weight_data weight_data - scaling_factor * (lora_B lora_A)在 fp32 精度下计算偏移量再转回目标 dtype确保初始化后的模型输出与原始模型一致等价于标准 LoRA 初始化时 B0 的效果删除_peft_loraga_grad临时字段。方向策略Direction Strategies奇异向量如何分配给 A 与 BSVD 分解得到 2r 个奇异分量后需要决定哪些分量进入 lora_A、哪些进入 lora_B。LoraGAConfig 的文档字符串 与 layer.py 的实现一一对应策略含义A 取的分量B 取的分量说明ArBr交替分配奇数索引第 1、3、5…行偶数索引第 0、2、4…列奇偶交错分量均匀分布A2rBr后半给 A、前半给 B索引[r:2r]索引[:r]与默认方向相反ArB2r默认前半给 A、后半给 B索引[:r]索引[r:2r]官方推荐通常表现最佳random随机选取randperm(2*r)[:r]对应行剩余随机索引对应列打乱奇异向量顺序从实现可见lora_A 直接取自右奇异向量 Vh 的行lora_B 由左奇异向量 U 的列乘以对应奇异值得到lora_B_weight U[:, idx] torch.diag(S_B)。默认ArB2r让较大奇异值进入 B、较小奇异值进入 A这种非对称分配在实践中效果最好因此被设为默认值。缩放策略Scaling Strategies控制初始化量级初始化量级直接影响训练稳定性layer.py 实现了四种缩放策略默认公式源码实现设计意图stable✅scale_factor out_features^0.25 / stable_gamma^0.5缩放 lora_B保守缩放配合stable_gamma保证稳定训练weight_svd—对原始权重做 SVDscale_factor weight_S[0] / S_B[0]当S_B[0] 0以权重矩阵最大奇异值与梯度最大奇异值之比缩放更好地对齐量级gd_scale—lora_A / scaling_factor、lora_B / scaling_factor按梯度下降步长缩放unit—不做任何额外调整纯单元缩放保持 SVD 原始量级其中stable_gamma是stable缩放专属的超参数默认 16gamma 越大out_features^0.25 / gamma^0.5越小初始化越保守。如果你对初始化敏感性不确定优先使用默认的stablestable_gamma16组合。训练脚本实战命令行参数全解析仓库提供了可直接运行的 lora_ga_finetuning.py 脚本基于 GPT-2 WikiText-2 的因果语言建模任务。脚本内部完整实现了 README 描述的流水线数据集 tokenizepaddingmax_length、truncation、max_length512、labels 复制 input_ids→ 梯度估计 DataLoaderbatch_size 可配→preprocess_loraga→get_peft_model→ Trainer 训练 →save_pretrained。基础运行方式python examples/lora_ga_finetuning/lora_ga_finetuning.py \ --base_model gpt2 \ --dataset_name wikitext \ --dataset_config wikitext-2-raw-v1 \ --output_dir ./lora_ga_output自定义 LoRA-GA 方向与缩放策略python examples/lora_ga_finetuning/lora_ga_finetuning.py \ --base_model gpt2 \ --direction ArB2r \ --scale stable \ --stable_gamma 16 \ --grad_estimate_iters 64全参数示例python lora_ga_finetuning.py \ --base_model gpt2 \ --dataset_name wikitext \ --dataset_config wikitext-2-raw-v1 \ --output_dir ./lora_ga_output \ --r 8 \ --lora_alpha 16 \ --lora_dropout 0.1 \ --direction ArB2r \ --scale stable \ --stable_gamma 16 \ --grad_estimate_iters 64 \ --grad_estimate_batch_size 2 \ --num_epochs 3 \ --batch_size 8 \ --learning_rate 3e-5脚本的 参数定义 及其默认值汇总如下参数默认值取值范围/说明--base_modelgpt2基础模型名称或本地路径--output_dir./lora_ga_output输出目录--dataset_namewikitext数据集名称--dataset_configwikitext-2-raw-v1数据集配置--max_length512最大序列长度--r8LoRA 秩--lora_alpha16LoRA alpha--lora_dropout0.1LoRA dropout--target_modules[c_attn]目标模块GPT-2 用c_attn--directionArB2rArBr/A2rBr/ArB2r/random--scalestablestable/weight_svd/gd_scale/unit--stable_gamma16stable 缩放 gamma--grad_estimate_iters64梯度估计迭代次数--grad_estimate_batch_size2梯度估计批大小--num_epochs3训练轮数--batch_size8训练批大小--learning_rate3e-5学习率--warmup_steps100预热步数--logging_steps10日志步数--save_steps500保存步数--eval_steps500评估步数--seed42随机种子脚本还会在训练结束后打印保存的文件清单adapter_model.safetensors与adapter_config.json以及通过PeftModel.from_pretrained加载适配器的示例代码。保存适配器的两种方式基座权重被修改了吗重要区别标准 LoRA 初始化不改动基座权重而LoRA-GA 在初始化阶段会修改基座权重W_new W_old - scaling * (B A)。因此保存时必须区分两种场景方式一默认save_pretrained()仅保存适配器# This saves the adapter - base weights remain modified peft_model.save_pretrained(./output)此时保存的适配器内嵌了已修正的基座权重信息。若日后要将该适配器合并回原始未修改的基座模型或分享给其他用户应用在原始基座上直接使用这种保存方式会引入偏差。方式二path_initial_model_for_weight_conversion还原原始基座权重# Save the original model BEFORE LoRA-GA preprocessing model.save_pretrained(./original_model) # ... do preprocessing and training ... # Save adapter and convert back to original base weights peft_model.save_pretrained( ./output, path_initial_model_for_weight_conversion./original_model )该方式适用于以下场景README 原文后续需要将适配器与原始基座权重合并分享适配器并希望使用者在未修改的基座模型上应用需要基座权重保持原始状态用于其他用途。推理加载像使用普通 LoRA 一样使用 LoRA-GA 适配器训练完成后适配器的使用方式与任何 模型一致from transformers import AutoModelForCausalLM from peft import PeftModel model AutoModelForCausalLM.from_pretrained(gpt2) model PeftModel.from_pretrained(model, path/to/lora_ga_output)注意加载时的行为差异见 lora_ga_init推理加载时目标模块上不存在_peft_loraga_grad属性初始化会自动回退到高斯初始化但由于随后state_dict会覆盖适配器权重最终加载结果不受影响。与量化模型BitsAndBytes 4-bit/8-bit结合的两阶段工作流LoRA-GA 的梯度估计必须使用全精度梯度而量化模型如 BitsAndBytes 4-bit/8-bit无法提供。为此 README 提供了一套两阶段工作流兼顾量化省显存与 LoRA-GA 加速第一阶段用全精度模型估计并缓存梯度用 bfloat16/float16 甚至全精度加载模型例如 Llama-2-7B配置 LoRA-GA 后运行train_step估计梯度并通过cache_file参数把梯度写入磁盘import torch from transformers import AutoModelForCausalLM, BitsAndBytesConfig from peft import LoraConfig, get_peft_model from peft.tuners.lora import LoraGAConfig, preprocess_loraga # Load model in full precision for gradient estimation model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-7b-hf, torch_dtypetorch.bfloat16, device_mapauto ) # Configure LoRA-GA lora_config LoraConfig( r8, target_modules[q_proj, v_proj], init_lora_weightslora_ga, lora_ga_configLoraGAConfig(directionArB2r, scalestable), ) # Define your train_step (same as before) def train_step(): for _ in range(64): # Your training logic here outputs model(**batch) loss outputs.loss loss.backward() # Estimate and cache gradients preprocess_loraga(model, lora_config, train_step, cache_fileloraga_gradients.pt) # Clean up full-precision model del model torch.accelerator.empty_cache()第二阶段加载量化模型自动复用缓存梯度# Load model with quantization quantization_config BitsAndBytesConfig(load_in_4bitTrue) model AutoModelForCausalLM.from_pretrained( meta-llama/Llama-2-7b-hf, quantization_configquantization_config, device_mapauto ) # Apply LoRA-GA - gradients will be loaded from cache automatically peft_model get_peft_model(model, lora_config) # Train normally trainer.train()关键点README 原文总结梯度估计必须使用非量化模型全精度或 bfloat16/float16用cache_file参数缓存梯度避免重复计算对量化模型应用 LoRA 时缓存梯度会被自动加载见 preprocess_loraga 的缓存命中逻辑文件存在且非空即torch.load加载并按模块名f{name}._peft_loraga_grad匹配该工作流让你在享受量化内存收益的同时获得 LoRA-GA 的收敛加速。工程实践 Tips综合 README 的 Tips 章节与源码实现给出以下实操建议梯度估计迭代数64–128 次通常足够次数越多估计越准确但初始化耗时越长。grad_estimate_iters直接控制该开销。梯度估计批大小建议 2–4 的小批量以最大化梯度多样性--grad_estimate_batch_size 2。方向与缩放默认directionArB2r与scalestable在多数场景下表现良好先用默认值跑通再逐步调参。自定义train_step回调回调赋予你对梯度估计过程的完全控制权可以自定义 batching、损失函数等。preprocess_loraga的train_step参数类型为Callable[[], None]回调内typically you should run model forward and backward passes见 loraga.py。切勿手动清零梯度不要在train_step回调内调用model.zero_grad()或optimizer.zero_grad()。LoRA-GA 依赖 PyTorch 天然的跨 iteration 梯度累加源码中正是通过不 reset 梯度实现跨 batch 累积再用 hook 计数取平均。模型需处于 train 模式estimate_gradients 会强制model.train()结束后恢复原始训练状态但回调内部仍需确保 Dropout 等行为符合预期。API 设计总结与 PiSSA / OLoRA / CorDA 一致的五步模式LoRA-GA 完整遵循 PEFT 中数据驱动初始化类方法的统一 API 模式README API Design 章节预处理调用preprocess_loraga(model, lora_config, train_step)估计梯度并挂载到模型层配置使用LoraGAConfig作为LoraConfig的子配置同时设置init_lora_weightslora_ga初始化预处理后调用get_peft_model()创建带 LoRA-GA 初始化的 PEFT 模型训练用 Hugging Face Trainer 或自定义训练循环正常训练保存使用标准save_pretrained()保存训练好的适配器必要时配合path_initial_model_for_weight_conversion。模块的导出路径为from peft.tuners.lora import LoraGAConfig, preprocess_loraga且两者均已在 src/peft/init.py 与 src/peft/init.py 中作为 PEFT 顶层 API 导出可直接from peft import ...使用。需要深入了解底层实现时建议阅读 loraga.py、lora_ga_init 初始化逻辑 与 LoraGAConfig 配置类 三处核心代码。参考文献LoRA-GA 的原始论文引用如下摘自 示例 README 的 Citation 章节article{wang2024loraga, title{LoRA-GA: Low-Rank Adaptation with Gradient Approximation}, author{Wang, Shaowen and Zhu, Linxi and Ding, Hengyuan and Liu, Jiaqi and Chen, Jiaming and Zhu, Kaikai and Pang, Wei and Zhu, Jun and You, Yang}, journal{arXiv preprint arXiv:2407.05000}, year{2024} }赞分享人工智能大模型微调LoRA【免费下载链接】peft PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.项目地址https://gitcode.com/gh_mirrors/pe/peft点击查看免费下载相关推荐基于 Transformers 与 PEFT 的 LLaMA3-8B-Instruct LoRA 高效微调实战指南基于 Transformers 与 PEFT 的 LLaMA3 8B Instruct LoRA 高效微调实战指南 本指南以 Datawhale 开源项目《开源大模型人工智能教程本地部署微调GLM-4.7-Flash LoRA 微调实战基于 Transformers 与 PEFT 的高效微调及 SwanLab 可视化指南GLM 4.7 Flash LoRA 微调实战基于 Transformers 与 PEFT 的高效微调及 SwanLab 可视化指南 本文基于 Datawha大模型人工智能教程本地部署微调Gemma-2-9b-it LoRA 微调实战基于 transformers 与 peft 的指令微调全流程指南Gemma 2 9b it LoRA 微调实战基于 transformers 与 peft 的指令微调全流程指南 本文以 Datawhale self llm大模型人工智能教程本地部署微调上一篇Linux动态壁纸终极排障指南20实战问题完全解决下一篇Laravel Sail 项目常见问题解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考