)
人工智能大模型微调LoRA【免费下载链接】peft PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.项目地址https://gitcode.com/gh_mirrors/pe/peft点击查看免费下载HiRAHadamard High-Rank AdaptationHadamard 高秩适配是 PEFT 中一种区别于 LoRA 的参数高效微调方法它不再向权重矩阵叠加一个低秩增量而是用低秩因子 (A、B) 构造调制矩阵对原始权重做逐元素Hadamard乘性调制从而以更少参数保留高秩更新能力。本文以 examples/hira_finetuning/hira_finetuning.py 为蓝本完整讲解如何在yahma/alpaca-cleaned指令数据上用 HiRA 微调 Llama-3-8B-Instruct 这类因果语言模型从命令行参数、数据预处理、HiraConfig配置到HiraLayer底层前向/合并/初始化实现并给出可复制运行的完整命令与参数速查表。HiRA 方法背景从 LoRA 的加法增量到乘性调制在深入脚本之前先建立 HiRA 的数学直觉。LoRA 将权重更新建模为低秩加法[ W W_0 B A ]其中 (W_0) 是冻结的预训练权重(A \in \mathbb{R}^{r \times \text{in}})、(B \in \mathbb{R}^{\text{out} \times r}) 是低秩因子(r \ll \min(\text{in}, \text{out}))。低秩约束限制了表达空间难以逼近满秩的适配需求。HiRA 则改为逐元素乘性调制见 API 文档[ W W_0 W_0 \odot (B A) ]调制项 (W_0 \odot (B A)) 仍然是低秩参数化可训练参数量与 LoRA 同级但通过与 (W_0) 的 Hadamard 积耦合后其实际生效的更新不再是秩受限矩阵从而保留高秩表达能力。这一机制在 HiRA 原论文中被验证为在多项任务上优于 LoRA 及其变体本文档所在仓库仅作方法实现具体评测结论请以论文为准。从源码看PEFT 将 HiRA 注册为独立 PEFT 方法tuners/hira/init.pyregister_peft_method(namehira, config_clsHiraConfig, model_clsHiraModel, is_mixed_compatibleTrue)其中is_mixed_compatibleTrue意味着 HiRA 支持与 LoRA 等其他方法混合也支持同一批内不同 adapter 的混合推理。环境准备与脚本概览示例脚本依赖以下主要包torchtransformers模型、Tokenizer、Trainerdatasets加载yahma/alpaca-cleanedpeftHiraConfig、get_peft_model、PeftModel多机多卡场景下还需要accelerate脚本会自动检测并使用脚本入口train()的参数及默认值如下表所示与 hira_finetuning.py 一一对应参数默认值说明base_modelpath/to/model基础模型 ID 或本地路径必填必须替换data_pathyahma/alpaca-cleaned指令数据集Hub 名称或本地目录output_dirhira适配器与检查点输出目录batch_size16每设备训练 batch sizenum_epochs1训练轮数learning_rate3e-4AdamW 学习率cutoff_len256截断长度val_set_size16从训练集划分出的验证集样本数eval_step/save_step100评估 / 保存间隔步device_mapauto模型设备映射多卡时自动改写为{: process_index}hira_r32HiRA 低秩因子维度Hadamard 调制秩hira_dropout0.0HiRA 层 dropout 概率hira_target_modulesNone逗号分隔的目标模块名默认使用标准解码器模块集dtypefloat16模型加载精度float16/float32/bfloat16等seedNone随机种子设置后调用set_seedinit_weightsTrue是否以 no-op 方式初始化 HiRA 权重运行脚本命令行全参数解析README 给出的最小运行方式如下python examples/hira_finetuning/hira_finetuning.py \ --base_model meta-llama/Meta-Llama-3-8B-Instruct \ --data_path yahma/alpaca-cleaned \ --output_dir hira-alpaca \ --hira_r 16 \ --hira_dropout 0.05 \ --learning_rate 3e-4 \ --num_epochs 3注意--hira_r 16、--hira_dropout 0.05、--num_epochs 3是 README 示例的推荐配置而脚本内置默认值为hira_r32、hira_dropout0.0、num_epochs1两者皆可运行按需选择即可。若想覆盖更多行为可组合使用脚本支持的全部命令行参数argparse 定义python examples/hira_finetuning/hira_finetuning.py \ --base_model meta-llama/Meta-Llama-3-8B-Instruct \ --data_path yahma/alpaca-cleaned \ --output_dir hira-alpaca \ --batch_size 8 \ --num_epochs 3 \ --learning_rate 3e-4 \ --cutoff_len 512 \ --val_set_size 64 \ --eval_step 50 \ --save_step 50 \ --hira_r 32 \ --hira_dropout 0.05 \ --hira_target_modules q_proj,k_proj,v_proj,o_proj,gate_proj,down_proj,up_proj \ --dtype bfloat16 \ --seed 42 \ --init_weights几个值得注意的参数行为--hira_target_modules接收逗号分隔的字符串脚本内部会按逗号切分并去除空白得到目标模块名列表实现。--init_weights与--no_init_weights是一对互斥开关默认开启no-op 初始化--no_init_weights则改用随机初始化通常仅用于调试训练前适配器不再是恒等映射。--device_map默认auto当检测到WORLD_SIZE或PMI_SIZE大于 1分布式训练且device_map ! cpu时脚本会自动导入accelerate.Accelerator并把设备映射改写为{: process_index}保证每个进程只占一张卡实现。目标模块默认覆盖注意力与 MLP 全投影脚本内置的默认目标模块覆盖了解码器架构中典型的注意力投影和 MLP 块default_target_modulesdefault_target_modules [ q_proj, k_proj, v_proj, o_proj, # 注意力四投影 gate_proj, down_proj, up_proj, # SwiGLU MLP 三投影 ]这一组合与 src/peft/utils/constants.py 中TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING对 llama / llama4 / mistral / qwen2 等架构的记录一致TRANSFORMERS_MODELS_TO_HIRA_TARGET_MODULES_MAPPING正是该映射的副本见 constants.py因此对 Llama 系、Mistral、Qwen2 等常见模型可直接生效。若你的基础模型使用不同模块命名例如 OPT 的fc1/fc2、GPT-2 的c_attn务必通过--hira_target_modules或HiraConfig.target_modules显式指定。target_modules也支持正则表达式字符串如.*decoder.*(SelfAttention|EncDecAttention).*(q|v)$或通配符all-linear匹配所有 Linear/Conv1D若模型是PreTrainedModel则排除输出层相关语义见 HiraConfig 定义。核心流程拆解从数据到 Trainertrain()的执行主线如下加载模型与 TokenizerL58-L63以指定dtype与device_map加载AutoModelForCausalLMTokenizer 以trust_remote_codeTrue加载若pad_token为None则用eos_token兜底。Alpaca 式指令模板generate_promptreturn fBelow is an instruction that describes a task. Write a response that appropriately completes the request. ### Instruction: {example[instruction]} ### Response: {example[output]}TokenizeL65-L83按cutoff_len截断若未到截断长度且不以eos_token_id结尾则手动追加 EOSlabels与input_ids相同标准 LM 自回归监督。构建 HiRA 适配器L99-L106config HiraConfig( rhira_r, target_moduleshira_target_modules or default_target_modules, hira_dropouthira_dropout, init_weightsinit_weights, task_typeCAUSAL_LM, ) model get_peft_model(model, config)数据划分与映射L108-L112加载数据集后用train_test_split(test_sizeval_set_size, seed42)切出验证集再对训练/验证集分别.map(generate_and_tokenize_prompt)。Trainer 配置L114-L137关键设定包括warmup_steps100、optimadamw_torch、按步评估与保存、save_total_limit3、load_best_model_at_endTrue多卡时设置ddp_find_unused_parametersFalse以提升 DDP 效率DataCollatorForSeq2Seq使用pad_to_multiple_of8对齐序列长度。训练、保存与回载验证L138-L143训练结束后model.save_pretrained(output_dir)保存适配器随后重新加载基础模型并用PeftModel.from_pretrained回载适配器这一步即验证了保存/加载链路的正确性也是后续推理的标准范式。HiraConfig 参数详解源码级HiraConfig继承自PeftConfigconfig.py__post_init__中把target_modules/exclude_modules转为set并设置peft_type PeftType.HIRA。除脚本用到的r、target_modules、hira_dropout、init_weights、task_type外还可配置参数默认值说明exclude_modulesNone显式排除的模块名支持正则优先级高于target_modulesfan_in_fan_outFalse被替换层权重是否按(fan_in, fan_out)存储GPT-2 的Conv1D需设为True源码会自动校验并告警dispatch_defaultmodules_to_saveNone除适配层外还需可训练并保存的模块如分类任务随机初始化的classifier/score头init_weightsTrue见下节初始化说明支持True/False/gaussianlayers_to_transformNone仅对指定层索引nn.ModuleList下标施加适配与字符串形式的target_modules互斥会抛ValueErrorlayers_patternNone与layers_to_transform配合指定模块列表名常为layers或hrank_pattern{}按层名/正则给不同层分配不同秩例如{^model.decoder.layers.0.encoder_attn.k_proj: 16}rank_pattern的生效逻辑在 HiraModel._create_and_replace 中通过get_pattern_key匹配当前层名命中则用该层专用秩否则回退到全局r。底层实现原理HiraLayer 的前向、初始化与合并前向计算HiraLayer保存四类适配参数layer.pyhira_A、hira_BLinear/Conv与hira_embedding_A、hira_embedding_BEmbedding。Linear 层的前向forward可简化为hira_A, hira_B self.hira_A[active_adapter], self.hira_B[active_adapter] _prod_AB torch.mm(hira_A.T, hira_B.T) # (in, out) dropout_sub self.hira_dropoutactive_adapter hira_result F.linear( dropout_sub, transpose(base_weight, fan_in_fan_out) * _prod_AB.T # W0 ⊙ (B A) ) result result hira_result即输出 基础层输出 输入经W_0 ⊙ (B A)的线性投影与论文公式 (W W_0 W_0 \odot (BA)) 严格对应。合并路径HiraLayer._merge同样遵循该公式merged_weight weight.data base_weight * new_delta # new_delta B A注意这里与 LoRA 合并W BA的本质区别HiRA 的增量是W_0 * (B A)依赖当前基座权重。因此Linear.supports_lora_conversion返回Falselayer.pyPEFT 明确禁止把 HiRA 适配器转成 LoRA——转换出的 LoRA 无法保持 HiRA 的乘性行为。权重初始化reset_hira_parameterslayer.py实现了三种初始化策略init_weightsTrue默认hira_A用kaiming_uniform_(asqrt(5))与nn.Linear默认初始化一致hira_B置零。由于B0训练前调制项为零适配器是精确的 no-op不影响基座模型输出init_weightsgaussianhira_A用normal_(std1/r)高斯初始化B仍置零init_weightsFalse跳过重置A、B保持随机初值训练前非恒等映射——仅用于调试对应脚本的--no_init_weights。支持的目标层类型dispatch_defaultlayer.py按类型分派nn.Linear、nn.Embedding、nn.Conv1d/2d/3d、HuggingFaceConv1D均可替换。其中 Embedding 层的前向把调制矩阵作用于词嵌入查找Embedding.forward卷积层则逐元素调制卷积核权重_ConvNd.forward且不支持groups 1的分组卷积会抛NotImplementedErrorlayer.py。量化模型支持当基座模型以 bitsandbytes 8bit/4bit 加载时tuners/hira/bnb.py 提供Linear8bitLt与Linear4bit前向中先反量化权重再执行乘性调制8bit 见 forward4bit 见 forward合并/反合并因涉及再量化可能产生舍入误差源码会显式告警。这为 QLoRA 风格的 HiRA 量化训练留出了路径——结合prepare_model_for_kbit_training与BitsAndBytesConfig可参考 API 文档中的 kbit 示例。保存、加载与多适配器保存model.save_pretrained(output_dir)只保存适配器权重与adapter_config.json基座权重不动磁盘占用极小。加载先加载基座模型再PeftModel.from_pretrained(model, output_dir)脚本 L142-L143 即此流程。合并训练后可用model.merge_and_unload()将 HiRA 调制权重并入基座以加速推理safe_mergeTrue可检测 NaN。is_mixed_compatibleTrue还允许与其他 PEFT 方法共存并在推理时通过adapter_names参数实现批内多适配器混合4bit/8bit 层均有_mixed_batch_forward实现。测试覆盖与验证入口仓库测试中已包含 HiRA 相关覆盖HiraConfig的默认实例化校验位于 tests/test_config.py此外tests/testing_common.py以及test_decoder_models.py、test_encoder_decoder_models.py、test_seq_classifier.py、test_custom_models.py、test_quantization.py、test_initialization.py等测试文件均涉及 HiRA 的通用测试路径可搜索Hira关键字定位可用于验证本示例之外更广泛的 HiRA 行为。注意事项与限制必须替换--base_model脚本默认值为占位符path/to/model直接运行会失败。模块命名要对齐默认目标模块面向 Llama 系解码器换架构时先通过model.named_modules()确认投影层命名再传--hira_target_modules。init_weights语义默认 no-op 初始化意味着训练前输出与基座完全一致这是特性而非 bug调试异常时才建议--no_init_weights。不可转 LoRAHiRA 的乘性更新依赖当前基座权重supports_lora_conversion返回False不要尝试将 HiRA 适配器转换为 LoRA。分组卷积不支持目标为Conv2d/3d且groups 1时会直接报错。量化合并有舍入8bit/4bit 基座上的 merge/unmerge 因反量化与再量化可能存在精度损失源码会发出警告。超参数起点README 推荐r16、dropout0.05、lr3e-4、epochs3脚本默认r32、dropout0.0、epochs1。两者皆可作为起步配置实际效果以你所在任务上的验证为准。至此你已具备从命令行到源码级的 HiRA 微调全链路知识既能直接跑通 hira_finetuning.py 完成 Alpaca 指令数据上的模型微调也能依据 HiraConfig、HiraLayer 与 HiraModel 深入定制自己的 HiRA 训练与推理流程。赞分享人工智能大模型微调LoRA【免费下载链接】peft PEFT: State-of-the-art Parameter-Efficient Fine-Tuning.项目地址https://gitcode.com/gh_mirrors/pe/peft点击查看免费下载相关推荐LoRA低秩适配大语言模型微调的革命性突破LoRA低秩适配大语言模型微调的革命性突破 LoRALow Rank Adaptation技术基于矩阵低秩分解的数学理论基础通过奇异值分解SVD和低人工智能大模型微调LoRATransformers 微调实战指南使用 Trainer 训练因果语言模型Transformers 微调实战指南使用 Trainer 训练因果语言模型 微调Fine tuning是指在较小的、面向特定任务或领域的数据集上继续训人工智能深度学习机器学习预训练微调NLP计算机视觉语音多模态Distilly 人物蒸馏指南把同事、伴侣与公众人物的经验与表达封装成可复用的 Agent SkillDistilly 人物蒸馏指南把同事、伴侣与公众人物的经验与表达封装成可复用的 Agent Skill 本文以仓库中 docs/lang/README_JAAI 技能/插件人工智能上一篇Vito故障排查手册常见问题分析与解决方案下一篇Laguna XS 2.1的OpenMDW许可证解析商业使用的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考