文章目录

下面我为你做一份「初学者上手指南」。先看仓库整体,再聚焦你最关心的 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

五、读源码的顺序建议

如果你想搞懂"它到底在干嘛",按这个顺序看:

  1. README.md — 全局视角
  2. arguments.py — 看清所有可调参数
  3. scripts/gpt2/minillm/train_base_xl.sh — 看一个具体训练任务长什么样(哪些参数、用了什么数据、teacher/student 怎么指定)
  4. train_minillm.py — 入口,从这里追下去
  5. minillm/trainer.py — 训练循环
  6. minillm/losses.py — 反向 KL 是怎么算的(核心创新点)
  7. 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 类的子项目

需要我帮你做下面哪件事?

  1. 直接打开并讲解 train_minillm.py 的入口逻辑
  2. 解读 losses.py 里反向 KL 的数学和代码对应
  3. 写一份"在单张 GPU 上跑通最小 demo"的精简脚本
  4. 介绍同仓其他你可能感兴趣的子项目

下面这份是「论文实验 ↔ 仓库脚本」的全量映射 + 入门学习路径,按照算力门槛由低到高排序。你可以照着打勾推进。


一、先看清能复现什么(论文 ↔ 仓库脚本对照表)

📊 主实验(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.shTEACHER_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 — 跑通环境与数据(半天)

目标:把"数据 + 模型"准备好,能加载、能跑前向。

  1. 新建 conda 环境,跑 bash install.sh
  2. 下载 Dolly 处理后数据 + GPT-2 base/medium/xl 三个 checkpoint
  3. 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.pylosses.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 分钟最小闭环(建议今天就做)

如果你只有几小时,按这个顺序:

  1. (30min)install.sh + 下 GPT-2-base/medium/xl + Dolly processed 数据
  2. (30min)跑 [scripts/gpt2/sft/sft_base.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/sft/sft_base.sh)(小数据集,几百步)
  3. (20min)跑 [scripts/gpt2/eval/eval_main_dolly.sh](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/scripts/gpt2/eval/eval_main_dolly.sh),看到第一个 Rouge-L 数字 → 管线已通
  4. (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 里的任一实验展开。


需要我接下来帮你做哪一项?

  1. 帮你写一份单卡环境的最小可执行 train_base_xl_no_pt.sh(按你 GPU 显存调好 batch size)
  2. 把 [losses.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/minillm/losses.py) 中的代码逐行对应到论文公式 (3)(5)(6)(7)
  3. 列一张 [arguments.py](file:///Users/qinjiahong/代码/LMOPS_miniLLM/minillm/arguments.py) 中"做消融需要改的所有参数"清单
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