微软 miniLLM 仓库解读和实践方案
文章目录
-
- 一、仓库整体定位
- 二、MiniLLM 是什么(一句话)
- 三、minillm 目录结构速读
- 四、初学者推荐路径(GPT-2 最小可跑闭环)
- 五、读源码的顺序建议
- 六、初学者常见坑提示
- 一、先看清能复现什么(论文 ↔ 仓库脚本对照表)
- 二、入门学习路径(5 个 Level,由易到难)
- 三、按算力反查可做哪些(实用对照表)
- 四、给你的入门 90 分钟最小闭环(建议今天就做)
下面我为你做一份「初学者上手指南」。先看仓库整体,再聚焦你最关心的 MiniLLM 子项目。
一、仓库整体定位
microsoft/LMOps 是微软的一个研究合集仓库,里面是一篇篇论文对应的独立子项目(每个子目录是一篇论文的代码)。它不是一个统一的框架,而是「论文代码集合」。
主题大致分四块(来自 [README.md](file:///Users/qinjiahong/代码/LMOPS_miniLLM/README.md)):
| 主题 | 代表子目录 |
|---|---|
| 更好的 Prompt | [promptist](file:///Users/qinjiahong/代码/LMOPS_miniLLM/promptist), [prompt_optimization](file:///Users/qinjiahong/代码/LMOPS_miniLLM/prompt_optimization), [uprise](file:///Users/qinjiahong/代码/LMOPS_miniLLM/uprise), [llm_retriever](file:///Users/qinjiahong/代码/LMOPS_miniLLM/llm_retriever), [structured_prompting](file:///Users/qinjiahong/代码/LMOPS_miniLLM/structured_prompting) |
| LLM 蒸馏 / 对齐 | [minillm](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm)(你这次的重点), [dpkd](file:///Users/qinjiahong/代码/LMOPS_miniLLM/dpkd), [tuna](file:///Users/qinjiahong/代码/LMOPS_miniLLM/tuna) |
| 推理加速 | [llma](file:///Users/qinjiahong/代码/LMOPS_miniLLM/llma) |
| 领域定制 / 理解 | [adaptllm](file:///Users/qinjiahong/代码/LMOPS_miniLLM/adaptllm), [understand_icl](file:///Users/qinjiahong/代码/LMOPS_miniLLM/understand_icl) |
提醒:你本地目录命名是
LMOPS_miniLLM,说明你只对 MiniLLM 感兴趣,下面就专门讲它。
二、MiniLLM 是什么(一句话)
用大模型(teacher)去"教"小模型(student),但不是普通蒸馏,而是用强化学习思路最小化「反向 KL 散度」,让小模型学到大模型的「核心高概率行为」,而不是被低概率长尾分散注意力。
论文:MiniLLM: Knowledge Distillation of Large Language Models (ICLR 2024)
它适合的场景:你已经有一个大模型,想得到一个性能接近、但更小更快的版本。
三、minillm 目录结构速读
minillm/
├── README.md ← 必读,操作手册
├── install.sh ← 一键装环境
├── arguments.py ← 所有命令行参数定义
├── finetune.py ← SFT / KD baseline 训练入口
├── train_minillm.py ← MiniLLM(RL 蒸馏) 训练入口
├── evaluate.py / evaluate_main.py ← 评估脚本
├── generate.py ← 用模型生成回复
├── minillm/ ← MiniLLM 核心算法实现
│ ├── losses.py 反向 KL 损失
│ ├── reward.py 奖励函数(teacher 提供的 logp)
│ ├── trainer.py RL trainer
│ ├── sampler.py / pipelines.py
├── data_utils/ ← 数据加载
├── tools/ ← 数据处理 / 模型并行切分工具
├── scripts/ ← 各模型族的一键脚本 ★最常用
│ ├── gpt2/ opt/ llama/ llama2/ mistral/ qwen2.5/
│ │ └── sft/ kd/ seqkd/ minillm/ eval/ tools/
└── configs/ ← deepspeed 配置等
四、初学者推荐路径(GPT-2 最小可跑闭环)
⚠️ 硬件:原论文用 16×V100。但 GPT-2 base/medium 在一张消费级 GPU(≥16GB 显存)上完全可以跑。没有 GPU 别上手,纯 CPU 跑不动。
第 0 步:环境
cd /Users/qinjiahong/代码/LMOPS_miniLLM/minillm
bash install.sh
注意它装的是作者 fork 的 transformers 分支(t1101675/transformers@minillm),因为加了张量并行和 teacher-mixed sampling 的钩子。别在你日常环境里跑,建议新建 conda 环境:
conda create -n minillm python=3.10 -y
conda activate minillm
bash install.sh
第 1 步:下数据(用 HuggingFace 的预处理版,最省事)
huggingface-cli download MiniLLM/dolly-processed --repo-type dataset \
--local-dir ./processed_data/dolly/
Dolly 是 15k 条指令-回复数据,是 SFT 训练集。
第 2 步:下载模型权重
huggingface-cli download gpt2 --local-dir ./checkpoints/gpt2-base
huggingface-cli download gpt2-xl --local-dir ./checkpoints/gpt2-xlarge
gpt2-base(124M)= 学生模型gpt2-xl(1.5B)= 老师模型
第 3 步:先跑通 SFT(最简单)
bash scripts/gpt2/sft/sft_base.sh /Users/qinjiahong/代码/LMOPS_miniLLM/minillm
这一步产出"学生初始化模型"。建议先把这一步跑通,确认数据、环境、显存都没问题。
第 4 步:跑 MiniLLM 蒸馏(核心)
bash scripts/gpt2/minillm/train_base_xl.sh /Users/qinjiahong/代码/LMOPS_miniLLM/minillm
含义:用 gpt2-xl(teacher)蒸馏到 gpt2-base(student),算法看 [losses.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/minillm/losses.py) 和 [trainer.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/minillm/trainer.py)。
第 5 步:评估
bash scripts/gpt2/eval/run_eval.sh /Users/qinjiahong/代码/LMOPS_miniLLM/minillm
五、读源码的顺序建议
如果你想搞懂"它到底在干嘛",按这个顺序看:
- README.md — 全局视角
- arguments.py — 看清所有可调参数
- scripts/gpt2/minillm/train_base_xl.sh — 看一个具体训练任务长什么样(哪些参数、用了什么数据、teacher/student 怎么指定)
- train_minillm.py — 入口,从这里追下去
- minillm/trainer.py — 训练循环
- minillm/losses.py — 反向 KL 是怎么算的(核心创新点)
- minillm/reward.py — teacher 的 log-prob 怎么变成 reward
六、初学者常见坑提示
| 坑 | 怎么办 |
|---|---|
直接 pip install transformers 跑会报错 |
必须装作者那个 fork 分支(install.sh 里的第一行) |
| 想从 LLaMA 玩起 | LLaMA 需要申请 license 才能下,初学者从 GPT-2 开始 |
| 显存爆 | 先用 gpt2-base + gpt2-medium 当 teacher,别一上来用 xl |
| 多卡 / 张量并行 | GPT-2 系列用不上,跳过 tools/convert_mp.py |
| 没有 GPU | 这个项目就别玩了,去看 prompt_optimization 这种纯 prompt 类的子项目 |
需要我帮你做下面哪件事?
- 直接打开并讲解
train_minillm.py的入口逻辑 - 解读
losses.py里反向 KL 的数学和代码对应 - 写一份"在单张 GPU 上跑通最小 demo"的精简脚本
- 介绍同仓其他你可能感兴趣的子项目
下面这份是「论文实验 ↔ 仓库脚本」的全量映射 + 入门学习路径,按照算力门槛由低到高排序。你可以照着打勾推进。
一、先看清能复现什么(论文 ↔ 仓库脚本对照表)
📊 主实验(Table 1)——三大模型族 × 三种方法
| 模型族 | Teacher | Student | SFT | KD | SeqKD | MiniLLM |
|---|---|---|---|---|---|---|
| GPT-2 | 1.5B | 120M | [sft/sft_base.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/sft/sft_base.sh) |
[kd/kd_base.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/kd/kd_base.sh) |
[seqkd/seqkd_base.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/seqkd/seqkd_base.sh) |
[minillm/train_base_xl.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/minillm/train_base_xl.sh) |
| GPT-2 | 1.5B | 340M | sft_medium.sh |
kd_medium.sh |
seqkd_medium.sh |
train_medium_xl.sh |
| GPT-2 | 1.5B | 760M | sft_large.sh |
kd_large.sh |
seqkd_large.sh |
train_large_xl.sh |
| OPT | 13B | 1.3B / 2.7B / 6.7B | [opt/sft/](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/opt/sft) |
[opt/kd/](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/opt/kd) |
[opt/seqkd/](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/opt/seqkd) |
[opt/minillm/](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/opt/minillm) |
| LLaMA | 13B | 7B | [llama/sft/sft_7B.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/llama/sft/sft_7B.sh) |
[llama/kd/kd_7B_13B.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/llama/kd/kd_7B_13B.sh) |
[llama/seqkd/](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/llama/seqkd) |
[llama/minillm/train_7B_13B.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/llama/minillm/train_7B_13B.sh) |
| Qwen2.5(仓库新增,论文外) | 7B | 1.5B | [qwen2.5/sft/sft_1.5B.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/qwen2.5/sft/sft_1.5B.sh) |
— | — | [qwen2.5/minillm/train_1.5B_7B.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/qwen2.5/minillm/train_1.5B_7B.sh) |
🔬 分析与消融实验(论文 §3.3 + §3.4)
| 论文图/表 | 实验内容 | 对应脚本 / 操作 |
|---|---|---|
| Figure 5 Teacher Scaling Law | 固定 student=120M,换 teacher=340M/760M/1.5B | 改 train_base_xl.sh 里 TEACHER_CKPT 跑三遍 |
| Figure 6 Exposure Bias | ExAccErr 随生成长度变化 | [scripts/gpt2/eval/eval_exposure_bias.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/eval/eval_exposure_bias.sh) → [evaluate_exposure_bias.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/evaluate_exposure_bias.py) |
| Table 2 Calibration | SST2/BoolQ 上 ECE | 论文附录 B.2 给了 prompt,需要自己跑分类 eval(仓库没现成脚本) |
| Figure 7 不同长度回复表现 | 把 S-NI 按答案长度切 3 段 | [scripts/gpt2/eval/eval_main_sinst.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/eval/eval_main_sinst.sh)(默认评 [11,+∞],可改 --data-names 跑其他段) |
| Table 3 多样性 | distinct-4gram + LM loss | 跑 evaluate_main.py 后自行统计 |
| Table 4 三大策略消融 | 去掉 Length Norm / Teacher-Mixed / Single-Step | 复制 train_base_xl.sh 改 --length-norm / --teacher-mixed-alpha 0 / --single-step-reg 标志 |
| Table 7 是否加 LM loss | MiniLLM vs MiniLLM w/o L_PT | [train_base_xl.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/minillm/train_base_xl.sh) vs [train_base_xl_no_pt.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/minillm/train_base_xl_no_pt.sh) (直接有) |
| Figure 16 α 值的影响 | α ∈ [0, 1] 扫描 | 改 train_base_xl.sh 里 --teacher-mixed-alpha |
| Table 6 GPT-J 当 teacher | 跨族蒸馏 | 仓库无现成脚本,需仿照 OPT 配置 |
🛠 数据处理 / 工具脚本
| 脚本 | 作用 |
|---|---|
[tools/process_data_dolly.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/tools/process_data_dolly.sh) |
tokenize Dolly 训练/验证集 |
[tools/process_data_pretrain.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/tools/process_data_pretrain.sh) |
tokenize OpenWebText(用于 L_PT) |
[tools/generate_data_seqkd.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/tools/generate_data_seqkd.sh) |
用 teacher 生成伪数据(SeqKD 必需) |
[tools/process_pseudo_data_seqkd.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/tools/process_pseudo_data_seqkd.sh) |
tokenize SeqKD 伪数据 |
[tools/convert_mp.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/tools/convert_mp.py) |
改张量并行切分(OPT/LLaMA 大模型必备) |
二、入门学习路径(5 个 Level,由易到难)
🟢 Level 0 — 跑通环境与数据(半天)
目标:把"数据 + 模型"准备好,能加载、能跑前向。
- 新建 conda 环境,跑
bash install.sh - 下载 Dolly 处理后数据 + GPT-2 base/medium/xl 三个 checkpoint
- 用
generate.py跑一次 GPT-2-xl 的推理,确认能输出
⚠️ 跳过:OpenWebText 预训练语料(10GB+),先不下,做无 L_PT 版本就行。
🟢 Level 1 — 复现 SFT baseline(1 天,单卡 16GB)
目标:先把"不蒸馏"的基线打出来,作为后面对比的下限。
bash scripts/gpt2/sft/sft_base.sh /Users/qinjiahong/代码/LMOPS_miniLLM/minillm
bash scripts/gpt2/sft/sft_xlarge.sh /Users/qinjiahong/代码/LMOPS_miniLLM/minillm # teacher 也得 SFT
跑完用 run_eval.sh 评估 5 个数据集。记下 SFT 的 Rouge-L、GPT-4 分数。
入门最大收获:搞懂"训练 → 选 ckpt → 评估"完整管线。
🟡 Level 2 — 复现 KD / SeqKD baseline(半天)
目标:理解 forward-KL 派的两种经典做法。
bash scripts/gpt2/kd/kd_base.sh # word-level KD
bash scripts/gpt2/tools/generate_data_seqkd.sh # 用 teacher 造数据
bash scripts/gpt2/tools/process_pseudo_data_seqkd.sh
bash scripts/gpt2/seqkd/seqkd_base.sh # 在伪数据上 SFT
入门最大收获:搞懂"老师怎么参与训练"的两种范式(在线 logits vs 离线伪数据)。
🟡 Level 3 — 复现 MiniLLM 主实验(1–2 天)⭐ 核心
目标:复现论文 Table 1 的 GPT-2 行。
# 用 no_pt 版本,省得下 OpenWebText
bash scripts/gpt2/minillm/train_base_xl_no_pt.sh /Users/qinjiahong/代码/LMOPS_miniLLM/minillm
bash scripts/gpt2/eval/run_eval.sh /Users/qinjiahong/代码/LMOPS_miniLLM/minillm
跑完比较四组分数(SFT / KD / SeqKD / MiniLLM):
- 看是否 MiniLLM 在 SelfInst / VicunaEval / S-NI 上拉开差距 → 对应论文核心结论
- 看 Rouge-L 是否在某些子集上反超 teacher → exposure bias 的副产物
入门最大收获:亲手验证 reverse-KL + on-policy 的效果。
🟠 Level 4 — 分析与消融实验(按兴趣选做,每个半天)
按"价值/成本比"推荐这个顺序:
A. L_PT 消融(最简单,仓库直接有) ✅ 强烈推荐
bash scripts/gpt2/minillm/train_base_xl_no_pt.sh # 已经跑过
bash scripts/gpt2/minillm/train_base_xl.sh # 加 L_PT 版本
对比 → 复现 Table 7。
B. Exposure Bias(直接有脚本) ✅ 推荐
bash scripts/gpt2/eval/eval_exposure_bias.sh
对四个模型的 ckpt 都跑一次 → 复现 Figure 6。
C. Teacher Scaling Law
固定 student=120M,依次用 GPT-2 medium / large / xl 当 teacher 训三次 MiniLLM → 复现 Figure 5。
操作:复制
train_base_xl.sh三份,改TEACHER_CKPT路径。
D. 三大策略消融(论文 Table 4,最值得啃源码)
- 去 Length Norm:在脚本里删掉
--length-norm - 去 Teacher-Mixed:把
--teacher-mixed-alpha 0.2改成0 - 去 Single-Step:删掉
--single-step-reg(具体参数名以arguments.py为准)
⚠️ 这部分需要你先读懂 arguments.py 和 losses.py,否则不知道改什么。
E. α 扫描(Figure 16)
α ∈ {0.0, 0.1, 0.2, 0.3, 0.5, 1.0} 跑 6 次,画曲线。
F. 不同回复长度(Figure 7)
改 eval_main_sinst.sh 里的子集筛选逻辑,分别评 [0,5] / [6,10] / [11,+∞]。
🔴 Level 5 — 跨模型族扩展(视显卡而定)
目标:复现 OPT / LLaMA / Qwen2.5 行。
- 单卡 24GB(如 4090):能跑 OPT-1.3B、LLaMA-7B(开 LoRA)
→ [llama/minillm/train_7B_13B_lora.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/llama/minillm/train_7B_13B_lora.sh)
→ [llama/sft/sft_7B_lora.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/llama/sft/sft_7B_lora.sh) - 多卡 / A100:
- 模型并行:[
llama/sft/sft_7B_mp4.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/llama/sft/sft_7B_mp4.sh) - 多机:[
llama/sft/sft_7B_mn.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/llama/sft/sft_7B_mn.sh)
- 模型并行:[
- 新热度:跑 [
qwen2.5/minillm/train_1.5B_7B.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/qwen2.5/minillm/train_1.5B_7B.sh)(论文外,但是仓库新加,验证方法在新模型上仍 work)
三、按算力反查可做哪些(实用对照表)
| 你的硬件 | 可做范围 |
|---|---|
| CPU only | 只能读源码、跑 evaluate.py 加载小模型 |
| 单卡 8–12GB(如 3060) | Level 0–3 GPT-2 base/medium,跑得动主实验 |
| 单卡 16–24GB(4090/A5000) | + GPT-2 large、+ OPT-1.3B、+ LLaMA-7B LoRA |
| 2–4 张 24GB+ 卡 | + LLaMA-7B 全量 SFT、+ OPT-2.7B、+ Qwen2.5-1.5B |
| A100 ×8 | 全部论文实验 |
四、给你的入门 90 分钟最小闭环(建议今天就做)
如果你只有几小时,按这个顺序:
- (30min)
install.sh+ 下 GPT-2-base/medium/xl + Dolly processed 数据 - (30min)跑 [
scripts/gpt2/sft/sft_base.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/sft/sft_base.sh)(小数据集,几百步) - (20min)跑 [
scripts/gpt2/eval/eval_main_dolly.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/eval/eval_main_dolly.sh),看到第一个 Rouge-L 数字 → 管线已通 - (10min)打开 [
train_minillm.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/train_minillm.py) + [minillm/losses.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/minillm/losses.py),对照论文公式(5)(6)(7)找到三大策略的实现位置
之后你就可以挑 Level 3/4 里的任一实验展开。
需要我接下来帮你做哪一项?
- 帮你写一份单卡环境的最小可执行 train_base_xl_no_pt.sh(按你 GPU 显存调好 batch size)
- 把 [
losses.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/minillm/losses.py) 中的代码逐行对应到论文公式 (3)(5)(6)(7) - 列一张 [
arguments.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/arguments.py) 中"做消融需要改的所有参数"清单
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)