概述
小模型(Small Language Models, SLMs)指参数规模在 0.5B~14B 之间的语言模型,适合在消费级 GPU 或有限数据中心 GPU(如 2× V100 16GB)上进行微调。本笔记记录微调技术路线、工具链、模型选型和算力方案。
核心认知:小模型的获取有 四大范式——① PEFT 微调(在预训练模型上低成本适配)、② 知识蒸馏(从大模型学出小模型)、③ 从零训练(完全自己训一个小 LLM)、④ Master Prompt 微调(公开微调方法颠覆企业垂直训练)。
一、模型选型(2025-2026 SLM 生态)
| 模型 | 参数 | 架构特点 | V100 16GB 单卡 | V100 16GB 双卡+NVLink |
|---|---|---|---|---|
| Qwen3-4B | 4B | 标准 Dense,32K ctx,GQA | ✅ QLoRA 轻松 | ✅ LoRA 也可 |
| Qwen3-8B | 8B | 标准 Dense,32K ctx,GQA | ⚠️ QLoRA 刚够 | ✅ LoRA / QLoRA |
| Qwen3.6-14B-A2B | 14B(Active 2B) | MoE,单 token 仅激活 2B 参数 | ⚠️ QLoRA 可跑 | ✅ 性价比最高 |
| LLaMA 3.2-3B | 3B | 标准 Dense,8K ctx,GQA | ✅ QLoRA 轻松 | ✅ LoRA 轻松 |
| LLaMA 3.2-11B | 11B(Vision) | 多模态 Dense | ❌ 16GB 不够 | ⚠️ QLoRA 勉强 |
| Phi-4-14B | 14B | 标准 Dense,高质量数据训练 | ❌ 放不下 | ⚠️ QLoRA 刚够 |
| Gemma 2-2B | 2B | 标准 Dense,8K ctx | ✅ 随便跑 | ✅ 随便跑 |
| Gemma 2-9B | 9B | 标准 Dense,8K ctx | ⚠️ QLoRA | ✅ LoRA 可能 |
| SmolLM2-1.7B | 1.7B | 极小型,适合嵌入/分类 | ✅ 全量微调可能 | ✅ 全量微调 |
二、四大训练范式总览
| 范式 | 原理 | 需要基座模型 | 需要 GPU | 典型耗时 | 适用场景 |
|---|---|---|---|---|---|
| PEFT 微调 (LoRA/QLoRA) |
在已有预训练模型上插入少量可训练参数 | ✅ 必须 | 低(1×V100 够) | 小时级 | 任务适配、领域微调、指令对齐 |
| 知识蒸馏 (Distillation) |
小模型学习大模型的输出分布/logits | ✅ 教师模型 | 中(1~2×V100) | 小时~天级 | 模型压缩、部署轻量化、隐私场景 |
| 从零训练 (MiniMind 路线) |
完全从随机权重开始预训练 | ❌ 不需要 | 低(1×消费级) | 2~24h | 教育学习、特殊词表、极致领域定制 |
| Master Prompt 微调 (CJ Zafir 路线) |
公开的 prompt 架构 + 针对性 LoRA 微调,垂直碾压通用大模型 | 可选 | 低(Mac/消费级) | 小时级 | 企业垂直领域替代昂贵通用 API、降本 70% |
三、参数高效微调(PEFT)技术全景
3.1 LoRA(Low-Rank Adaptation)
- 论文:Hu et al. 2021, arxiv 2106.09685
- 原理:在冻结的预训练权重旁插入低秩分解矩阵(A×B),仅训练这些适配器
- r(秩):典型值 8~64,控制参数量与表现力的 trade-off
- α(缩放因子):通常为 r 的 1~2 倍,如 r=16, α=32
- 内存影响:仅需存储优化器状态(Adam 的 2× 参数)——冻结权重无 optimizer state
- 优势:推理零开销(可合并回原权重),无推理延迟增加
3.2 QLoRA(Quantized LoRA)
- 论文:Dettmers et al. 2023, arxiv 2305.14314
- 核心:将基座模型量化为 4-bit NF4(NormalFloat4)+ 双重量化减少存储,基座精度≈4bit(内存降低~4x),LoRA 适配器保持 16/32bit 精度
- 关键技术:NF4 数据类型(信息论最优的 4-bit 归一化浮点),Paged Optimizers(GPU OOM 时将 optimizer state 分页到 CPU),双重量化(量化常数也量化)
- 内存对比(7B 模型):全量 16bit → ~16GB,LoRA 16bit → ~16GB(仍需加载全模型),QLoRA 4bit → ~5GB
- 性能:QLoRA 微调 65B 模型仅需 1× 48GB GPU,效果接近 16bit 全量微调
3.3 DoRA(Weight-Decomposed Low-Rank Adaptation)
- 论文:Liu et al. 2024, arxiv 2402.09353
- 创新:将预训练权重分解为 幅度(magnitude) 和 方向(direction),分别微调
- 效果:在 LLaMA/LM 微调上持续优于 LoRA,更接近全量微调的学习能力
- 额外开销:训练时额外存储幅度向量,推理时仍可合并,无额外推理开销
- 兼容性:可与 QLoRA 结合(QDoRA)
3.4 LoftQ(LoRA-Fine-Tuning-Aware Quantization)
- 论文:Li et al. 2023, arxiv 2310.08659
- 改进:交替量化+低秩分解,初始化 LoRA 适配器时补偿量化误差
- vs QLoRA:QLoRA 使用 NF4 量化的 base + 随机初始化的 LoRA;LoftQ 在初始化阶段做量化感知的 LoRA 权重初始化
- 效果:在低比特(2~4bit)场景下优于 QLoRA 的初始质量
3.5 Chain of LoRA(COLA)
- 论文:Xia et al. 2024, arxiv 2401.04151
- 思路:将 LoRA 适配器串联为链式结构,每个 LoRA 模块逐步精炼残差
- 效果:在低数据场景下效果更好,类似 Boosting 思想
3.6 LISA(Layerwise Importance Sampling)
- 论文:Pan et al. 2024, arxiv 2403.17919
- 创新:不训练 LoRA 而是随机选择少量层进行全参数更新,其余层冻结
- 内存:接近 LoRA 的内存消耗(冻结层无 optimizer state),但能学到全参数微调的表示
- 适用场景:想获得全参数微调质量但 GPU 受限
3.7 技术对比
| 方法 | 训练参数占比 | 7B 训练内存 | 推理开销 | 性能(vs 全量) |
|---|---|---|---|---|
| Full Fine-tuning | 100% | ~60GB | — | 基准 |
| LoRA (r=16) | ~0.2% | ~16GB | 无(可合并) | ~95% |
| QLoRA (4-bit + LoRA) | ~0.2% | ~6GB | 无(可合并) | ~99% |
| DoRA | ~0.2% | ~17GB | 无(可合并) | ~97% |
| LoftQ | ~0.2% | ~6GB | 无(可合并) | ~98%(低比特更优) |
| LISA | ~10% | ~20GB | — | ~99% |
四、微调工具链
4.1 Hugging Face TRL(Transformer Reinforcement Learning)
- SFTTrainer:最主流的监督微调入口,原生支持 LoRA/QLoRA
- DPOTrainer / CPOTrainer / GRPOTrainer:偏好对齐训练
- DataCollator 支持:自动 padding + packing,
DataCollatorForCompletionOnlyLM支持仅计算回答部分 loss
from trl import SFTTrainer
from peft import LoraConfig
lora_config = LoraConfig(
r=16, lora_alpha=32,
target_modules="all-linear",
lora_dropout=0.05, bias="none",
task_type="CAUSAL_LM",
)
trainer = SFTTrainer(
model=model, train_dataset=dataset,
args=transformers.TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
learning_rate=2e-4,
fp16=True, logging_steps=10,
num_train_epochs=3,
),
peft_config=lora_config,
dataset_text_field="text",
max_seq_length=2048,
)
trainer.train()
4.2 Axolotl
- 定位:YAML 驱动的训练框架,封装 TRL + PEFT + Accelerate + DeepSpeed
- 优势:零代码微调,只需 YAML 配置文件
- 支持:LoRA/QLoRA/DoRA/FPFT、DPO/KTO/ORPO/GRPO、多模态、FSDP/DeepSpeed
4.3 Unsloth
- 定位:2x 更快、显存减半的 LoRA/QLoRA 方案
- 关键优化:手动编写 Triton 内核替代 Hugging Face 的部分前向/反向计算
- 适用:资源受限时的首选,特别适合 V100 这种显存较小的 GPU
4.4 工具选型建议
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 快速实验 / 原型验证 | Unsloth | 配置最少,启动最快,显存最优 |
| 批量多轮实验 | Axolotl | YAML 可复现,实验管理方便 |
| 偏好对齐(DPO/GRPO) | TRL + Unsloth 或 Axolotl | TRL 原生支持,Unsloth 加速 |
| 生产级多 GPU 训练 | Axolotl + DeepSpeed | 分布式支持完善 |
| 全量微调 | Axolotl + FSDP | FSDP 分片策略成熟 |
五、算力方案:本地硬件与商业算力
小模型训练的算力来源分两个方向:本地硬件部署(自购 GPU 服务器)和 商业算力(云 GPU 租赁/API)。以下以 V100 16GB×2 为本地硬件基准,同时给出商业算力选项供已有预算方案时参考。
5.1 本地硬件:V100 16GB × 2 规格
- GPU:2× Tesla V100 16GB(NVLink 互联)
- 显存:合计 32GB(NVLink 共享,但每卡独立 16GB 物理显存)
- CUDA 计算能力:7.0 — 不支持 Flash Attention 2(需 ≥7.5 sm_75),不支持 TF32(需 ≥7.5 sm_75)
- 支持:FP16 混合精度(半精度 Tensor Core),int8/FP32 计算
5.2 V100 关键限制
- 不支持 Flash Attention 2(需要 Ampere 及以上架构,sm≥80)
- bitsandbytes 4-bit 的某些硬件优化路径受限(但 4-bit 加载仍可工作)
- 必须使用
fp16=True(不能 bf16,V100 原生不支持 bfloat16)
5.3 商业算力选项
| 平台 | 可选 GPU | 价格参考 | 特点 |
|---|---|---|---|
| AutoDL | RTX 3090 / 4090 / A100 / H100 | 3090 ≈ 1.3¥/h | 国内最流行、按小时租、社区镜像多 |
| 恒源云 / 趋动云 | RTX 3090 / A100 80G 等 | ≈ 1~5¥/h | 社区镜像丰富 |
| Lambda Labs / Vast.ai | A100 / H100 / RTX 4090 | $0.5~2/h | 海外按秒计费 |
| RunPod / Modal | A100 80G / H100 / L40S | $0.5~2/h | serverless 模式,快速上手 |
商业算力建议:
- 租赁 RTX 3090 24GB(≈ 1.3¥/h)可运行 8B QLoRA,比 V100 多 8GB 显存,性价比最高
- 租赁 A100 80G(≈ 8~10¥/h)可运行 14B LoRA 甚至全量微调
- AutoDL 等平台自带 PyTorch 镜像,无需自己配环境
5.4 显存预算表(单卡 16GB)
| 模型大小 | 方法 | base 加载 | 梯度/优化器 | 激活(bs=1, len=2048) | 总计 | 双卡可用(32GB) |
|---|---|---|---|---|---|---|
| 4B | QLoRA 4-bit | ~2.5GB | ~1GB | ~2GB | ~5.5GB | ✅ 富裕 |
| 4B | LoRA 16-bit | ~8GB | ~1GB | ~3GB | ~12GB | ✅ 可 |
| 8B | QLoRA 4-bit | ~5GB | ~1.2GB | ~3GB | ~9.2GB | ✅ 可 |
| 8B | LoRA 16-bit | ~16GB | ~1.2GB | ~5GB | ~22GB | ⚠️ 超单卡 |
| 14B | QLoRA 4-bit | ~8GB | ~1.5GB | ~4GB | ~13.5GB | ⚠️ 单卡紧张 |
| 14B (MoE) | QLoRA 4-bit | ~8GB | ~1.5GB | ~2GB | ~11.5GB | ✅ 可 |
5.5 单卡 vs 双卡策略
| 策略 | 优点 | 缺点 |
|---|---|---|
| 单卡 QLoRA | 配置简单,无需分布式 | batch size 受限(通常 1~2) |
| 双卡 DDP | batch size 翻倍,训练更快 | V100 不支持 NCCL P2P,需 NCCL_P2P_DISABLE=1 |
| 双卡 DeepSpeed Zero-2 | 优化器状态分片,可放大模型 | V100 不支持 Zero-3,Zero-2 可用 |
六、数据准备
6.1 数据集格式
对话格式(推荐):
{"messages": [
{"role": "system", "content": "你是一个有用的助手。"},
{"role": "user", "content": "什么是梯度下降?"},
{"role": "assistant", "content": "梯度下降是一种优化算法..."}
]}
ShareGPT 格式(Axolotl 原生):
{"conversations": [
{"from": "human", "value": "什么是梯度下降?"},
{"from": "gpt", "value": "梯度下降是一种优化算法..."}
]}
6.2 重要数据集
- OpenAssistant / ShareGPT:通用指令微调
- Magpie-Pro-300K:Qwen 自生成高质量指令数据
- FineWeb / DCLM:预训练续训数据
- MiniMind 系列数据:
pretrain_t2t+sft_t2t专为从零训练设计
七、训练流程最佳实践
7.1 通用超参数
| 参数 | LoRA | QLoRA | 从零训练 |
|---|---|---|---|
| learning_rate | 2e-4 | 2e-4 | 3e-4~5e-4 |
| lora_rank (r) | 16~32 | 16~64 | N/A |
| lr_scheduler | cosine | cosine | cosine+warmup |
| optimizer | adamw_torch | adamw_bnb_8bit | AdamW |
| max_seq_length | 2048 | 2048 | 768~2048 |
八、范式一:PEFT 微调
见第三~四章(LoRA/QLoRA/DoRA + 工具链)。微调已有预训练模型是获取小模型最快的方式。
九、范式二:从零训练(MiniMind 路线)
9.1 项目概况
- 项目:jingyaogong/minimind ⭐ 51K
- 作者:巩景瑶(Jingyao Gong)
- 核心理念:2小时从0训练64M参数LLM,覆盖 Pretrain → SFT → RLHF/DPO 全流程
- 设计目标:极低成本复现大模型训练全过程,让个人开发者也能理解 LLM 的完整训练链路
9.2 架构
- 模型配置:
model_minimind.py中定义,支持从 26M 到 64M 参数 - 训练管线:
数据集 → train_pretrain.py(预训练)→ model.pth
→ train_sft.py(指令微调)→ full_sft.pth
→ train_rl.py(DPO/RLHF 对齐)→ full_rl.pth
→ train_distillation.py(蒸馏)→ student.pth
9.3 训练阶段
| 阶段 | 脚本 | 时间(64M) | 说明 |
|---|---|---|---|
| 预训练 | train_pretrain.py | ~1h | 从随机权重开始,在 pretrain_t2t 数据上训练 |
| SFT 微调 | train_sft.py | ~0.5h | 在指令数据上微调,具备对话能力 |
| 偏好对齐 | train_rl.py | ~0.5h | DPO/GRPO/RLHF 对齐人类偏好 |
| 蒸馏 | train_distillation.py | ~0.5h | 从教师模型(更大尺寸)学习分布 |
9.4 关键设计
- MoE 支持:使用稀疏 MoE 架构替代 Dense,可在相同 flops 下扩大参数量
- Tokenier 复用:不建议重新训练 tokenizer,保持与社区兼容
- 训练监控:内置 loss 可视化、PPL 评估、beam search 生成
- 评估:
eval_llm.py提供 ceval/cmmlu 等中文 benchmark 评测 - 数据推荐:快速复现用
pretrain_t2t_mini+sft_t2t_mini;追求效果用完整数据集
9.5 衍生生态
- learn-minimind(351★):22 课系统化 LLM 学习路线
- minimind-notes(123★):极简大模型训练原理与实践指南
- Minimind-LLaVA-V:扩展到多模态视觉语言模型
9.6 适合什么场景
- 教育学习:理解 LLM 从 pretrain → SFT → RLHF 的完整链路
- 特殊词表:需要自定义 tokenizer 和词表时无法用预训练模型
- 极致领域定制:模型架构需要修改(如 MoE 路由策略)
- 非目标:替代 PEFT / 蒸馏——从零训的 64M 模型能力远不及 LLaMA/Qwen 微调
十、范式三:知识蒸馏(Distillation)
10.1 原理
知识蒸馏(Knowledge Distillation)是用一个大的 教师模型 来教一个小的 学生模型。学生模型不仅学习"正确答案",还学习教师在不同候选 token 之间的相对倾向(即 logits 分布中的软信息)。
10.2 蒸馏方式
| 方式 | 原理 | 信息量 | 复杂度 | 典型实现 |
|---|---|---|---|---|
| 黑盒蒸馏 | 学生仅学习教师的最终输出文本(teacher's output text) | 低 | 低 | 用教师生成 SFT 数据→训练学生 |
| 白盒蒸馏 | 学生学习教师的 logits 分布(teacher's token distribution),使用 KL 散度损失 | 中 | 中 | loss = CE(y, y_true) + β·KL(p_teacher, p_student) |
| 特征蒸馏 | 学生还学习教师的中间层 hidden states | 高 | 高 | 需要对齐中间层维度 |
| 在线蒸馏 | 教师和学生同时训练,互相学习 | 高 | 高 | Deep mutual learning |
10.3 MiniMind 中的蒸馏实现
train_distillation.py 提供了完整的白盒蒸馏参考实现:
- 教师/学生双模型加载:教师用更大参数版本,学生用更小版本
- 损失函数:
CE + β·KL混合损失 - 温度缩放:Temperature 控制 soft label 的平滑程度
- MoE + Dense 组合蒸馏:支持从 MoE 教师蒸馏到 Dense 学生
10.4 适用场景
- 模型压缩:从 7B 蒸馏到 1.5B,保持大部分能力
- 部署轻量化:学生模型更小,推理更快,适合边缘设备
- 隐私场景:可以用教师 API 的输出来训练本地学生,不暴露教师权重
- 组合使用:蒸馏后的学生模型可以进一步用 PEFT 微调
10.5 经典蒸馏论文
- Hinton et al. "Distilling the Knowledge in a Neural Network" (2015). 奠基之作
- Sanh et al. "DistilBERT" (2019). 用蒸馏将 BERT 压缩 40%
- Gu et al. "The Wisdom of a Crowd of Brothers" — 在线蒸馏
十一、范式四:Master Prompt 微调(CJ Zafir)
11.1 来源
CJ Zafir 提出的 Master Prompt 公开微调方法,经抖音创作者 Carson 的视频介绍而被中文社区所知。该方法主张以公开透明的 prompt 架构 + 针对性 LoRA 微调,在垂直领域碾压昂贵通用大模型(GPT-4/Claude 等),实现 ~70% 成本降低 + 效果反超。
核心主张:
- 通用大模型(GPT-4/Claude/Gemini)在垂直领域并非最优解——微调小模型 + 精心设计的 master prompt 可以做得更好、更便宜
- 微调方法应该公开、可复现,企业可直接 copy 方案,而非依赖封闭黑盒
- Apple Silicon Mac(Mac Studio / MacBook)即可完成训练,无需昂贵 GPU 集群
11.2 代表项目:Mac-1
- 基座:Qwen3.5 架构(
Qwen3_5ForConditionalGeneration) - 量化:4-bit MLX affine(group_size=64),bfloat16 精度
- 平台:HuggingFace hf.co/CJzafir
- 定位:在 Apple Silicon 上落地小模型微调的实践示例
(注:Master Prompt 的具体模板内容未公开索引到,建议在抖音搜索 Carson 的相关视频获取完整信息。)
11.3 MLX 微调示例
pip install mlx-lm
mlx_lm.lora \
--model CJzafir/Mac-1 \
--train \
--data ./垂直领域数据 \
--iters 200 \
--lora-rank 16 \
--learning-rate 2e-4
十二、推荐路线(按需求)
| 需求 | 方案 | 算力方案 | 技术栈 |
|---|---|---|---|
| 快速适配领域任务 | PEFT 微调 | 本地 V100 单卡 / 租 3090 | QLoRA + Unsloth |
| 高性能微调 | PEFT 微调 | 本地 V100 双卡 / 租 A100 | QLoRA + Qwen3-8B + DeepSpeed |
| 垂直领域降本反超通用大模型 | Master Prompt 微调 | Apple Silicon Mac / 消费级 GPU | CJ Zafir 方法论 + MLX |
| 从零学习 LLM 原理 | MiniMind 从零训练 | 任意 GPU / 租 3090(1.3¥/h) | Python + MiniMind |
| 模型压缩/部署 | 知识蒸馏 | 本地 V100 单卡 / 租 3090 | Teacher→Student + MiniMind 蒸馏 |
| 极致定制(自建词表) | 从零训练 + 蒸馏 | 租 A100(8~10¥/h) | MiniMind + Distillation |
十三、文献索引
- Hu et al. "LoRA: Low-Rank Adaptation of Large Language Models" (2021). arXiv:2106.09685
- Dettmers et al. "QLoRA: Efficient Finetuning of Quantized LLMs" (2023). arXiv:2305.14314
- Liu et al. "DoRA: Weight-Decomposed Low-Rank Adaptation" (2024). arXiv:2402.09353
- Li et al. "LoftQ: LoRA-Fine-Tuning-Aware Quantization for Large Language Models" (2023). arXiv:2310.08659
- Xia et al. "Chain of LoRA: Efficient Fine-tuning via Residual Learning" (2024). arXiv:2401.04151
- Pan et al. "LISA: Layerwise Importance Sampling for Memory-Efficient LLM Fine-Tuning" (2024). arXiv:2403.17919
- Hinton et al. "Distilling the Knowledge in a Neural Network" (2015). 蒸馏奠基之作
- MiniMind — jingyaogong/minimind ⭐51K, GitHub
- CJ Zafir / Mac-1 — hf.co/CJzafir, Qwen3.5 4-bit MLX
- Carson(抖音) — 介绍 CJ Zafir Master Prompt 的中文创作者
最后更新:2026-06 · 覆盖四大范式(PEFT / 从零训练 / 蒸馏 / Master Prompt)+ 算力覆盖本地硬件和商业算力两大方向