大模型 lora 训练后的权重合并

部署运行你感兴趣的模型镜像

本文将介绍如下内容:

  • 一、Lora 合并的环境依赖
  • 二、Lora 合并代码实现

一、Lora 合并的环境依赖

autoawq                           0.2.5
peft                              0.14.0
transformers                      4.46.3

二、Lora 合并代码实现

import torch
from peft import PeftModel
from transformers import AutoTokenizer, AutoModelForCausalLM, LlamaTokenizer
from transformers.generation.utils import GenerationConfig


def apply_lora(model_name_or_path, output_path, lora_path):
    print(f"Loading the base model from {model_name_or_path}")
    base_tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=False, trust_remote_code=True)
    # base = AutoModelForCausalLM.from_pretrained(model_name_or_path, torch_dtype=torch.bfloat16, trust_remote_code=True)
    base = AutoModelForCausalLM.from_pretrained(model_name_or_path, torch_dtype=torch.float32, trust_remote_code=True)

    print(f"Loading the LoRA adapter from {lora_path}")

    lora_model = PeftModel.from_pretrained(
        base,
        lora_path,
        torch_dtype=torch.float32,
    )

    print("Applying the LoRA")
    model = lora_model.merge_and_unload()

    print(f"Saving the target model to {output_path}")
    model.save_pretrained(output_path)
    base_tokenizer.save_pretrained(output_path)


if __name__ == "__main__":
    model_name_or_path = "/nasdata/zhanjie/models/Qwen2.5-32B-Instruct"
    output_path = "./output"
    lora_path = "/nasdata/zhanjie/models/qwen2_5-32B-lora-1-0-7"
    apply_lora(model_name_or_path, output_path, lora_path)
    print("Done")

您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

<think>首先,用户的问题是:“请问如何将LoRA微调后的模型与基础模型合并?”这基于用户引用的内容,特别是引用[2],其中提到了使用peft库的AutoPeftModelForCausalLM类来合并LoRA适配器。我的回答需要遵循系统级指令:-所有行内数学表达式必须使用$...$格式。-独立公式必须使用$$...$$格式并单独成段。 -LaTeX语法正确。-使用中文回答。-生成相关问题。 -在回答中引用的段落末尾自然地添加引用标识,例如[^1]。用户可见层的指令:-回答结构清晰,帮助用户逐步解决问题。 -尽量保证回答真实可靠。-参考站内引用,但用户引用的内容是:-引用[1]:关于微调GLM-4模型的步骤。-引用[2]:关于使用peft库合并LoRA适配器的代码片段。用户真正关心的是如何合并LoRA微调后的模型,所以我需要基于引用[2]来回答。关键点: -用户提到“我想用户希望了解如何将LoRA训练后的模型合并到原始模型中”。-引用[2]显示:使用AutoPeftModelForCausalLM.from_pretrained加载模型,然后调用merge_and_unload()方法合并。所以,我的回答应该:1.解释什么是LoRA微调。 2.描述合并的必要性。3.提供逐步的合并步骤,使用代码示例。 4.确保代码正确,基于引用[2]。5.使用中文。6.在末尾生成相关问题。7.在引用内容添加引用标识。 结构清晰的回答:-介绍LoRA微调。-为什么需要合并。-如何合并:详细步骤。-代码示例。 -总结。 -相关问题。 LaTeX使用:用户的问题中没有数学表达式,但如果有需要,我会使用$...$或$$...$$。例如,如果提到参数,我可以使用数学格式,但这里可能不需要。生成相关问题:基于主题,如合并后的验证、部署等。 最终输出格式:-回答部分。 -§§相关问题§§部分。</think>### 如何将LoRA微调后的模型与基础模型合并 LoRA(Low-Rank Adaptation)是一种高效的大模型微调技术,它通过添加低秩矩阵来更新基础模型的权重,而不是修改整个模型参数。这减少了计算开销和内存需求。微调完成后,通常需要将LoRA适配器合并回基础模型,以便部署或推理时使用单个模型文件,提升效率并简化部署流程[^2]。以下我将逐步解释合并过程,确保回答真实可靠,基于主流的`peft`库实现(如引用[2]所示)。 #### 为什么需要合并? - **性能优化**:合并后模型推理速度更快,因为消除了适配器层的额外计算。 - **部署简化**:单个模型文件更易于部署到生产环境(如API服务或嵌入式系统)。 - **兼容性提升**:合并模型可直接用于标准推理框架(如Hugging Face Transformers),无需额外加载适配器。 #### 合并步骤详解 合并过程使用`peft`库(PEFT: Parameter-Efficient Fine-Tuning),它提供了简单的方法加载和合并LoRA适配器。以下是详细步骤: 1. **安装依赖**:确保环境安装了必要的库。使用pip安装: ```bash pip install peft transformers torch ``` 2. **加载微调后的模型**:使用`AutoPeftModelForCausalLM`从保存的LoRA适配器目录加载模型。这一步会同时加载基础模型和适配器权重。 - 参数说明: - `low_cpu_mem_usage=True`:减少CPU内存占用,适合资源受限环境。 - `device_map="auto"`:自动分配模型到可用设备(如GPU)。 - 示例代码: ```python from peft import AutoPeftModelForCausalLM # 替换为你的LoRA微调模型路径 model_path = "path/to/your/lora_fine_tuned_model" model = AutoPeftModelForCausalLM.from_pretrained( model_path, low_cpu_mem_usage=True, device_map="auto" ) ``` 3. **执行合并操作**:调用`merge_and_unload()`方法,将LoRA适配器权重合并到基础模型中,并卸载适配器层。 - 这个方法会原地修改模型权重,生成一个完整的合并模型。 - 示例代码: ```python # 合并LoRA适配器和基础模型 merged_model = model.merge_and_unload() ``` 4. **保存合并后的模型**:将合并模型保存到指定目录,以便后续使用。 - 使用`save_pretrained`方法保存模型权重和配置文件。 - 示例代码: ```python # 保存合并模型 merged_model.save_pretrained("path/to/save/merged_model") ``` 5. **验证合并结果**:加载合并模型进行简单推理测试,确保输出与微调后一致。 - 示例代码(使用Hugging Face Transformers): ```python from transformers import AutoTokenizer, pipeline tokenizer = AutoTokenizer.from_pretrained("path/to/save/merged_model") pipe = pipeline("text-generation", model=merged_model, tokenizer=tokenizer) output = pipe("输入测试文本")[0]['generated_text'] print(output) # 检查输出是否合理 ``` #### 注意事项 - **内存要求**:合并过程可能消耗较多内存,建议在GPU上进行。如果内存不足,减小批量大小或使用`low_cpu_mem_usage`参数。 - **模型兼容性**:确保基础模型与LoRA适配器兼容(如相同架构版本)。引用[2]中示例使用Qwen模型,但方法适用于支持PEFT的模型(如LLaMA、GLM等)。 - **最佳实践**:合并前备份原始适配器文件,以防意外错误。微调后的模型验证是关键步骤,可参考引用[1]中的方法测试性能[^1]。 合并完成后,您可以直接部署模型进行推理,无需额外处理适配器层。这显著提升了效率,尤其在资源受限场景中[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值