Skip to content

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 的新一代变体,在参数效率、训练稳定性或显存节省上进一步突破,详见后文。

假设要为 N 个下游任务微调一个 70B 模型。全参微调需要:为每个任务存一份完整的 70B 权重(约 140GB fp16),N 个任务就是 N 份;训练时还要存优化器状态(通常是参数量的两倍),显存需求极其庞大。具体来说,一个 70B 模型用 AdamW 优化器做全参微调,显存占用大约是:模型权重(140GB)+ 梯度(140GB)+ AdamW 的一阶/二阶动量(各 140GB)= 约 560GB——需要 7-8 张 80GB 的 H100。

PEFT 的核心思想是——冻结绝大部分参数,只训练极少量新增参数,从而把每个任务的额外存储压到几十 MB 到几百 MB,优化器状态也按比例缩小。

LoRA(Low-Rank Adaptation)基于一个关键假设:预训练大模型在下游任务上的权重更新量是低秩的——即更新可以由少量维度近似表达。于是它不去学完整的更新矩阵,而是把它分解成两个小矩阵的乘积。

什么是”低秩”? 一个矩阵的”秩”(rank)代表它包含的独立信息维度数。如果权重更新矩阵 W 的秩远小于其行列数,意味着这些更新可以由很少的”方向”组合表达——类似一张高清图片可以用少数主成分近似。LoRA 就是利用这个”低秩”特性,用两个小矩阵的乘积来高效近似原始的大权重更新矩阵。

记原始权重为 W0W_0(形状 d×kd \times k),LoRA 把权重更新近似为两个小矩阵的乘积 BABA:BB 的形状是 d×rd \times r,AA 的形状是 r×kr \times k,其中 rr(秩)远小于 dd 和 kk。前向计算变为:h=W0x+B(Ax)h = W_0 x + B(Ax)。训练时冻结 W0W_0,只训练 BB 和 AA。

参数量对比:原始权重有 d×kd \times k 个参数;LoRA 只需 d×r+r×k=r×(d+k)d \times r + r \times k = r \times (d + k) 个参数。当 rr 取 8 而 dd、kk 都是 4096 时,参数量从约 1600 万降到约 6.5 万,缩减两百多倍。

  • 初始化技巧:A 用随机高斯初始化,B 初始化为零,保证训练开始时 BA 为零、不改变原模型行为。这样模型在训练第一步的输出和原始模型完全一致,然后随着训练逐步”学习”更新。
  • 缩放系数 alpha:最终把 BABA 乘以 α/r\alpha / r,用缩放来解耦秩 rr 与学习率。实践中 α\alpha 通常设为 rr 的 1-2 倍(如 r=8,α=16r=8, \alpha=16),当你改变 rr 时不用重新调学习率。
  • 推理零开销:训练完后可以把 BABA 合并回 W0W_0(W=W0+BAW = W_0 + BA),合并后模型结构和原来一模一样,没有额外延迟。
  • target_modules 选择:默认只给注意力机制的 Q(Query,查询矩阵)和 V(Value,值矩阵)投影层加 LoRA,但实践中把所有线性层——Q、K(Key,键矩阵)、V、O(Output,输出投影)、以及前馈网络的 gate/up/down——都加上往往效果更好,代价仅略增参数。

LoRA 的数学直觉:大模型权重更新本质上是”低秩”的(变化可以由少量维度近似),所以一个小补丁就够了。训练完的 LoRA 权重只有几 MB 到几十 MB,可以像”插件”一样随时加载/切换——同一个基座模型配不同 LoRA 就能变身不同领域专家。

QLoRA 让”单卡微调 65B 模型”成为现实。它把基座权重量化到 4-bit 存储,同时用 bf16 训练 LoRA 补丁,关键技术有三:

  • NF4(NormalFloat 4-bit)量化:基于权重的正态分布特性设计信息最优的 4-bit 数据类型。大模型权重经过训练后近似服从均值零的正态分布,NF4 的 16 个量化电平(24=162^4 = 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)**两个分量:W=m×(V/∥V∥)W = m \times (V / \|V\|),其中 mm 是每列的缩放向量(大小),V/∥V∥V/\|V\| 是归一化后的方向矩阵。

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) 不修改模型结构,而是在优化器层面做文章。核心思想:大模型训练中的梯度矩阵也是低秩的,所以可以先把梯度投影到低秩空间,只在低秩空间中存优化器状态。这把全参微调的优化器显存从”参数量 ×8\times 8“降到”参数量 ×r/d×8\times r/d \times 8“,使单张 80GB GPU 全参微调 7B 模型、8 张 GPU 微调 70B 模型成为可能。

