资料截至 2026-10
一、为什么要高效微调
全量微调(full fine-tuning)要把整份权重都参与训练:权重本身 + 梯度 + 优化器状态 + 激活值,四样都占显存。LLaMA-Factory 官方 README 给的参照很直观,同样是微调一个 7B 模型:
| 方式 | 显存需求 |
|---|---|
| 全量 bf16 | 约 120 GB |
| LoRA | 约 16 GB |
| 4bit QLoRA | 约 6 GB |

成本之外还有三个好处:
- 一份底座、多个任务:每个任务只训一个几十 MB 的”补丁”,同一个底座上挂多个补丁,切换成本极低
- 抗遗忘:底座权重冻结,通用能力不容易被某个任务带偏
- 分发友好:给别人发一个 LoRA 文件,而不是整份权重
二、谱系:四条路线
| 路线 | 思路 | 代表 |
|---|---|---|
| 插入式 Adapter | 在每层里塞一个小模块,只训它 | Parameter-Efficient Transfer Learning for NLP(1902.00751) |
| 连续 Prompt | 把”提示词”本身当参数来训练 | Prefix-Tuning(2101.00190)、Prompt Tuning(2104.08691) |
| 低秩适配(主角) | 把权重更新量 ΔW 分解成两个低秩矩阵的乘积 BA,只训 A、B | LoRA(2106.09685)→ QLoRA(2305.14314)→ DoRA(2402.09353) |
| 可学习向量 | 每个模块只训几个标量 | IA3(2205.05638) |
现在的主流就是 LoRA 家族,其余路线了解即可。
三、LoRA
核心思想:微调后的权重 W 可以写成 W + ΔW。LoRA 的做法是不直接学 ΔW,而是学它的低秩分解——两个小矩阵 A、B 相乘,秩就是 r。训练时只更新 A 和 B,推理时可以合并回 W,也可以外挂不合并。
用 Hugging Face PEFT 库(21.8k stars)开一个 LoRA 就这么几行:
from peft import LoraConfig, get_peft_model
peft_config = LoraConfig(
r=16, # 秩:可训参数的规模旋钮
lora_alpha=32, # 缩放系数,常设成 2*r
task_type=TaskType.CAUSAL_LM,
target_modules=["q_proj", "v_proj"] # 改哪些矩阵,q/v 是最常见的默认
)
model = get_peft_model(model, peft_config)
三个关键参数:
- r:秩。决定可训练参数量。太小表达力不够,太大又失去”高效”的意义
- lora_alpha:缩放系数,惯例是 alpha = 2r,再通过 lora_alpha/r 得到实际缩放
- target_modules:改哪些权重矩阵。默认 q_proj、v_proj 就很能打,有些任务加上 k_proj、o_proj 会更好
两个延伸:
- QLoRA(2305.14314):把底座量化到 4bit(NF4 + 双重量化 + 分页优化器),在上面挂 LoRA——就是用 6GB 训 7B 的那个方案
- DoRA(2402.09353):把权重拆成”幅度 + 方向”两部分,LoRA 只学方向。对部分任务能缩小和全量微调的差距,代价是参数量略多
四、工程上的几个实操问题
1. r 选多大? 这是 LoRA 悬而未决的老问题。2026-10 那篇《A Fine-Grained Analysis of the LoRA Fine-Tuning Landscape》(2610.06542)给的结论是:r 太小会让优化景观病态(不好训),太大又牺牲了效率,现有理论指导很有限。实操上从 r=8~16 起步、看损失曲线和验证集再调,仍然是最靠谱的默认。
2. 改哪些层? 《Where to Adapt Matters》(2610.11620)发现不同层的收益和代价不一样——改某些层任务涨分多、通用能力掉得少,改另一些层则相反。也就是说”改哪一层”本身是个值得调的变量,不是所有层都适合一视同仁地塞 LoRA。
3. 用什么训? 三个主流选项:
- Hugging Face PEFT:库级方案,代码控首选,和 Transformers/TRL 无缝
- LLaMA-Factory(75.4k stars,ACL 2024):一条命令
llamafactory-cli train examples/train_lora/qwen3_lora_sft.yaml搞定 100+ 种模型,支持 LoRA/QLoRA(2~8bit)/DoRA/OFT/GaLore 等一长串方法,还有 Web UI(LLaMA Board) - Unsloth(77.7k stars):主打快和省,宣称 2 倍速度、省 70% 显存、无损精度,支持 LoRA/QLoRA/FP8 和一批 2026 年的新模型
4. 训完怎么上线? :vLLM 支持多 LoRA 服务——一个底座上按请求挂不同的 LoRA,官方说法是开销极小。启用是 --enable-lora,配套参数有 --max-loras、--max-lora-rank(设成你最高 rank 的值,免得浪费显存)、--max-cpu-loras;运行时动态加载要开环境变量 VLLM_ALLOW_RUNTIME_LORA_UPDATING=True。限制也记一下:多模态默认每 prompt 只能挂一个 LoRA、序列分类头只支持 score/classifier、token 分类适配器不支持。LLaMA-Factory 也提供 OpenAI 风格 API(用 vLLM 或 SGLang 做 worker),训完直接导出来起服务。
五、方法之间的差距
2026-10 有篇值得注意的反思:《Are Parameter-Efficient Fine-tuning Methods Really Different?》(2610.09122)。作者把六种方法放在语言模型和扩散模型上对比,发现所选 LoRA 家族的方法都近似保持了预训练权重的几何,恢复那点轻微漂移后,方法之间的差别比名字听起来小得多。
另一条有意思的新工作是 RoSA(2610.06243):把”改哪一层”做成分段轮转——靠近输入的层一直冻结,可训练块在后面的层上轮转推进,省优化器内存、缩短反向传播。
这两篇放在一起,正好概括了这个领域的现状:方法名的多样性远大于实质差异,省钱的增量更多来自工程(量化、层选择、优化器内存),而不是换一种参数化。
六、选型
- 默认从 QLoRA 起步:LLaMA-Factory + 4bit + r=8
16,单卡 616GB 就能玩 7B - 在意通用能力保持 → 把”改哪些层”当成超参调一下(2610.11620 的结论)
- 上线接 vLLM 多 LoRA,一个底座服务一批任务
- 先把 r、层选择、量化档位这三个旋钮调明白
参考
- 1902.00751 — Parameter-Efficient Transfer Learning for NLP — ICML 2019(CCF-A)
- 2101.00190 — Prefix-Tuning: Optimizing Continuous Prompts for Generation — ACL 2021(CCF-A)
- 2104.08691 — The Power of Scale for Parameter-Efficient Prompt Tuning — EMNLP 2021(CCF-A)
- 2106.09685 — LoRA: Low-Rank Adaptation of Large Language Models — ICLR 2022(CCF-A)
- 2205.05638 — Few-Shot Parameter-Efficient Fine-Tuning is Better and Cheaper than In-Context Learning(IA3) — NeurIPS 2022(CCF-A)
- 2305.14314 — QLoRA: Efficient Finetuning of Quantized LLMs — NeurIPS 2023(CCF-A)
- 2402.09353 — DoRA: Weight-Decomposed Low-Rank Adaptation — ICML 2024(CCF-A)
- 2610.06243 — RoSA: Rotational Sparse Adaptation for Memory-Efficient Fine-Tuning — 预印本
- 2610.06542 — A Fine-Grained Analysis of the LoRA Fine-Tuning Landscape — 预印本
- 2610.09122 — Are Parameter-Efficient Fine-tuning Methods Really Different? — 预印本
- 2610.11620 — Where to Adapt Matters: Layer-Selective Fine-Tuning for Capability Retention — 预印本