问题与目标
全参数微调要保存并更新所有权重。LoRA 冻结基座模型,用两个小矩阵表示权重增量,使多个任务可以共享同一基座。本篇通过矩阵形状和 PEFT 配置理解它节省了什么,又没有节省什么。
核心概念

对形状为 d_out × d_in 的权重,LoRA 学习:
W' = W + scale × B @ A
A: r × d_in
B: d_out × r
原始增量需要 d_out × d_in 个参数;LoRA 只需 r × (d_in + d_out)。r、目标模块和数据共同决定容量。LoRA 减少可训练参数与优化器状态,但前向激活、基座权重和长序列成本仍然存在。
可运行实现
先用纯 Python 计算一个投影层的参数比例:
def lora_parameter_report(d_in: int, d_out: int, rank: int) -> dict:
full = d_in * d_out
adapter = rank * (d_in + d_out)
return {
"full_delta": full,
"lora_delta": adapter,
"trainable_ratio": round(adapter / full, 6),
}
print(lora_parameter_report(4096, 4096, 16))
对应 PEFT 配置如下:
from peft import LoraConfig
peft_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
target_modules="all-linear",
bias="none",
task_type="CAUSAL_LM",
)
target_modules="all-linear" 适合建立 QLoRA 风格基线,但不是所有任务的唯一答案。若只选择 q_proj、v_proj,应先打印模型模块名称,验证匹配数量;匹配为零时训练可能直接失败,匹配错层则浪费资源。
训练产物至少保存:基座模型 ID 与 revision、Adapter 配置、Adapter 权重、Tokenizer/Processor、数据版本和评估报告。独立 Adapter 便于切换任务;合并权重便于某些部署环境,但会生成新的完整模型副本。
常见问题与排查
可训练参数比例很低,所以显存也按同样比例降低
激活和基座权重仍占显存。长上下文场景可能主要受激活影响,需结合梯度检查点、序列长度和量化。
Rank 越大效果越好
更大 Rank 增加容量和过拟合风险。固定数据与训练预算做消融,而不是只比较训练 Loss。
合并 Adapter 后结果变化
检查基座 revision、dtype、量化状态和缩放配置。合并前后使用同一输入与生成参数做数值验收。
多个 Adapter 混在同一目录
每个 Adapter 使用独立版本、任务名和基座指纹。加载时验证配置,避免把适配器装到不兼容基座。
小结
LoRA 用低秩增量降低训练与交付成本,但不消除激活、数据和评估成本。目标模块、Rank、基座版本和 Adapter 生命周期都应成为实验记录的一部分。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