GaLore 可以与 LoRA 正交使用(LoRA 修改前向计算,GaLore 修改反向梯度处理),也可以单独用于全参微调的显存优化。

Adapter 在每个 Transformer 层(注意力之后、前馈网络之后)插入一个小型瓶颈网络:先把隐藏维度从 d 压缩到 r,过一个非线性激活(通常 ReLU 或 GELU),再还原回 d,并加残差连接。训练时只更新 Adapter 参数。缺点是:Adapter 是模型结构的一部分,推理时多了一层计算,带来额外延迟,无法像 LoRA 那样合并消除。它是 PEFT 的早期形式(2019),现在大多被 LoRA 取代。

残差连接(Residual Connection):把模块的输入直接加到输出上(output=f(x)+x\text{output} = f(x) + x),让梯度可以”跳过”中间层直接传播,是深度网络训练稳定性的关键技巧。Adapter 的瓶颈层用残差连接保证初始时不改变模型行为。

Prefix Tuning 不改动任何模型权重,而是为每一层注意力准备若干可训练的”虚拟前缀 token”——可以理解为可学习的 Key/Value 前缀。这些前缀在注意力计算时拼到真实的 KV 前面,相当于给模型”植入”了一段可优化的上下文。为稳定训练,通常对前缀向量用一个前馈网络做重参数化(Reparameterization)——训练时学一个大 MLP 输出,推理时只保留输出结果,这样训练更稳定。

它的参数量很小,但前缀会占用上下文窗口,且不同层的灵活性高于纯输入层方法。

P-Tuning v2 的思路与 Prefix Tuning 几乎一致——在每一层都加入可训练的 prompt 向量(深层 prompt tuning),从而让小模型、复杂任务也能拿到与全参微调接近的效果。它是对早期 P-Tuning v1(只在输入层加 prompt)的改进,验证了”深层 prompt”对缩小 PEFT 与全参差距的关键作用。

Prompt Tuning 只在输入嵌入层附加若干可训练的向量(不进入每一层),其余全部冻结。它是所有 PEFT 方法里参数最少、改动最小的,推理开销几乎为零(只是多几个输入 token)。代价是表达能力有限:在十亿级以上的大模型上效果不错,但在小模型上通常不如 LoRA / Prefix Tuning。

方法训练参数量效果(大模型)推理额外开销主要特点
LoRA0.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 各方法的”全景深度对比”。

from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
from transformers import BitsAndBytesConfig
import 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
from peft import LoraConfig, get_peft_model
# 把 use_dora 设为 True 即可在标准 LoRA 配置上启用 DoRA
dora_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 适配器,按请求动态切换——这是服务多个领域的高性价比方案:

from peft import PeftModel
# 基座模型 + 多个 LoRA 适配器
base_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B",
torch_dtype=torch.float16)
# 加载领域专家 LoRA
model = 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(按 1/r1/\sqrt{r} 而非 1/r1/r 缩放)时,大 rr 值更加稳定。
  • 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),在消费级硬件上完成原本需要多卡集群的对齐训练。
类库语言说明
PEFTPythonHuggingFace 出品,统一实现 LoRA / DoRA / QLoRA / Adapter / Prefix Tuning / Prompt Tuning / PiSSA
bitsandbytesPython8-bit/4-bit 量化与分页优化器,QLoRA 的底层依赖
TRLPythonHuggingFace 训练库,提供 SFT / DPO / PPO 与 LoRA 训练器
UnslothPython专门加速 LoRA/QLoRA 微调,快 2-5 倍、省约 80% 显存;2025 年支持更多模型架构
AxolotlPython声明式 YAML 配置微调,支持多种 PEFT 方法与模型
LLaMA-FactoryPython中文社区流行的微调工具,WebUI 操作,支持 LoRA/QLoRA/DoRA
S-LoRAPython支持数百个 LoRA 适配器并发服务的推理系统
术语英文解释
参数高效微调PEFT, Parameter-Efficient Fine-Tuning只训练少量参数的微调方法统称
低秩适配LoRA, Low-Rank Adaptation用两个小矩阵 BA 近似权重更新的方法
权重分解低秩适配DoRA, Weight-Decomposed Low-Rank Adaptation将权重分解为大小和方向分别适配的 LoRA 改进
秩RankLoRA 中间维度 r,决定补丁表达能力
量化低秩适配QLoRA, Quantized LoRA基座 4-bit 量化加 LoRA,单卡微调大模型
NF44-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 微调技术,量化原理见推理优化技术。