:基于 LoRA/DoRA 在 Commonsense 170k 上的完整实战指南)
深度学习计算机视觉NLP多模态模型训练大模型【免费下载链接】corenetCoreNet: A library for training deep neural networks项目地址https://gitcode.com/GitHub_Trending/co/corenet点击查看免费下载CoreNet 为 OpenELM 语言模型家族提供了一套完整的参数高效微调PEFT方案支持 LoRALow-Rank Adaptation与 DoRAWeight-Decomposed Low-Rank Adaptation两种适配器并配套了与 LLM-Adapters 协议一致的常识推理评估流程。本文将围绕 projects/openelm/README-peft.md 展开带你从零搭建评估环境、微调 270M 模型、在 8 个常识推理数据集上完成评估并深入解析 CoreNet 中 LoRA/DoRA 的源码级实现让你既能照抄命令跑通实验也能理解背后的配置与原理。一、评估协议与背景为什么使用 LLM-Adapters 协议OpenELM 的 PEFT 微调遵循 LLM Adapters 论文中的评估设置在 8 个常识推理数据集boolq、piqa、siqa、hellaswag、winogrande、arc-easy、arc-challenge、obqa上联合微调训练集规模为 170k 样本即 Commonsense 170k。与 LLM-Adapters 官方代码的评估设置相比CoreNet 做了一处关键改进使用 log-likelihood对数似然而非正则表达式解析regex parsing来判断模型输出。这一改进在 corenet/cli/main_eval_llmadapters.py 的模块注释中有明确说明——除了沿用 LLM-Adapters 的生成式generation-style评估外还增加了多选题式multiple-choice-style评估通过比较各候选答案的对数似然来决定最终答案对小模型的结果有显著提升。在仓库中CommonSense 170k 数据集由 corenet/data/datasets/language_modeling/commonsense_170k.py 中的CommonSense170k类实现注册名为commonsense_170k本质上是上述 8 个数据集的简单拼接并对所有子数据集统一采用generate_prompt_and_response生成提示模板### Instruction:/### Input:/### Response:三段式结构。二、环境准备Setup为保证评估与 LLM-Adapters 结果的一致性需要安装三个外部组件lm-evaluation-harness、LLM-Adapters 以及 HuggingFace 相关依赖。官方推荐的安装步骤如下以 CoreNet 仓库根目录为工作目录# 进入 CoreNet 仓库根目录 cd /path/to/corenet # 1. 安装 LM Harness git clone https://github.com/EleutherAI/lm-evaluation-harness.git cd lm-evaluation-harness git checkout 3196e907fa195b684470a913c7235ed7f08a4383 python3 -m pip install -e . -c ../requirements.txt cd .. # 2. 安装 LLM Adapters git clone https://github.com/AGI-Edgerunners/LLM-Adapters.git cd LLM-Adapters git checkout 816657208af4db747803f87ba40a4c71383fed7a touch __init__.py python3 -m pip install -r requirements.txt -c ../requirements.txt cd .. # 3. 安装 Huggingface 及其依赖 python3 -m pip install --upgrade \ transformers4.36.2 \ datasets2.19.0 \ accelerate0.29.3 \ sentencepiece0.2.0 \ -c requirements.txt几点说明两个外部仓库都固定到了精确的 commit3196e907与81665720这是为了保证评估逻辑与论文实验完全一致切勿随意更换版本-c ../requirements.txt表示以 CoreNet 根目录下的 requirements.txt 作为约束文件constraints避免依赖版本冲突实验使用LLaMA v1/v2 tokenizerSentencePiece 模型需要从官方仓库下载 tokenizer 文件后续通过命令行参数传入路径。三、LoRA 微调训练3.1 训练命令微调一个 270M 参数的 OpenELM 模型使用 LoRA 的完整命令如下CFG_FILEprojects/openelm/peft_configs/openelm_lora_270M.yaml WTS_FILEOPENELM-270M-预训练权重-checkpoint_average.pt 的 URL TOKENIZER_FILEPATH_TO_TOKENIZER_FILE # NOTE: 数据集当前可从 LLM-Adapters 仓库的 ft-training_set/commonsense_170k.json 获取。 DATASET_FILEPATH_TO_COMMONSENSE_170K corenet-train --common.config-file $CFG_FILE \ --model.language-modeling.pretrained $WTS_FILE \ --text-tokenizer.sentence-piece.model-path $TOKENIZER_FILE \ --dataset.language-modeling.commonsense-170k.path $DATASET_FILE其中WTS_FILEOpenELM-270M 官方发布的分词后平均权重checkpoint_average.pt预训练权重发布信息见 projects/openelm/README-pretraining.md 的权重清单取 Avg. last 5 ckpts 一行TOKENIZER_FILELLaMA v1/v2 SentencePiece 模型文件路径DATASET_FILECommonsense 170k 的 JSON 文件路径即 LLM-Adapters 仓库中ft-training_set/commonsense_170k.json。若想改用DoRA训练只需编辑配置文件将 LoRA 配置中的use_dora设为True即可详见下文第四节。3.2 配置文件逐段解读openelm_lora_270M.yaml训练配置位于 projects/openelm/peft_configs/openelm_lora_270M.yaml全文结构完整、注释详尽以下是各段落的要点解析。锚点anchor与硬件友好设置_anchor_context_length: _anchor_context_length 2048 # 实际词表大小添加 padding token 后为 32001此处再补充少量 token 使 LM 分类层更贴合硬件 _anchor_vocab_size: _anchor_vocab_size 32128 _anchor_padding_index: _anchor_padding_index 32000vocab_size取 32128 而非实际的 32001是为了让分类层维度对硬件更友好padding_index32000用于后续损失计算时忽略 padding 位置。训练通用配置commoncommon: run_label: train log_freq: 500 auto_resume: true grad_clip: 1.0 save_all_checkpoints: true save_interval_freq: 5000 eval_every_k_iterations: 10000 mixed_precision: true mixed_precision_dtype: bfloat16 accum_freq: 2开启 bfloat16 混合精度训练梯度裁剪阈值 1.0每 5000 步保存一次检查点每 10000 步评估一次梯度累积频率为 2。数据集datasetdataset: root_train: disable_val: true train_batch_size0: 8 workers: 4 persistent_workers: true pin_memory: true category: language_modeling name: commonsense_170k language_modeling: commonsense_170k: # 取消注释并更新 CommonSense170k 的路径 # path: PATH_TO_COMMONSENSE170K sequence_length: *_anchor_context_length min_tokens_per_text: 0 min_characters_per_text: 0 shuffle_data: true批次大小 8序列长度 2048。数据集的path也可以在命令行用--dataset.language-modeling.commonsense-170k.path覆盖训练命令就是这么做的。tokenizertext_tokenizertext_tokenizer: name: sentence_piece sentence_piece: enable_nfc_normalization: true append_sot_token: true append_eot_token: true # 取消注释并更新 LLAMA SentencePiece 模型文件路径 # model_path: PATH_OF_LLAMA_SPM_MODEL使用 SentencePiece 分词器启用 NFC 规范化并在序列首尾追加 SOT/EOT 特殊 token。损失函数lossloss: category: language_modeling language_modeling: name: cross_entropy cross_entropy: ignore_index: *_anchor_padding_index use_z_loss: true交叉熵损失ignore_index32000忽略 padding tokenuse_z_loss: true表示启用 z-loss 以稳定 bfloat16 训练下的 softmax 输出。优化器与调度器optim / scheduleroptim: name: adamw weight_decay: 0 no_decay_bn_filter_bias: true adamw: beta1: 0.9 beta2: 0.95 eps: 1.e-8 scheduler: is_iteration_based: true # 训练 3 个 epoch max_iterations: 4375 name: cosine warmup_init_lr: 1.e-06 warmup_iterations: 1000 cosine: max_lr: 0.0003 # 论文使用 min_lr 0.1 x max_lr min_lr: 0.00003AdamWbeta10.9beta20.95eps1e-8权重衰减为 0基于迭代的余弦退火调度器总迭代 4375 步170k / (8×2×3 epoch) 量级1000 步 warmup峰值学习率 3e-4最低学习率 3e-5。模型与 LoRA 配置model——这是整个文件的核心model: # 允许重新加载预训练模型 rename_scopes_map: - [token_embeddings.weight, token_embeddings.base_layer.weight] - [layers.(.*).qkv_proj.weight, layers.\1.qkv_proj.base_layer.weight] - [layers.(.*).out_proj.weight, layers.\1.out_proj.base_layer.weight] - [layers.(.*).proj_(\d).weight, layers.\1.proj_\2.base_layer.weight] ignore_missing_scopes: - .*lora.* freeze_modules: [.*base_layer.*, .*norm.*] activation_checkpointing: false language_modeling: name: general_gpt general_gpt: model_name: OpenELM-270M vocab_size: *_anchor_vocab_size max_context_length: *_anchor_context_length padding_index: *_anchor_padding_index lora: use_lora: true config: - regex: .*token_embedding.* module_type: embedding params: adapter_name: lora r: r 32 lora_alpha: alpha 32 lora_dropout: dropout 0.1 init_lora_weights: ilw true use_rslora: ur false use_dora: ud false - regex: .*out_proj.* module_type: linear params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: .*qkv_proj.* module_type: linear params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud - regex: .*proj_\d.* module_type: linear params: adapter_name: lora r: *r lora_alpha: *alpha lora_dropout: *dropout init_lora_weights: *ilw use_rslora: *ur use_dora: *ud关键机制逐条说明rename_scopes_map由于 LoRA 包装后原始权重变为base_layer.weight加载预训练权重时需要把旧的权重名映射到新名字正则\1、\2引用捕获组ignore_missing_scopes: [.*lora.*]预训练检查点中不存在 LoRA 参数加载时需忽略缺失的 LoRA scopefreeze_modules冻结所有base_layer与norm相关的参数只训练新增的 LoRA 适配器——这就是参数高效的关键所在lora.config通过 4 条正则规则精确指定注入位置——token embeddingmodule_type: embedding、输出投影out_proj、注意力 QKV 投影qkv_proj、FFN 中间投影proj_\dmodule_type: linear超参数rankr32、lora_alpha32、lora_dropout0.1、init_lora_weightstrue、use_rslorafalse、use_dorafalse默认用标准 LoRADoRA 需手动开启。统计与 LM Eval 包装stats / lm_eval_wrapperstats: val: [ loss] train: [loss] checkpoint_metric: loss.total_loss checkpoint_metric_max: false lm_eval_wrapper: add_sot_token: true以 loss 作为 checkpoint 选择指标越小越好checkpoint_metric_max: false并在 LM eval 包装器中追加 SOT token。其余 PEFT 配置文件1.1B / 450M / 3B结构相同仅model_name、是否开启activation_checkpointing等细节不同其中 1.1B 配置openelm_lora_1_1B.yaml将activation_checkpointing设为true以节省显存。四、LoRA / DoRA 的源码级实现原理CoreNet 的 PEFT 实现位于 corenet/third_party/modeling/lora.py约 1400 行是在 HuggingFace PEFT 库 LoRA layer 基础上适配而来支持 LoRA 与 DoRA 两种变体。理解几个核心类与函数就能把握整个微调机制4.1 LoraLayer适配器层的公共基类LoraLayer继承BaseTunerLayer为所有适配器层提供公共能力多适配器管理set_adapter()/enable_adapters()支持在多个 adapter 之间切换并自动控制requires_gradmerge()/unmerge()支持把适配器权重合并进或从基础权重中拆出合并时支持safe_merge模式先拷贝权重、检测 NaN 再写回scaling 规则标准 LoRA 下scaling lora_alpha / r若启用 RS-LoRAuse_rsloraTrue则改为scaling lora_alpha / sqrt(r)见update_layer中Linear的实现权重初始化reset_lora_parameters()对lora_A使用 Kaiming Uniformlora_B置零也可选择gaussian初始化。4.2 Linear 与 Embedding两种适配器包装Linear包装LinearLayer创建lora_A: [in_features → r]与lora_B: [r → out_features]两个无 bias 线性层前向时在基础输出上叠加lora_B(lora_A(dropout(x))) * scalingEmbedding包装词嵌入层以lora_embedding_A / lora_embedding_B两个nn.Parameter实现低秩增量注意 Embedding 目前不支持 DoRA代码中会直接抛出ValueError(DoRA is not yet supported for Embedding layers.)。4.3 DoRA权重分解低秩适配dora_init()与_apply_dora()实现 DoRA 的核心思想将权重分解为幅度magnitude与方向direction两部分只对方向做低秩更新。实现细节包括用lora_magnitude_vector可学习参数表示幅度初始化为W ΔW的逐行 L2 范数前向时按论文 4.3 节建议将||V δV||_c从计算图中detach掉weight_norm.detach()使其动态反映 δV 的更新但不接收梯度计算mag_norm_scale magnitude / weight_norm最终输出为(mag_norm_scale - 1) * base(x) mag_norm_scale * lora_B(lora_A(x)) * scaling。4.4 注入流程add_lora_layersadd_lora_layers(model, lora_config)负责把 LoRA 层插入模型将 YAML 配置解析为LoRAConfig → LayerConfig → LoRAParamsfrom_json逐层构建构建module → parents映射遍历named_modules()逐层匹配正则命中正则的模块替换为make_lora_layer()生成的适配器包装层若一个层匹配了多条正则或模块被重复替换会抛出ValueError防止歧义最后通过setattr(parent, child_name, new_module)完成模块替换。这个正则决定注入位置、freeze_modules冻结基础权重的组合正是配置文件model.lora.config与model.freeze_modules能直接工作的底层原因。五、评估在 8 个常识推理数据集上验证5.1 评估命令对训练好的 LoRA 270M 模型进行评估CFG_FILEprojects/openelm/peft_configs/openelm_lora_270M_eval.yaml WTS_FILE已微调的 LoRA-270M 权重 openelm_lora_270M.pt 的 URL TOKENIZER_FILEPATH_TO_TOKENIZER_FILE corenet-eval-llmadapters --common.config-file $CFG_FILE \ --model.language-modeling.pretrained $WTS_FILE \ --text-tokenizer.sentence-piece.model-path $TOKENIZER_FILE评估入口corenet-eval-llmadapters对应 corenet/cli/main_eval_llmadapters.py。其工作流程为CoreNetLMEvalWrapper继承 lm-evaluation-harness 的HFLMAPI通过 corenet/utils/hf_adapter_utils.py 中的CorenetToHFPretrainedModel把 CoreNet 模型包装成 HuggingFacePreTrainedModel当前评估仅支持 LLaMA tokenizer且 batch_size 固定为 1遍历llmadapters_evaluation.datasets指定的任务列表对每个任务加载dataset_dir下对应子目录的test.json结果写入common.results_loc目录汇总为results.json。5.2 两种评估方式评估配置 openelm_lora_270M_eval.yaml 中设置了llmadapters_evaluation.multiple_choice: true表示默认走多选题式log-likelihood评估。两种方式分别对应生成式评估main_generation沿用 LLM-Adapters 的 prompt 模板与采样参数temperature0.1、top_p0.75、top_k40、num_beams4、max_new_tokens32对生成结果用正则提取答案如 boolq 提取true/false、piqa 提取solution1/solution2等见extract_answer_from_generation多选题式评估main_multiple_choice对每个候选答案the correct answer is {answer}形式计算 log-likelihood取最大者作为答案同时给出按答案长度归一化的acc_norm。这正是 README 中使用 log-likelihood 而非 regex parsing的落地实现对小模型效果显著更好。5.3 预期结果官方给出的 LoRA 270M 模型在 8 个数据集上的预期准确率如下boolqpiqasiqahellaswagwinograndearc-easyarc-challengeobqa62.1450.0542.0224.8449.8826.6024.5728.00该表可作为复现实验的验收基准如果你的配置、数据与权重一致8 项指标应能对上。若要评估其他预训练模型450M / 1.1B / 3B编辑配置文件切换general_gpt.model_name与权重即可若要评估 DoRA 模型同样将use_dora设为True。六、官方发布的 LoRA / DoRA 微调权重官方随 v0.1.0 发布了 OpenELM 全系列的 PEFT 权重训练命令中的WTS_FILE可直接指向这些文件下载 URL 请参考官方模型发布说明ModelLoRA/DoRAWeightsOpenELM-270MLoRAopenelm_lora_270M.ptOpenELM-450MLoRAopenelm_lora_450M.ptOpenELM-1.1BLoRAopenelm_lora_1.1B.ptOpenELM-3BLoRAopenelm_lora_3B.ptOpenELM-270MDoRAopenelm_dora_270M.ptOpenELM-450MDoRAopenelm_dora_450M.ptOpenELM-1.1BDoRAopenelm_dora_1.1B.ptOpenELM-3BDoRAopenelm_dora_3B.pt配套的 PEFT 配置文件全部位于 projects/openelm/peft_configs/openelm_lora_270M.yaml、openelm_lora_450M.yaml、openelm_lora_1_1B.yaml、openelm_lora_3B.yaml以及评估专用配置openelm_lora_270M_eval.yaml。七、实践要点与常见调整切换 LoRA / DoRA在所有params块中将use_dora: false改为use_dora: true即可评估配置同理注意 Embedding 层不支持 DoRA配置中 embedding 规则保持不变即可。切换骨干模型修改general_gpt.model_name如OpenELM-450M、OpenELM-1_1B、OpenELM-3B并同步更换对应的预训练权重与 PEFT 权重。调整秩与缩放r与lora_alpha是 LoRA 最重要的两个超参数默认均为 32若开启use_rslora: true缩放因子会变为alpha / sqrt(r)可缓解大 rank 下的过度缩放问题。冻结与加载语义freeze_modules决定哪些参数不更新rename_scopes_map与ignore_missing_scopes共同保证预训练权重能正确加载进 LoRA 包装后的模型——三者必须与lora.config的正则保持一致。显存控制更大模型如 1.1B建议像 openelm_lora_1_1B.yaml 一样开启activation_checkpointing: true。通过以上配置与命令你可以在 CoreNet 中完整复现 OpenELM 的 LoRA/DoRA 微调与常识推理评估流程进一步了解 OpenELM 的预训练、指令微调与 MLX 转换可继续阅读 projects/openelm/README.md 中的导航说明。赞分享深度学习计算机视觉NLP多模态模型训练大模型【免费下载链接】corenetCoreNet: A library for training deep neural networks项目地址https://gitcode.com/GitHub_Trending/co/corenet点击查看免费下载相关推荐TimesFM 2.5 LoRA 参数高效微调实战基于 HuggingFace Transformers 与 PEFT 的完整指南TimesFM 2.5 LoRA 参数高效微调实战基于 HuggingFace Transformers 与 PEFT 的完整指南 本指南系统讲解如何在当前仓人工智能基础模型大模型时序预测微调AutoResearchClaw 中的 PEFT 实战指南从 LoRA/QLoRA 到 DoRA 的参数高效微调 API 全解析AutoResearchClaw 中的 PEFT 实战指南从 LoRA/QLoRA 到 DoRA 的参数高效微调 API 全解析 导读 本文是 AutoRes人工智能大模型AI Agent自主智能体深度研究科研MCP 服务后端OpenELM-3B-Instruct LoRA 微调实战基于 transformers 与 peft 的中文指令微调全流程指南OpenELM 3B Instruct LoRA 微调实战基于 transformers 与 peft 的中文指令微调全流程指南 本文以《开源大模型食用指南》大模型人工智能教程本地部署微调上一篇Wand-Enhancer终极指南如何免费解锁专业版功能与远程控制体验下一篇彻底解锁Wand专业版开源增强工具Wand-Enhancer完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考