一台4GB显存笔记本能微调8B模型了:Soup用层流技术把LLM微调门槛降到游戏本级别
你有一台普通办公笔记本,4GB 显存。现在你可以用它微调一个 80 亿参数的模型了。
这听起来像是在吹牛。但 Soup 真的做到了——在一张 RTX 3050 笔记本 GPU 上,用 3.32GB 显存峰值,微调 Llama-3.1-8B-Instruct。速度 119.6 tokens/s,和在 H100 上独立复现的结果一致(113 tokens/s,同为 3.32GB 峰值)。
这不是量化魔术,不是蒸馏阉割,是一层一层地喂模型——层流(Layer Streaming)。
它怎么工作的
传统 QLoRA 微调,8B 模型至少需要 6.6-9GB 显存才能跑起来,因为整个量化后的模型必须常驻 VRAM。Unsloth 在这个基础上做了优化,但最低也在 6.6GB 左右。
Soup 的思路不同。它利用了一个关键事实:微调时 Base Model 是冻结的——不更新梯度,不更新权重,只做前向推理。那既然是只读的,为什么要把它全部塞进显存?
层流把冻结的 Base Model 放在系统内存(RAM)或 NVMe 磁盘上,每次只把当前计算所需的单个解码层传入 GPU。VRAM 里永远只保留:当前层的权重 + LoRA 适配器 + 优化器状态。这就是为什么峰值只有 3.32GB。
结果:4GB 显存能跑 8B 模型。不是降级版,是完整 8B。
真实门槛:数字说话
测的是 RTX 3050 笔记本版,4GB 显存:
- 模型:Llama-3.1-8B-Instruct,NF4 量化 + LoRA
- 显存峰值:3.32GB
- 处理速度:119.6 tokens/s
- H100 复现:113 tokens/s,同为 3.32GB(说明瓶颈在 PCIe 带宽,不是 GPU 型号)
有个细节很重要:这套结果是位级精确(bit-exact)的——即把完整模型放进 VRAM 正常训练,输出结果与层流方案完全一致,最大 logit 差值为 0.0。官方在九个架构族上验证了这一点,还有 免费的 Colab T4 notebook 可以直接验证。
代价也必须说清楚:层流比全 VRAM 驻留慢约 1.43 倍。按 119.6 tokens/s 算,一个 1 万条、平均 512 token 的 SFT 数据集,单 epoch 约 12 小时。租一台 A100 做同样的事,不到 1 小时。但如果你本来就没有 A100,这笔账就不一样了。
硬件门槛:
- GPU:4GB 显存即可(RTX 3050 笔记本版这类)
- 内存:16GB 系统内存(如果 Base Model 放不下, Soup 会自动溢出到 NVMe,但非 NVMe 磁盘会被直接拒绝)
- 系统:Windows / Linux 均可,Python 3.10-3.12
上手体验:两行命令进门槛
pip install "soup-cli[train]"
soup init --template chat
soup train
init 会生成一个 YAML 配置文件,包含模型、数据集路径、训练参数。train 会自动检测 GPU 型号、选择 batch size、处理量化。配置示例:
base: meta-llama/Llama-3.1-8B-Instruct
task: sft
data:
train: ./data/train.jsonl
format: alpaca
training:
epochs: 3
lr: 2e-5
quantization: 4bit
lora:
r: 64
alpha: 16
output: ./output
支持的训练任务覆盖了主流 post-training 方式:SFT、DPO、ORPO、SimPO、KTO、GRPO(不含 PPO)、Pretrain 等。如果有 8GB 以上显存,装 Unsloth 后加一行 backend: unsloth,训练速度提升 2-5 倍。
训练完成后可以 soup merge 合并 LoRA 适配器与 Base Model,soup export --format gguf 导出给 Ollama 或 llama.cpp 直接本地推理。
一个不寻常的发布门
大多数开源微调框架只关心”能不能跑起来”,不关心”跑完之后有没有变好”。Soup ship 是它专门解决这个问题的东西——一个本地化的模型质量发布门。
soup ship 对每次 checkpoint 运行七套离线评测(MCQ、算术、工具调用、JSON 合法性、安全/拒绝),输出 exit code:0 = 通过(SHIP),2 = 不通过(DON’T SHIP),3 = 配置问题。
v0.73.2 的 release notes 难得一见地坦诚:他们主动承认了三件事,其中最值得说的是评测本身的盲区——
-
工具调用评分 Bug:某模型 40/40 全部答对,评测得分 0.225。原因是模型少输出一个右花括号,解析器回退到内层对象,评测器误判”缺少外层 key”。模型对了,评测器错了。
-
MMLU 格式 Bug:评测器不认识
boxed{C}这种 LaTeX 格式,导致 Llama-3.1-8B 得分只有 0.423(低于 0.5B 模型)。修复后恢复到 0.731。 -
拒绝维度缺失:原来的评测套件无法区分”模型正常回答”和”模型拒绝所有请求”——两种情况在七套评测上字节级相同。增加了
mini_over_refusal轴才解决。
加上 --noise-floor N 参数,可以让 Soup 先跑 N 次 Base Model 测出噪声分布,再拒绝任何小于该 spread 的改进阈值。GPU 上的随机性是真实的——同一模型同一数据跑五次,分数差 0.015-0.020,设置阈值 0.05 以上才不算”显著改进”。
这种透明度在 AI 项目里是稀缺品。至少你知道评测报告里哪些数字是真的,哪些可能是评测本身的 bug。
适合谁,不适合谁
适合:
- 本地 fine-tune 场景、数据不能上云的团队
- 想学微调但没有 A100 的个人开发者(笔记本就能跑)
- 需要在私密数据上微调垂直领域模型的场景
不适合或需要注意:
- GRPO/PPO 强化学习训练:不支持。原因:RL 训练需要在线生成 token,生成过程需要反复读取所有层,层流的架构不支持这类负载。有这个需求的看别家。
- 速度敏感的生产训练:4GB 层流比 8GB+ 全驻留慢 1.43 倍。如果你有 8GB 以上显存,Unsloth 后端是更快的选择。
- 需要 PPO 的完整 RLHF pipeline:PPO 同样不被层流支持。soup 的定位是 post-training 的前半段(SFT → DPO/ORPO/KTO),不是全链路 RLHF。
下一步
如果你决定试试,路线图很清晰:
- 先验证可行性:
pip install soup-cli,运行soup init --template chat,然后跑soup train --dry-run(dry-run 会模拟训练过程并报告显存使用,不实际开始训练) - 准备数据:按 [Alpaca 格式](https://raw.githubusercontent.com/tatsu-lab/stanford_alpaca/main/ alpaca_data.json)准备你的训练 JSONL,100 条以上即可开始实验
- 小样本验证:训练结束后,用
soup ship跑一遍评测,确认适配器确实产生了效果(不是静默失败) - 有 8GB+ 显存:加装 Unsloth(
pip install 'soup-cli[fast]'),改 config 加一行backend: unsloth,速度翻 2-5 倍
项目地址:https://github.com/MakazhanAlpamys/Soup,官网 https://trysoup.dev,有 Discord 社区和详细的 文档。
如果你正在考虑在私有数据上训练一个专属模型,手里只有一台普通游戏本——这可能是你等了很久的工具。
评论区
登录后可评论。