PEFT 参数高效微调全景
本页深入对比 LLM 应用生态概览中”专业培训”层的核心技术——PEFT(参数高效微调)。上一页 LLM 微调技术给出了微调的整体脉络与本页的速览,本页则把 LoRA、QLoRA、Adapter、Prefix Tuning、P-Tuning、Prompt Tuning 以及 2024-2025 年的新方法(DoRA、PiSSA、GaLore)全部放到一起,逐一讲清原理、参数量与推理开销的差异,帮助你在不同场景下做出选择。
全参微调像”为每个新技能重新装修整栋楼”,PEFT 像”只换几块招牌和插头就改变楼的用途”。
- 全参微调:更新模型全部参数,效果最好但代价极高——一个 70B 模型存一份权重就要上百 GB,多任务就得存多份,存储和算力都吃不消。
- LoRA(低秩适配):冻结原权重,在旁边加一个”低秩补丁”矩阵,只训练这个补丁。参数量约 0.1%-1%,效果接近全参,且推理时可合并、零额外延迟。
- QLoRA:在 LoRA 基础上把基座权重量化到 4-bit,单张消费级显卡就能微调大模型。
- Adapter(适配器):在 Transformer 层之间插入一个小瓶颈网络并训练它,但推理时多了一层计算、有额外延迟。
- Prefix/P-Tuning:不改动模型权重,而是给每层注意力注入若干可训练的”虚拟前缀 token”,相当于在模型外部”喂提示”。
- Prompt Tuning:最轻量,只在输入嵌入层加可训练向量,参数最少、改动最小,但容量也最低。
- DoRA(2024)/ PiSSA(2024)/ GaLore(2024):LoRA 的新一代变体,在参数效率、训练稳定性或显存节省上进一步突破,详见后文。
全参微调的痛点
Section titled “全参微调的痛点”假设要为 N 个下游任务微调一个 70B 模型。全参微调需要:为每个任务存一份完整的 70B 权重(约 140GB fp16),N 个任务就是 N 份;训练时还要存优化器状态(通常是参数量的两倍),显存需求极其庞大。具体来说,一个 70B 模型用 AdamW 优化器做全参微调,显存占用大约是:模型权重(140GB)+ 梯度(140GB)+ AdamW 的一阶/二阶动量(各 140GB)= 约 560GB——需要 7-8 张 80GB 的 H100。
PEFT 的核心思想是——冻结绝大部分参数,只训练极少量新增参数,从而把每个任务的额外存储压到几十 MB 到几百 MB,优化器状态也按比例缩小。
LoRA:低秩分解
Section titled “LoRA:低秩分解”LoRA(Low-Rank Adaptation)基于一个关键假设:预训练大模型在下游任务上的权重更新量是低秩的——即更新可以由少量维度近似表达。于是它不去学完整的更新矩阵,而是把它分解成两个小矩阵的乘积。
什么是”低秩”? 一个矩阵的”秩”(rank)代表它包含的独立信息维度数。如果权重更新矩阵 W 的秩远小于其行列数,意味着这些更新可以由很少的”方向”组合表达——类似一张高清图片可以用少数主成分近似。LoRA 就是利用这个”低秩”特性,用两个小矩阵的乘积来高效近似原始的大权重更新矩阵。
记原始权重为 (形状 ),LoRA 把权重更新近似为两个小矩阵的乘积 : 的形状是 , 的形状是 ,其中 (秩)远小于 和 。前向计算变为:。训练时冻结 ,只训练 和 。
参数量对比:原始权重有 个参数;LoRA 只需 个参数。当 取 8 而 、 都是 4096 时,参数量从约 1600 万降到约 6.5 万,缩减两百多倍。
- 初始化技巧:A 用随机高斯初始化,B 初始化为零,保证训练开始时 BA 为零、不改变原模型行为。这样模型在训练第一步的输出和原始模型完全一致,然后随着训练逐步”学习”更新。
- 缩放系数 alpha:最终把 乘以 ,用缩放来解耦秩 与学习率。实践中 通常设为 的 1-2 倍(如 ),当你改变 时不用重新调学习率。
- 推理零开销:训练完后可以把 合并回 (),合并后模型结构和原来一模一样,没有额外延迟。
- target_modules 选择:默认只给注意力机制的 Q(Query,查询矩阵)和 V(Value,值矩阵)投影层加 LoRA,但实践中把所有线性层——Q、K(Key,键矩阵)、V、O(Output,输出投影)、以及前馈网络的 gate/up/down——都加上往往效果更好,代价仅略增参数。
LoRA 的数学直觉:大模型权重更新本质上是”低秩”的(变化可以由少量维度近似),所以一个小补丁就够了。训练完的 LoRA 权重只有几 MB 到几十 MB,可以像”插件”一样随时加载/切换——同一个基座模型配不同 LoRA 就能变身不同领域专家。
QLoRA:4-bit 量化加 LoRA
Section titled “QLoRA:4-bit 量化加 LoRA”QLoRA 让”单卡微调 65B 模型”成为现实。它把基座权重量化到 4-bit 存储,同时用 bf16 训练 LoRA 补丁,关键技术有三:
- NF4(NormalFloat 4-bit)量化:基于权重的正态分布特性设计信息最优的 4-bit 数据类型。大模型权重经过训练后近似服从均值零的正态分布,NF4 的 16 个量化电平( 个离散值)按正态分布的分位点均匀铺设,使得每个区间内的量化误差最小,整体量化误差接近理论下限。
- 双量化(Double Quantization):量化过程需要为每 64 个权重存一个缩放常数(FP32),这些常数本身也占显存。双量化把这些 FP32 常数再量化到 8-bit,进一步省下约 0.37 bit/参数的显存——在 65B 模型上约省 3GB。
- 分页优化器(Paged Optimizer):用 NVIDIA 的统一内存(Unified Memory)把优化器状态在 GPU 显存和 CPU 内存之间按页换入换出,类似操作系统的虚拟内存分页机制,避免显存峰值溢出导致 OOM(Out of Memory,显存不足报错)。
效果上 QLoRA 微调的模型可以完全匹敌 fp16 基座上的全参微调,但显存占用降到原来的约四分之一。例如原始论文在单张 48GB A6000 上微调了 65B 模型。
DoRA:权重分解低秩适配(2024 年新方法)
Section titled “DoRA:权重分解低秩适配(2024 年新方法)”DoRA(Weight-Decomposed Low-Rank Adaptation) 是 NVIDIA 在 2024 年提出对 LoRA 的改进。核心观察:LoRA 直接学习完整的权重更新 ΔW,但一个权重矩阵 W 可以分解为**大小(magnitude)和方向(direction)**两个分量:,其中 是每列的缩放向量(大小), 是归一化后的方向矩阵。
DoRA 的思路是:
- 方向部分用 LoRA 学习:低秩矩阵 BA 只负责调整权重的方向,这与”低秩”假设最匹配。
- 大小部分单独学习:为每个输出维度引入一个可训练的标量缩放 m,直接学习大小变化。
实验表明,DoRA 在相同参数预算下比标准 LoRA 效果更好——尤其在 r 较小(如 r=8)时优势明显,且推理时同样可以合并回基座权重,零额外开销。HuggingFace PEFT 库已原生支持 DoRA。
直觉:标准 LoRA 把大小和方向混在一起学,而 DoRA 认为方向变化是低秩的(适合用 BA 近似),大小变化是一维的(用向量就行),分开学更高效。
PiSSA:用 SVD 初始化的 LoRA(2024 年新方法)
Section titled “PiSSA:用 SVD 初始化的 LoRA(2024 年新方法)”PiSSA(Principal Singular Values and Singular Component Adaptation) 的思路与 LoRA 不同:LoRA 用随机初始化的 BA 从零开始学习更新,而 PiSSA 对原始权重矩阵 W0 做 SVD(奇异值分解,Singular Value Decomposition,将矩阵分解为旋转 × 缩放 × 旋转的形式),取最大的几个奇异值和奇异向量来初始化 BA——即让 BA 一开始就近似 W0 的主要成分,然后”替换”掉 W0 中的对应部分。
这样做的好处是 BA 从训练第一步就携带了有意义的语义信息,收敛更快、最终效果更好。代价是初始化需要做一次 SVD(对大矩阵较慢),但只做一次,训练开始后就不再需要。
GaLore:梯度低秩投影(2024 年新方法)
Section titled “GaLore:梯度低秩投影(2024 年新方法)”GaLore(Gradient Low-Rank Projection) 不修改模型结构,而是在优化器层面做文章。核心思想:大模型训练中的梯度矩阵也是低秩的,所以可以先把梯度投影到低秩空间,只在低秩空间中存优化器状态。这把全参微调的优化器显存从”参数量 “降到”参数量 “,使单张 80GB GPU 全参微调 7B 模型、8 张 GPU 微调 70B 模型成为可能。
GaLore 可以与 LoRA 正交使用(LoRA 修改前向计算,GaLore 修改反向梯度处理),也可以单独用于全参微调的显存优化。
Adapter Tuning:瓶颈层插入
Section titled “Adapter Tuning:瓶颈层插入”Adapter 在每个 Transformer 层(注意力之后、前馈网络之后)插入一个小型瓶颈网络:先把隐藏维度从 d 压缩到 r,过一个非线性激活(通常 ReLU 或 GELU),再还原回 d,并加残差连接。训练时只更新 Adapter 参数。缺点是:Adapter 是模型结构的一部分,推理时多了一层计算,带来额外延迟,无法像 LoRA 那样合并消除。它是 PEFT 的早期形式(2019),现在大多被 LoRA 取代。
残差连接(Residual Connection):把模块的输入直接加到输出上(),让梯度可以”跳过”中间层直接传播,是深度网络训练稳定性的关键技巧。Adapter 的瓶颈层用残差连接保证初始时不改变模型行为。
Prefix Tuning:每层加虚拟前缀
Section titled “Prefix Tuning:每层加虚拟前缀”Prefix Tuning 不改动任何模型权重,而是为每一层注意力准备若干可训练的”虚拟前缀 token”——可以理解为可学习的 Key/Value 前缀。这些前缀在注意力计算时拼到真实的 KV 前面,相当于给模型”植入”了一段可优化的上下文。为稳定训练,通常对前缀向量用一个前馈网络做重参数化(Reparameterization)——训练时学一个大 MLP 输出,推理时只保留输出结果,这样训练更稳定。
它的参数量很小,但前缀会占用上下文窗口,且不同层的灵活性高于纯输入层方法。
P-Tuning v2:类 Prefix 的深层 prompt
Section titled “P-Tuning v2:类 Prefix 的深层 prompt”P-Tuning v2 的思路与 Prefix Tuning 几乎一致——在每一层都加入可训练的 prompt 向量(深层 prompt tuning),从而让小模型、复杂任务也能拿到与全参微调接近的效果。它是对早期 P-Tuning v1(只在输入层加 prompt)的改进,验证了”深层 prompt”对缩小 PEFT 与全参差距的关键作用。
Prompt Tuning:最轻量
Section titled “Prompt Tuning:最轻量”Prompt Tuning 只在输入嵌入层附加若干可训练的向量(不进入每一层),其余全部冻结。它是所有 PEFT 方法里参数最少、改动最小的,推理开销几乎为零(只是多几个输入 token)。代价是表达能力有限:在十亿级以上的大模型上效果不错,但在小模型上通常不如 LoRA / Prefix Tuning。
| 方法 | 训练参数量 | 效果(大模型) | 推理额外开销 | 主要特点 |
|---|---|---|---|---|
| LoRA | 0.1%-1% | 接近全参 | 可合并,零开销 | 主流首选,灵活可插拔 |
| QLoRA | 同 LoRA,基座 4-bit | 接近 LoRA | 同 LoRA | 单卡微调大模型的利器 |
| DoRA | 同 LoRA | 优于 LoRA | 可合并,零开销 | 分解大小/方向,r 小时优势大 |
| PiSSA | 同 LoRA | 优于 LoRA | 可合并,零开销 | SVD 初始化,收敛更快 |
| GaLore | 全参,优化器低秩 | 接近全参 | 零开销 | 优化器层省显存,可全参微调 |
| Adapter | 约 1%-5% | 接近全参 | 有额外延迟 | 早期方法,结构无法消除 |
| Prefix Tuning | 约 0.1% | 较好 | 占用上下文 | 改 KV,深层可训练 |
| P-Tuning v2 | 约 0.1% | 较好(含小模型) | 占用上下文 | 深层 prompt,适配小模型 |
| Prompt Tuning | 极少(仅输入层) | 大模型上较好 | 几乎零 | 最轻量,大模型才好用 |
2025 年实践建议:新项目首选 LoRA 或 DoRA(HuggingFace PEFT 已原生支持 DoRA),需要省显存时用 QLoRA。GaLore 适合需要全参微调效果但显存不足的场景。Adapter / Prefix / Prompt Tuning 更多出现在学术研究中,生产环境已较少使用。
与 LLM 微调技术的关系:那一页是微调的”总览与入门”,本页是对 PEFT 各方法的”全景深度对比”。
各 PEFT 方法在模型中的位置
Section titled “各 PEFT 方法在模型中的位置”LoRA 低秩分解示意
Section titled “LoRA 低秩分解示意”DoRA 大小-方向分解示意
Section titled “DoRA 大小-方向分解示意”标准 LoRA 和 QLoRA 微调
Section titled “标准 LoRA 和 QLoRA 微调”from transformers import AutoModelForCausalLMfrom peft import LoraConfig, get_peft_model, prepare_model_for_kbit_trainingfrom transformers import BitsAndBytesConfigimport torch
# 方式一:标准 LoRA(fp16 基座)model = AutoModelForCausalLM.from_pretrained( "meta-llama/Llama-3.2-1B", torch_dtype=torch.float16)cfg = LoraConfig(r=8, lora_alpha=16, lora_dropout=0.05, target_modules=["q_proj", "v_proj"], task_type="CAUSAL_LM")model = get_peft_model(model, cfg)model.print_trainable_parameters() # 可训练参数约 0.5%
# 方式二:QLoRA(4-bit 量化基座,省显存)bnb = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True) # NF4 + 双量化model_q = AutoModelForCausalLM.from_pretrained( "meta-llama/Llama-3.2-1B", quantization_config=bnb)model_q = prepare_model_for_kbit_training(model_q) # 量化模型训练前准备model_q = get_peft_model(model_q, cfg) # 再套 LoRA使用 DoRA(HuggingFace PEFT)
Section titled “使用 DoRA(HuggingFace PEFT)”from peft import LoraConfig, get_peft_model
# 把 use_dora 设为 True 即可在标准 LoRA 配置上启用 DoRAdora_cfg = LoraConfig( r=8, lora_alpha=16, lora_dropout=0.05, target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], # 所有线性层 task_type="CAUSAL_LM", use_dora=True, # ← 启用 DoRA use_rslora=True, # 可选:启用 rsLoRA(按 √r 缩放,对大 r 更稳定))model = get_peft_model(model, dora_cfg)model.print_trainable_parameters()多 LoRA 热切换示例
Section titled “多 LoRA 热切换示例”同一个基座模型可以同时加载多个 LoRA 适配器,按请求动态切换——这是服务多个领域的高性价比方案:
from peft import PeftModel
# 基座模型 + 多个 LoRA 适配器base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B", torch_dtype=torch.float16)# 加载领域专家 LoRAmodel = PeftModel.from_pretrained(base_model, "./lora-medical", adapter_name="medical")model.load_adapter("./lora-legal", adapter_name="legal")model.load_adapter("./lora-customer-service", adapter_name="cs")
# 按请求切换model.set_adapter("medical") # 切到医疗专家# ... 生成回答 ...model.set_adapter("legal") # 切到法律专家# ... 生成回答 ...- 首选 LoRA / DoRA:推理可合并、零额外延迟,灵活性最高,是绝大多数场景的最佳起点。DoRA 在相同参数预算下通常优于 LoRA,已建议作为默认选择。只有特殊需求时才考虑 Adapter / Prefix。
- 秩 r 的选择:常识类微调 r=8 即可;领域知识较深或风格变化大时提到 r=16/32/64;过大易过拟合且收益递减。使用 rsLoRA(按 而非 缩放)时,大 值更加稳定。
- target_modules 越全越好:默认只给 Q/V 加 LoRA,实际效果上把所有线性层(Q/K/V/O 与前馈的 gate/up/down)都加上往往更好,代价仅略增参数。
- QLoRA 注意数据类型:训练用 bf16/fp16,基座用 NF4;务必调用
prepare_model_for_kbit_training稳定 LayerNorm 的梯度——该函数会启用输入梯度检查点(gradient checkpointing,一种用时间换显存的技术:前向传播时不保存中间激活,反向传播时重新计算)并确保嵌入层和 LayerNorm 用正确精度计算。 - 小模型慎用 Prompt Tuning:它在 10B 以上大模型才发挥优势,小模型(1B 以下)用 LoRA / P-Tuning v2 更稳妥。
- 多 LoRA 热插拔:同一基座加载多个 LoRA 可做”多任务专家切换”,是服务多个领域的高性价比方案。配合 S-LoRA(一种支持数百个 LoRA 适配器并发服务的系统)可实现批量调度。
- 学习率调度:LoRA 的学习率通常比全参微调高 5-10 倍(如 1e-4 到 5e-4),因为可训练参数少、需要更大的步长。cosine decay 配合 warmup(前 3-5% 步骤线性升温)是标准选择。
- 数据量与效果:LoRA 对 1K-100K 条高质量数据效果最佳;少于 500 条容易过拟合,多于 100K 条可以考虑提高 r 或全参微调。
- 领域专家模型:在 Llama / Qwen 等开源基座上用 LoRA 微调出医疗、法律、金融垂直专家,权重仅几十 MB,便于分发与版本管理。
- 单卡微调大模型:用 QLoRA 在一张 24GB 消费级显卡上微调 7B-13B 模型,是个人开发者与初创团队的标准玩法。配合 Unsloth(一个用 Triton 手写算子加速 LoRA 训练的库)可再快 2-5 倍、省约 80% 显存。
- 个性化风格定制:用特定语料做 LoRA 微调,让模型模仿品牌话术、特定写作风格,广泛应用于客服与内容创作。Stable Diffusion 社区的”角色 LoRA”也是同样的技术思路。
- 多任务服务:一个基座搭配多个 LoRA,按请求动态切换,避免为每个任务部署独立大模型,大幅降低显存与运维成本。配合 S-LoRA 引擎可支持数百个 LoRA 并发服务。
- 对齐训练(DPO/RLHF):2024-2025 年的趋势是用 LoRA 做偏好对齐训练(如 DPO,Direct Preference Optimization),在消费级硬件上完成原本需要多卡集群的对齐训练。
典型类库与工具
Section titled “典型类库与工具”| 类库 | 语言 | 说明 |
|---|---|---|
| PEFT | Python | HuggingFace 出品,统一实现 LoRA / DoRA / QLoRA / Adapter / Prefix Tuning / Prompt Tuning / PiSSA |
| bitsandbytes | Python | 8-bit/4-bit 量化与分页优化器,QLoRA 的底层依赖 |
| TRL | Python | HuggingFace 训练库,提供 SFT / DPO / PPO 与 LoRA 训练器 |
| Unsloth | Python | 专门加速 LoRA/QLoRA 微调,快 2-5 倍、省约 80% 显存;2025 年支持更多模型架构 |
| Axolotl | Python | 声明式 YAML 配置微调,支持多种 PEFT 方法与模型 |
| LLaMA-Factory | Python | 中文社区流行的微调工具,WebUI 操作,支持 LoRA/QLoRA/DoRA |
| S-LoRA | Python | 支持数百个 LoRA 适配器并发服务的推理系统 |
| 术语 | 英文 | 解释 |
|---|---|---|
| 参数高效微调 | PEFT, Parameter-Efficient Fine-Tuning | 只训练少量参数的微调方法统称 |
| 低秩适配 | LoRA, Low-Rank Adaptation | 用两个小矩阵 BA 近似权重更新的方法 |
| 权重分解低秩适配 | DoRA, Weight-Decomposed Low-Rank Adaptation | 将权重分解为大小和方向分别适配的 LoRA 改进 |
| 秩 | Rank | LoRA 中间维度 r,决定补丁表达能力 |
| 量化低秩适配 | QLoRA, Quantized LoRA | 基座 4-bit 量化加 LoRA,单卡微调大模型 |
| NF4 | 4-bit NormalFloat | 基于正态分布的信息最优 4-bit 量化类型 |
| 梯度低秩投影 | GaLore, Gradient Low-Rank Projection | 在优化器层面对梯度做低秩投影以省显存的方法 |
| 适配器 | Adapter | 层间插入的瓶颈网络,PEFT 早期形式 |
| 前缀微调 | Prefix Tuning | 每层注意力注入可训练虚拟前缀 token |
| 深层提示微调 | P-Tuning v2 | 在每层加入可训练 prompt 向量的方法 |
| 提示微调 | Prompt Tuning | 仅在输入嵌入层加可训练向量的最轻量 PEFT |
| 梯度检查点 | Gradient Checkpointing | 前向不存中间激活、反向重算,以时间换显存的技术 |
- Hu et al.,「LoRA: Low-Rank Adaptation of Large Language Models」(2021):LoRA 原始论文,证明权重更新是低秩的,奠定 PEFT 主流方法。
- Dettmers et al.,「QLoRA: Efficient Finetuning of Quantized LLMs」(2023):NF4 + 双量化 + 分页优化器,首次让单卡微调 65B 成为可能。
- Liu et al.,「DoRA: Decomposed Low-Rank Adaptation」(ICML 2024):权重大小-方向分解,在相同参数预算下优于 LoRA。
- Meng et al.,「PiSSA: Principal Singular Values and Singular Component Adaptation」(2024):SVD 初始化的 LoRA 变体,收敛更快。
- Zhao et al.,「GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection」(2024):优化器级显存优化,使全参微调大模型的显存大幅下降。
- Dettmers et al.,「Parameter-Efficient Transfer Learning for NLP」(ICML 2019):Adapter Tuning 原始论文,PEFT 的早期代表作。
- Li & Liang,「Prefix-Tuning: Optimizing Continuous Prompts for Generation」(2021):提出在每层注入可训练前缀。
- Liu et al.,「P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning」(2022):验证深层 prompt 可媲美全参微调。
- Chen et al.,「S-LoRA: Serving Thousands of Concurrent LoRA Adapters」(2023):多 LoRA 并发服务的系统设计。
- 入门微调脉络见LLM 微调技术,量化原理见推理优化技术。