ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

27届大模型面试准备(十八):LoRA 与 PEFT 全攻略——低秩适配、QLoRA、省显存微调全家桶

27届大模型面试准备(十八):LoRA 与 PEFT 全攻略——低秩适配、QLoRA、省显存微调全家桶

27届大模型面试准备(十八):LoRA 与 PEFT 全攻略——低秩适配、QLoRA、省显存微调全家桶

上一篇《分布式训练全攻略》讲了"怎么把大模型训起来",但那是实验室/大厂的事——普通人没有几百张卡。这一篇讲"普通人怎么低成本微调大模型":PEFT(参数高效微调)家族,重点是 LoRA 及其升级 QLoRA,外加 Adapter、Prefix/Prompt Tuning 等兄弟方法。每节给:原理 → 数学 → 代码 → 面试速答 + 高频追问。配合 A16(后训练)看,刚好串成"全量 SFT → 高效 LoRA 微调"的完整选择。


一、为什么需要 PEFT:全量微调太贵了

全量微调(Full Fine-Tuning)要把模型所有参数都更新一遍:

7B 全量微调: 训练显存 ≈ 56 GB(见 A17 估算) → 至少 1 张 80G A100 70B 全量微调: ≈ 560 GB → 多机多卡才够 且每来一个下游任务就要存一份完整模型副本(70B ≈ 140GB/份)

PEFT 的核心思想:冻结主干,只训练极少量新增/旁支参数,显存和存储都骤降,效果却接近全量。

全量微调: 更新 ΔW (全部参数) 显存大、存多份 PEFT: 只更新少量参数 θ_peft 显存小、一份底座+多份小适配器

二、LoRA:低秩适配(Low-Rank Adaptation)

2.1 核心假设

预训练模型在适配下游任务时,权重的变化量 ΔW 具有"低内在秩"——可以用两个小矩阵的乘积近似:

原始: W ∈ R^(d×k) (冻结,不更新) LoRA: W' = W + ΔW = W + B·A 其中 A ∈ R^(r×k), B ∈ R^(d×r), 秩 r ≪ min(d,k) 只训练 A、B,可训练参数从 d×k 降到 r×(d+k)

例:d=k=4096,r=8 → 原参数 1677 万,LoRA 参数仅 65536,是原来的0.4%

2.2 前向怎么算

h = W·x + ΔW·x = W·x + B·(A·x) # W 冻结,BA 可训练

训练时只更新 A、B;推理时可把 B·A 合并回 W(无额外延迟),也可保持分离(便于切换多个适配器)。

2.3 HuggingFace PEFT 最小代码

frompeftimportLoraConfig,get_peft_modelfromtransformersimportAutoModelForCausalLMmodel=AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B")cfg=LoraConfig(r=8,# 秩lora_alpha=16,# 缩放系数,等效学习率放大target_modules=["q_proj","v_proj"],# 只在 Q、V 投影上加 LoRAlora_dropout=0.05,bias="none",task_type="CAUSAL_LM",)model=get_peft_model(model,cfg)model.print_trainable_parameters()# 仅约 0.4% 参数可训练

面试速答:LoRA 为什么省显存?因为冻结了底座 W,不用存它的优化器状态和梯度;只给低秩矩阵 A、B 建优化器状态,显存从"参数×8"骤降到"低秩参数×8",且可训练参数极少。

高频追问
1. r 越大越好吗?不是,r 太大趋近于全量、失去 PEFT 意义;太小可能欠拟合。常用 8/16/32/64。
2. 为什么常加在 Q、V 而不是全部?经验上 Q/V 投影对任务适配贡献大、效果好;全加会增加参数和计算。
3. lora_alpha 干什么?对 ΔW 做缩放(ΔW · alpha/r),相当于调节适配器影响强度。


三、QLoRA:把 LoRA 塞进一张消费级显卡

QLoRA(Quantized LoRA)在 LoRA 基础上做两件事,让 65B 模型也能在单张 48GB 卡上微调:

  1. 4-bit NF4 量化底座:用 NormalFloat4 把冻结的主干压到 4-bit,显存再砍一大截。
  2. 双量化 + 分页优化器:对量化常数再量化、用分页避免显存峰值 OOM。
QLoRA = 4-bit 量化基座(冻结) + 普通 LoRA(可训练) 效果: 65B 模型单卡 48GB 可微调,效果接近 16-bit 全量 LoRA
fromtransformersimportBitsAndBytesConfigbnb=BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype="bfloat16")model=AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-70b",quantization_config=bnb,device_map="auto")# 再在其上挂 LoraConfig 即可

