# Summary
**LoRA = Low-Rank Adaptation**:只训练了一小部分参数
**LoRA = Low-Rank Adaptation**
它是一种**参数高效微调(PEFT)**方法,由 Microsoft 在 2021 年提出,专门用来把大模型的“迁移成本”降到传统全参微调的千分之一甚至万分之一。核心思想是:
$W' = W + BA, A \in R^{r \times d}, B \in R^{d \times r}, r \ll d$
> • 冻结预训练权重 $W$;
> • 只训练两个低秩矩阵 $A,B$(秩 $_r$ 很小,通常 4–16);
> • 推理时把 $BA$ 与原权重相加即可,不引入额外延迟。([arxiv.org](https://arxiv.org/abs/2106.09685?utm_source=chatgpt.com "LoRA: Low-Rank Adaptation of Large Language Models"))
相较于全参微调,LoRA **可将可训练参数减少 10 000 ×、显存占用减少 3 ×**,而在 GPT-3、RoBERTa 等模型上的效果与全参持平甚至更好。([arxiv.org](https://arxiv.org/abs/2106.09685?utm_source=chatgpt.com "LoRA: Low-Rank Adaptation of Large Language Models"))
- **在线 LoRA(runtime / hot-swap)**
在**推理时**将 LoRA 适配器作为增量权重挂载到基座模型上,可**动态加载/卸载/切换多路 LoRA**。
- 典型场景:vLLM 的 `LoRARequest(...)`;HF + PEFT 的 `set_adapter/disable_adapter`。
- 优点:一套基座,多任务快速切换;无需复制/重打包模型;多租户/AB 测试方便。
- 成本:**显存额外占用**(适配层、缓存、索引等)、初始化额外开销;在 16GB 卡上更容易 OOM;某些执行器(如 Punica/SGMV)会带来额外内存与工程复杂度。
- **离线 LoRA(merged / baked-in)**
先在**离线**把 LoRA 权重**合并**进基座,导出一份**新的完整模型**,推理时就像普通基座一样加载。
- 典型场景:PEFT 的 `merge_and_unload()` 后 `save_pretrained()`;或训练/导出时直接“写死”到权重里。
- 优点:推理时**更省显存、更稳**(没有在线 LoRA 的额外张量与管理器);部署简单。
- 成本:每个任务/LoRA 都要导出一份模型(存储多、升级慢);失去“热切换”的灵活性。
---
# 结合你目前的设备/Kaggle场景怎么选
- **单卡 16GB(如 T4/P100)+ 7B 模型**:优先**离线 LoRA 合并**,最稳最省显存。
- **需要一台机上切多套 LoRA 做对比/AB**:考虑**在线 LoRA**,但要收紧 `max_model_len / kv_cache_dtype / batch / gpu_memory_utilization`,否则易 OOM。
- **比赛离线评分(一次跑完)**:离线合并几乎总是更省事、报错更少。
---
# 为什么 `llama3_lora_sft.yaml` 里有 “lora”?
在 **LLaMA-Factory** 中,示例 YAML 的命名规则一般是
```Java
<模型简称>_<微调算法>_<任务>.yaml
```
|片段|含义|
|---|---|
|`llama3`|以 Meta-Llama-3 系列为基础模型|
|`lora`|使用 **LoRA** 作为微调算法|
|`sft`|所做任务是 _Supervised Fine-Tuning_|
打开官方文档给出的范例文件可以看到关键信息:
```yaml
stage: sft
finetuning_type: lora # 指定使用 LoRA
lora_target: all # 给哪些线性层插 LoRA,默认 all
```
([aidoczh.com](https://www.aidoczh.com/llamafactory/en/getting_started/sft.html "SFT 训练 - LLaMA Factory"))
---
# YAML 中与 LoRA 相关的常见字段
|字段|作用|常见取值|
|---|---|---|
|`finetuning_type`|选择算法|`lora` / `qlora` / `full` / `freeze`|
|`lora_target`|在哪些层注入 LoRA|`all` / `q_proj,v_proj,...`|
|`lora_rank`|秩 $_r$|4–32,显存越低可适当取小|
|`lora_alpha`|缩放系数 $\alpha$|16 或 32(影响学习率尺度)|
|`lora_dropout`|随机失活率|0–0.1,防过拟合|
> **调参提示**:显存紧张时优先降低 `lora_rank` 或只给注意力/FFN 层上 LoRA,而不是一味减 batch size。
---
# LoRA 与 QLoRA、全参微调的区别
|方案|训练参数量|显存占用|推理速度|典型场景|
|---|---|---|---|---|
|Full FT|100 %|100 %|不变|研究机构、有数百 GB 显存|
|**LoRA**|0.1 %–1 %|↓60 % 左右|无额外开销|单卡 24 GB GPU 就能调 8 B 模型|
|**QLoRA**|同 LoRA,但基座 4-bit 量化|再省 40 % 显存|略有量化开销|显存 ≤ 12 GB 的消费级 GPU|
---
# LoRA 在 LLaMA-Factory 的完整闭环
1. **训练**
```bash
llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml
```
2. **验证/推理**
```bash
llamafactory-cli chat examples/inference/llama3_lora_sft.yaml
```
3. **合并权重(可选,部署更方便)**
```bash
llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml \
adapter_name_or_path=saves/llama3-8b/lora/sft \
output_dir=saves/llama3-8b/merged/sft
```
如此,你只需保存几百 MB 的 LoRA 适配器文件,就能把 80 GB 的大模型“定制”为你的专用版本;需要“打包”时再一键合并成完整权重即可。