趋近智
在准备将微调 (fine-tuning)后的模型投入生产时,如果让基础架构与独立的适配器层并行运行,会产生不必要的计算开销。在训练期间,保持低秩矩阵独立是标准做法,这有助于减少内存占用并高效更新参数 (parameter)。然而,在推理 (inference)阶段,在每次前向传递时动态地将适配器层的输出添加到基础模型层会减慢文本生成速度。为了优化性能,可以将训练好的 LoRA 适配器直接合并到原始模型权重 (weight)中。
回顾低秩自适应(Low-Rank Adaptation)的数学运算。对于给定的基础权重矩阵 和低秩适配器矩阵 及 ,合并后的权重矩阵 计算如下:
这里, 是缩放因子, 是训练前配置的秩参数。一旦完成此加法运算,就不再需要矩阵 和 了。新的权重矩阵 的运行方式与原始基础模型完全一致,但它包含了微调期间获得的特定行为。
将低秩适配器矩阵合并到基础模型权重中,以创建单一的可部署模型的过程。
在实际操作中,Hugging Face 的 peft 库将这一数学运算简化为了一个方法调用。你将使用 merge_and_unload() 函数。该函数执行矩阵乘法和加法,然后从内存中卸载独立的适配器实例。结果是一个标准的 Hugging Face Transformers 模型对象。
要进行合并,必须先加载基础模型,然后挂载适配器权重。
import torch
from transformers import AutoModelForCausalLM
from peft import PeftModel
base_model_id = "your-small-base-model"
adapter_path = "./lora-adapters"
# 以 16 位精度加载基础模型
base_model = AutoModelForCausalLM.from_pretrained(
base_model_id,
torch_dtype=torch.float16,
device_map="auto"
)
# 加载结合了基础权重和适配器的 PEFT 模型
model = PeftModel.from_pretrained(base_model, adapter_path)
# 合并权重并卸载适配器
merged_model = model.merge_and_unload()
合并操作要求以全精度或半精度(如 float16 或 bfloat16)加载基础模型和适配器。如果你在训练时使用了 QLoRA 且基础模型为 4 位量化 (quantization)模型,则无法直接将适配器合并回 4 位权重中。合并的数学运算需要一致的、非量化的张量类型,以防止严重的精度损失。
你必须以 float16 加载基础模型,应用适配器,然后执行合并。这一步对系统内存或显存 (VRAM)的需求暂时会高于训练阶段。如果你的本地机器显存不足以承载非量化模型,可以在初始加载模型时设置 device_map="cpu",强制在系统 CPU 上进行合并。这样做虽然速度较慢,但可以避免在硬件受限时出现显存溢出错误。
一旦 merge_and_unload() 完成,生成的模型在结构上与标准的、未经微调的模型完全一致。它不再依赖 peft 库即可运行,因此与优化后的推理引擎和服务框架具有极高的兼容性。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•