面试速答:QLoRA 相比 LoRA 多了什么?多了 4-bit 量化基座(NF4)+ 双量化 + 分页优化器,把"可训练参数"之外的"底座驻留显存"也压下去,使得大模型能在消费级显卡微调。


四、PEFT 家族其他成员

方法做法可训练参数位置特点
Adapter在层间插入小瓶颈层旁支 MLP早期经典,略有推理延迟
Prefix Tuning在输入前加可训练前缀向量软提示前缀不改模型结构
Prompt Tuning只调输入的虚拟 token 嵌入软提示极简,但难训大模型
(IA)³学三个缩放向量乘激活乘性向量参数极少
LoRA / QLoRA低秩分解 ΔWA、B 矩阵当前最主流

LoRA 胜出原因:不引入推理延迟(可合并)、效果稳、实现简单、生态成熟。


五、工程实践:多人多任务怎么管

LoRA 的最大工程优势是底座共享、适配器热插拔

base (70B, 一份) ├── lora_taskA.bin (几十 MB) ├── lora_taskB.bin └── lora_taskC.bin 推理时按需加载某一适配器,无需复制整模型

PEFT 还支持适配器合并 / 加权融合(merge_and_unload、add_weighted_adapter),把多个 LoRA 按比例融合成一个。

面试速答:多个 LoRA 怎么共存?底座冻结共享,每个任务训一个轻量 LoRA 文件(MB 级);部署时按请求动态加载对应适配器,或加权融合多个。


六、面试速答 + 高频追问清单(汇总)

速答 TOP 8:
1. PEFT = 冻结主干 + 训少量参数,省显存省存储。
2. LoRA: ΔW = B·A,只训低秩 A/B,可训练参数降至 <1%。
3. r 控制秩;alpha 缩放适配器影响;常加在 Q/V。
4. QLoRA = 4-bit NF4 基座 + 双量化 + 分页优化器。
5. LoRA 推理可合并,无延迟;QLoRA 主要省的是底座驻留显存。
6. Adapter/Prefix/Prompt 是兄弟方法,LoRA 因无延迟+稳定成主流。
7. 多任务用底座共享 + 适配器热插拔。
8. rank 不是越大越好,需权衡。

追问清单:
- LoRA 和全量微调的效果差距通常在哪些任务上明显?
- 为什么 LoRA 常加在 attention 的 Q/V 而非 FFN?
- QLoRA 的 NF4 相比 INT4 好在哪?
- 多个 LoRA 加权融合时,alpha 要不要一起融合?
- 推理时合并 LoRA 和不合并,精度有差别吗?


七、选型决策树:到底用哪种微调

面试常被问"给我一个场景,你选全量还是 LoRA 还是 QLoRA",给一张可复述的决策树:

任务钱/卡够吗? / \ 够(多卡A100) 不够(单卡/消费级) | | 全量 SFT 效果上限最高 底座多大? / \ ≤13B >13B(如70B) | | LoRA(16bit) QLoRA(4bit基座) (要极致效果且数据多) (要跑得动且效果接近)

再补一句工程经验:绝大多数业务微调(客服、分类、特定风格)用 LoRA(r=16/32) 就够了;只有当你发现 LoRA 怎么调都不如全量时,才上全量或加大 r。QLoRA 是"先跑起来"的默认选项,之后再视效果升级。

速答补充:怎么判断 LoRA 训到位了?看验证集 loss 平稳下降且下游指标达标;若欠拟合(train loss 仍高)就加大 r 或放宽 target_modules;若过拟合(val 掉)就加 lora_dropout 或减 r。

7.1 常见翻车现场与排错

现象可能原因排查/修复
loss 不降学习率太小 / lora_alpha 太小调大 alpha 或 lr,确认只冻结底座
输出乱码4-bit 基座量化误差累积换 8-bit 或 NF4+双量化;减小 batch
灾难性遗忘rank 过大逼近全量但数据少减小 r,或混入通用数据 replay
显存仍爆优化器状态+梯度没省掉确认开启 gradient_checkpointing + 用 PEFT 而非手动
多适配器冲突融合时 alpha 未归一并缩放用 add_weighted_adapter 且传 weights 归一

一句经验:先用 QLoRA(r=16) 跑通一条端到端 pipeline,再谈调参;很多人卡在"显存"而非"效果", pipeline 跑通后 80% 的问题就消失了。


八、下一篇预告

PEFT 讲完"低成本微调",A 系列可以进入A19 量化(W8A8/GPTQ/AWQ 推理侧压缩)A20 评测(基准、刷榜、能力诊断)。如果你更想看智能体侧,B17/B18 已经就位。评论区告诉我优先级。

返回列表