Soup全参数微调指南:GaLore/LISA如何在有限显存下逼近Full FT效果
【免费下载链接】SoupFine-tune LLMs from one YAML. Layer streaming trains an 8B model on a 4 GB laptop GPU.项目地址: https://gitcode.com/GitHub_Trending/soup12/Soup
Soup 是一个「一个 YAML 文件微调 LLM」的开源工具,而它的 GaLore 与 LISA 两大特性,正是让全参数微调(Full Fine-Tuning)不再被显存卡脖子的关键:在 4 GB 的笔记本显卡上训练 8B 模型、在单张 80 GB 卡上跑下传统需要约 120 GB 显存的完整微调。本文用实测数据讲清楚两者的原理、配置与选型建议,帮你用最少的显存拿到最接近 Full FT 的效果。
上图是 Soup 在 4 GB 显卡上训练 Llama-3.1-8B 的实测演示:基座权重固定在内存中,逐层送入 GPU,峰值显存仅 3.32 GB。
一、为什么需要 GaLore / LISA?先看一组真实显存账单
全参数微调的效果上限通常高于 LoRA,但显存开销是「模型参数 + 梯度 + 优化器状态」的三重叠加。Soup 在单张 H100 80 GB 上的实测结果(记录于 benchmarks/gate-h100-validation.md):
Llama-3.1-8B-Instruct(Alpaca,200 步)
| 训练方式 | 峰值显存 | 验证集损失 |
|---|---|---|
| 全参数微调 | ❌ 73.94 GB 时 OOM(batch=1 也放不下) | – |
| LISA(2 层 / 20 步) | 52.14 GB | 1.294 |
| LoRA r=16 | 34.56 GB | 1.275 |
Qwen2.5-3B-Instruct
| 训练方式 | 峰值显存 | 验证集损失 |
|---|---|---|
| 全参数微调 | 57.60 GB | 1.2905 |
| LISA | 19.37 GB | 1.2463 |
| LoRA r=16 | 15.93 GB | 1.2420 |
两个值得注意的结论:
- ✅LISA 在两个学习率下都压过了全参数微调的质量——「低显存 = 低质量」在 7B+ 规模上不成立;
- ⚠️ 但 LISA 的显存只有 LoRA 的 1.22~1.51 倍,且随模型规模差距扩大,原因见下文「常驻开销」。
二、GaLore:梯度低秩投影,让优化器不再吃满显存
🔍原理一句话:全参数微调的大头往往不是参数本身,而是 AdamW 为每个参数维护的一份一阶+二阶动量状态。GaLore 把梯度先投影到低秩空间(源码注释:优化器显存从 O(n·m) 降到 O(n·r + m·r)),训练时所有参数仍然更新,但优化器状态只为低秩分量维护。
最小配置(完整文档见 docs/peft-and-efficiency.md):
training: quantization: none # 必须:GaLore 与量化互斥 use_galore: true galore_rank: 128 # 低秩维度,默认 128 galore_update_proj_gap: 200 # 每 200 步重算投影 galore_scale: 0.25三个必须记住的约束(gaLore 校验逻辑):
quantization: none—— 4bit/8bit 会与 GaLore 冲突,直接报错;backend: transformers—— 不支持 unsloth 后端;- 作用在
attn与mlp模块,优化器为galore_adamw。
适合谁:想保持「真·全参数」语义、又不想上多卡 ZeRO 的训练者。它压缩的是优化器显存,不改变「每个参数都被更新」这一事实。
三、LISA:每 20 步只训 2 层,用轮换来换显存
🔍原理一句话:LISA(Layerwise Importance Sampled AdamW)不一次性挑定要训的层,而是每隔 N 步随机抽取一小撮 decoder 层进行全精度更新,其余层冻结(实现)。训练足够长的时间后,每一层都会轮到——效果接近全参数微调,但同一时刻只有少数层携带优化器状态,峰值显存因此骤降。
training: quantization: none # LISA 是活跃层的全参数训练,不叠加量化 lisa_enabled: true lisa_num_layers: 2 # 每个区间激活的层数(默认 2) lisa_interval_steps: 20 # 每 20 步重新抽样一次 lisa_train_embeddings: true # 默认 true,可改为 false 见下那个「常驻开销」:为什么 8B 上 LISA 是 52 GB
Soup 的实测发现:默认的 embeddings + LM head + final norm 在每个区间都保持可训练,在 8B 模型里它们占了 LISA 全部训练量的70.7%(3B 上为 66.9%)——这部分开销 LoRA 根本不需要支付,而且随「词表 × 隐藏维度」线性增长。
所以 Soup 提供了lisa_train_embeddings: false:冻结该常驻组,只训被抽中的层,显存才能真正逼近 LoRA 量级。代价是质量可能波动(官方建议两种方式都实测一遍再定,详见 LISA 完整章节)。
调参的两个实测结论
- 📉
lisa_num_layers越大越差(3B 验证集损失:2 层 1.2504 → 8 层 1.2673 → 16 层 1.2950),且 8B 上超过 8 层直接 OOM 一张 80 GB 卡。默认值 2 就是最优区; - 📊
lisa_interval_steps在 1~50 之间几乎无差异,只有 200(全程仅抽样一次)才会退化。默认 20 稳。
LISA 的适用边界:仅限sft/pretrain+ transformers 后端 + 纯文本 + 无量化,且与 LoRA、freeze_layers等互斥(配置校验 会在启动前拦住误配)。
四、选型清单:GaLore、LISA 还是 LoRA?
| 需求 | 推荐 | 理由 |
|---|---|---|
| 显存极小(4~12 GB 级) | LoRA(可叠加 Soup 层流式) | 显存最省,实测质量打平 |
| 8B 模型、单张 80 GB、要「全参数级」更新 | LISA | Full FT 约需 120 GB,LISA 52 GB 拿下,质量反超 |
| 显存适中、追求纯正全参数语义 | GaLore | 优化器显存降一个量级,所有参数照常更新 |
| 极致压缩优化器状态 | GaLore + 调小galore_rank | 显存与 rank 线性相关 |
一句话决策:在 7B 以上规模,LISA 的质量已验证不低于全参数微调,而 LoRA 用约三分之一的显存追平甚至反超 LISA——所以「显存不够时」首选 LISA,「显存真的极少时」选 LoRA,GaLore 则是「必须全参数、又不想上多卡」的中间解。
五、延伸阅读
- 训练主文档:docs/training.md
- GaLore / LISA 完整章节:docs/peft-and-efficiency.md
- H100 显存与质量实测记录:benchmarks/gate-h100-validation.md
- GaLore 优化器构建:src/soup_cli/utils/galore.py
- LISA 回调实现:src/soup_cli/utils/lisa.py
【免费下载链接】SoupFine-tune LLMs from one YAML. Layer streaming trains an 8B model on a 4 GB laptop GPU.项目地址: https://gitcode.com/GitHub_Trending/soup12/Soup
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考