| rank | 可训练参数 | 占基座 | 适配器体积 | 优化器显存 |
|---|
LoRA 为什么这么省
微调的本质是让权重矩阵 W 发生变化。LoRA 的思路是:不去直接改那个巨大的 W,而是假设「变化量 ΔW 是低秩的」——用两个小矩阵 A(r × d_in)和 B(d_out × r)相乘来近似 ΔW,其中 r 远小于 d_in、d_out。前向计算变成 h = Wx + BAx,W 全程冻结,只有 A 和 B 参与训练。
以 7B 模型、d_model = 4096、32 层、只对 q 和 v 两个模块加适配器为例:r = 8 时每个模块的参数是 8 × (4096 + 4096) = 65,536,每层两个模块是 131,072,乘 32 层约 420 万参数——只占 70 亿的 0.06%。这就是 LoRA 能在一张消费级显卡上微调大模型的根本原因。
rank 怎么选
| rank | 相对参数量 | 适合 | 风险 |
|---|---|---|---|
| 4 – 8 | 最小 | 风格迁移、格式对齐、单一任务 | 容量不足,复杂任务欠拟合 |
| 16 – 32 | 中等 | 领域知识注入、指令跟随 | 最常用的平衡区间 |
| 64 – 128 | 数倍于 8 | 需要较强拟合能力时 | 收益递减,容易过拟合小数据集 |
经验法则:先从小 rank 试起。r = 8 效果不够再翻倍到 16、32,观察验证集指标。把 rank 从 8 提到 128 参数量涨 16 倍,但效果提升往往远不到 16 倍——而且在小数据集上很容易过拟合。
应用在哪些模块上
- 只加 q、v:最省,参数量约为全部线性层的 1/3.5。原论文的默认做法,多数场景够用。
- 加 q、k、v、o:注意力部分全覆盖,参数量翻倍,效果通常略好。
- 含 MLP 的全部线性层:参数量约 3.5 倍,拟合能力最强,但显存与小数据集过拟合风险同步上升。
显存账单的另一半
这就是本工具特意把「优化器状态」单独列出来的原因。Adam 在混合精度下每个可训练参数要占 16 字节:fp32 主权重 4 字节、梯度 4 字节、一阶动量 4 字节、二阶动量 4 字节。再加上一份 bf16 前向副本(2 字节),实际每个可训练参数约 18 字节。
所以 r = 8 的 420 万参数,适配器本体只有 8 MB 左右(bf16),但优化器状态要 67 MB。如果换成 rank 128,适配器 134 MB、优化器超过 1 GB。而基座模型如果用 bf16 加载,7B 就是 14 GB;改用 QLoRA(基座 4 bit 量化)能压到约 3.5 GB——这才是能在 8 GB 显卡上跑起来的关键。
一个实操提醒
LoRA 的适配器是可以合并回原模型的(W′ = W + BA),合并后推理时零额外延迟,这是它相对其他 PEFT 方法的巨大优势。但合并后就没法再单独调节 LoRA 权重了,所以建议保留未合并的适配器文件,部署时再决定合并还是动态挂载。另外多个 LoRA 也可以加权叠加使用,这也是社区模型「风格混搭」的常见玩法。
你可能还想问
秩越大越好吗?
秩越大表达能力越强但参数与显存占用也越高,还更容易过拟合;应按任务复杂度与数据量选择,而不是一味求大。
参数量怎么估?
与目标层维度、秩及接入的层数相关;只加在部分层上能大幅减少参数,是常用的降本做法。
怎么判断秩够不够?
看训练损失与验证效果:欠拟合说明容量不足可适当提高,过拟合则降低秩或加正则;以验证集表现作准。
速查在线工具箱