今天在 GitHub Trending 上看到一个有意思的项目:Soup,一个让 LLM 微调变得极其简单的 CLI 工具,核心卖点是能在 4GB 显存的笔记本 GPU 上微调 8B 模型。
一、项目概述
Soup 是一个开源的 LLM 微调和后训练工具,目标是解决 LLM 训练的"配置地狱"问题。传统微调需要处理 SSH 连接、CUDA 版本、依赖冲突等基础设施问题,而 Soup 提供了一条命令完成训练的解决方案。
核心特性:
- 零 SSH:无需远程连接 GPU 服务器,本地即可完成训练
- 单一配置文件:所有训练参数通过
soup.yaml管理 - 自动优化:自动处理批次大小、GPU 检测、量化配置
- 层流式传输:支持在 4GB 显存上训练 8B 模型(NF4 量化 + LoRA)
- 多任务支持:SFT、DPO、GRPO、PPO、KTO、ORPO、SimPO、IPO、BCO 等
二、技术原理
层流式传输(Layer Streaming)
这是 Soup 最核心的创新技术。传统方式需要将整个模型加载到 GPU 显存中,8B 模型即使量化后也需要约 5-6GB 显存。Soup 的做法是:
- 冻结基座模型驻留主机内存:将 8B 模型的权重存储在系统 RAM(约 3.6GB)
- 逐层送入 GPU:训练时,每次只将一个 decoder 层送入 GPU 计算梯度
- 只训练 LoRA 适配器:基座模型权重冻结,只有 LoRA 参数参与训练
实测数据(RTX 3050 Laptop 4GB):
模型:Llama-3.1-8B-Instruct + NF4 量化
峰值显存:3.32 GB
训练速度:119.6 tok/s
核心配置示例:
training:
stream_layers: true # 启用层流式传输
quantization: 4bit # NF4 量化,约 4 倍压缩
batch_size: 4
stream_source: auto # RAM 够用则用 RAM,否则用 NVMe
正确性验证
层流式传输的数学等价性已在论文中证明:
- 前向传播:从 0.5B 到 72B 模型验证 bit-exact
- 反向传播:在 8B 和 14B 模型验证 bit-exact
- 训练质量:流式训练与常驻训练的模型质量无差异
论文已发表在 Zenodo:10.5281/zenodo.21918325
多后端支持
# pyproject.toml 中的后端选项
[project.optional-dependencies]
train = [...] # 标准 PyTorch + transformers + peft + trl
fast = ["unsloth>=2024.8"] # Unsloth 后端,2-5x 加速
mlx = ["mlx>=0.20.0", "mlx-lm>=0.31.3"] # Apple Silicon 支持
训练任务类型
Soup 支持丰富的训练任务:
| 任务 | 说明 | 配置示例 |
|---|---|---|
| SFT | 监督微调 | task: sft |
| DPO | 直接偏好优化 | task: dpo |
| ORPO | 优化比率偏好优化 | task: orpo |
| SimPO | 简单偏好优化 | task: simpo |
| KTO | Kahneman-Tversky 优化 | task: kto |
| GRPO | 组相对策略优化 | task: grpo |
| PPO | 近端策略优化 | task: ppo |
三、安装与快速开始
环境要求
- Python 3.10、3.11 或 3.12(不支持 3.13+)
- GPU:CUDA(推荐)、Apple Silicon(MPS)或 CPU(实验性,极慢)
- 显存:8GB+ 可训练 7B 模型(QLoRA)
安装步骤
# 轻量核心:仅 CLI + 配置 + 数据工具,无 PyTorch
pip install soup-cli
# 训练完整栈(推荐)
pip install "soup-cli[train]"
# 全功能(训练 + 推理服务 + UI + 数据工具)
pip install "soup-cli[all]"
⚠️ 注意:必须使用双引号
"soup-cli[train]",单引号在某些 shell 中会失败。
最简运行示例
# 1. 创建配置文件
soup init --template chat
# 2. 准备数据(alpaca 格式)
# data/train.jsonl
# 3. 开始训练
soup train --config soup.yaml
# 4. 测试模型
soup chat --model ./output
# 5. 推送到 HuggingFace
soup push --model ./output --repo you/my-model
四、使用方法与实战
基础配置文件
一个完整的 soup.yaml:
base: meta-llama/Llama-3.1-8B-Instruct
task: sft
data:
train: ./data/train.jsonl
format: alpaca # 自动检测:alpaca, sharegpt, chatml 等
val_split: 0.1
training:
epochs: 3
lr: 2e-5
batch_size: auto # 自动推断
lora:
r: 64
alpha: 16
quantization: 4bit # NF4 量化
stream_layers: true # 4GB 显存启用
output: ./output
数据格式自动检测
Soup 支持多种数据格式,无需手动指定:
- Alpaca:
instruction,input,output - ShareGPT:
conversations列表 - ChatML:OpenAI 格式对话
- Preference:DPO/ORPO 的偏好对格式
- Vision/Audio:多模态数据
// train.jsonl (Alpaca 格式)
{"instruction": "解释量子计算", "input": "", "output": "量子计算是..."}
进阶用法:偏好优化
# DPO 训练
soup init --template dpo
soup train --config soup.yaml
# 模板选项:dpo, orpo, simpo, kto, ipo, bco, rlhf
偏好数据格式:
{"prompt": "问题", "chosen": "好的回答", "rejected": "差的回答"}
导出与部署
# 合并 LoRA 到基座模型
soup merge --adapter ./output
# 导出 GGUF(用于 Ollama / llama.cpp)
soup export --model ./output --format gguf --quant q4_k_m
# 启动 OpenAI 兼容服务
soup serve --model ./output
质量门禁(soup ship)
Soup 内置了回归检测套件,防止微调破坏基础能力:
soup ship --base ./base --adapter ./my-lora --task-eval my_task.jsonl
# exit 0 = SHIP
# exit 2 = DON'T SHIP
七个内置评估套件:
- MCQ(多选题)
- 算术推理
- 工具调用
- JSON 格式
- 安全/拒绝检测
- 过度拒绝检测
- MMLU mini
五、常见问题与解决方案
Q1: 训练时报错 ImportError: DLL load failed
原因:Windows 上 PyTorch CUDA 版本不匹配。
解决方案:
# 重新安装匹配 CUDA 版本的 PyTorch
pip install torch --index-url https://download.pytorch.org/whl/cu121
Q2: 显存不足怎么办?
解决方案:
启用层流式传输:
training: stream_layers: true quantization: 4bit减小批次大小:
batch_size: 1使用梯度检查点:自动启用
Q3: 如何在 Apple Silicon 上训练?
# 安装 MLX 后端
pip install "soup-cli[train,mlx]"
# 配置
training:
backend: mlx
Q4: 训练速度太慢?
解决方案:
使用 Unsloth 后端(2-5x 加速):
pip install "soup-cli[fast]"backend: unsloth增大批次大小(显存允许时)
使用 Flash Attention(自动检测)
Q5: 如何诊断环境问题?
soup doctor
# 检查 GPU、依赖、版本等
六、总结
Soup 是一个设计理念非常清晰的 LLM 微调工具——让微调回归训练本身。它的层流式传输技术让普通开发者也能在消费级硬件上完成 8B 模型的微调,这对于个人研究者和中小团队来说意义重大。
从技术角度看,Soup 的亮点包括:
- 层流式传输的正确性证明和 bit-exact 验证
- 丰富的训练任务支持(SFT + 偏好优化全家桶)
- 内置质量门禁系统
- 完善的数据格式自动检测
对于想要尝试 LLM 微调但受限于硬件资源的开发者,Soup 值得一试。