Minitron剪枝工作流:Model Optimizer把LLM参数量砍掉40%的全流程
【免费下载链接】Model-OptimizerA unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks like TensorRT-LLM, TensorRT, vLLM, etc. to optimize inference speed.项目地址: https://gitcode.com/GitHub_Trending/te/Model-Optimizer
Model Optimizer(Model-Optimizer)是 NVIDIA 开源的统一模型优化工具库,把量化、蒸馏、剪枝、神经架构搜索、投机解码等 SOTA 压缩技术集于一身,用于压缩深度学习模型并加速在 TensorRT-LLM、vLLM 等推理框架上的部署。其中,Minitron 剪枝是压缩 LLM 的"杀手锏":它按激活重要性把 LLM 的层数、隐层宽度、FFN 宽度、注意力头、MoE 专家数逐维度砍掉(默认搜索空间允许每个宽度维度最多削减 40%),再用知识蒸馏把损失的能力找回来。本文将带你完整走一遍「剪枝 → 蒸馏 → 量化 → 部署」的全流程,并附官方复现数据。
Minitron 剪枝是什么?一分钟看懂原理
剪枝(Pruning)是移除神经网络中冗余参数以减小模型体积的结构性压缩技术。Minitron 的核心思路只有四步:
- 重要性打分:在校准数据(约 512–1024 条样本)上跑前向,统计每个神经元/注意力头/层的激活幅值(8B 模型约 5 分钟);
- 排序:在每个剪枝维度内(所有隐层维度、所有注意力头等)按重要性排序;
- 剪枝:移除最不重要的参数,直到满足目标尺寸;
- 权重切片:所有层统一剪到相同结构(同质剪枝),得到可直接用标准方式保存/加载的小模型。
Minitron 支持两种模式(详见 examples/pruning/README.md):
| 模式 | 你指定什么 | 适合场景 |
|---|---|---|
| 手动剪枝 | 各维度目标尺寸,如hidden_size=3584 | 明确知道要压到多大、或导出 Top-K 架构做候选 |
| NAS 自动剪枝 | 目标参数量,如params=6e9 | 不知道具体尺寸,让算法在搜索空间里自动找最优架构 |
自动模式下,算法会在「宽度最多剪 40%、深度最多剪 20%」的约束内生成上万种候选架构,用打分函数(如 MMLU)评估 Top-K 个候选,选出得分最高的子网再切权重——这就是标题里"砍掉 40%"的由来。
全流程一览:数据准备 → 剪枝 → 蒸馏 → 评估 → 量化 → 部署
官方示例以Nemotron-Nano-9B-v2 从 9B 剪到 7B为最小示例(examples/pruning/minitron/NVIDIA-Nemotron-Nano-9B-v2/README.md),以Nemotron-3-Nano-30B-A3B 从 31.6B 剪到 22B/A3.0B为进阶示例(examples/megatron_bridge/tutorials/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16/README.md)。两条路径的步骤完全一致:
第 1 步:准备蒸馏数据
蒸馏质量决定剪枝后的恢复上限。官方推荐的数据配方是30% 预训练数据 + 70% 后训练数据(数学、代码、科学、指令跟随各占一定权重)。数据集先按官方流程做 tokenize 与配比混合,完整命令见 examples/dataset/MEGATRON_DATA_PREP.md。新手没有自己的语料时,可直接使用官方推荐的 Nemotron 系列数据集。
第 2 步:一条命令完成 Minitron 剪枝
剪枝脚本是 examples/megatron_bridge/prune_minitron.py,在 8×H100 单节点上约 1 小时跑完 9B 模型:
torchrun --nproc_per_node 8 prune_minitron.py \ --hf_model_name_or_path nvidia/NVIDIA-Nemotron-Nano-9B-v2 \ --prune_target_params 7e9 \ --hparams_to_skip num_attention_heads \ --seq_length 8192 \ --output_hf_path /path/to/Pruned-7B常用参数速查:
--prune_target_params:目标总参数量(如7e9= 压到 7B);--prune_target_active_params:MoE 模型专用,按激活参数约束(MoE 推理成本取决于激活参数);--prune_score_func:候选架构打分函数,默认用 10% 采样的 MMLU;--hparams_to_skip:跳过难恢复的维度(官方实践中普遍跳过num_attention_heads);--max_width_pruning / --max_depth_pruning:宽度/深度剪枝上限,默认 0.40 / 0.20。
运行日志会打印 Top-10 候选架构及得分,例如 9B→7B 实验中最终胜出的是num_layers=48, hidden_size=4352, mamba_num_heads=120, mamba_head_dim=80, ffn_hidden_size=13824。输出的就是一个标准 HuggingFace 检查点,可以直接进入下一步。
Qwen3-8B 上 Minitron 与异构剪枝 Puzzletron 的「剪枝 + 蒸馏」MMLU 对比结果如下(剪枝前模型几乎不可用,蒸馏后大幅恢复):
第 3 步:知识蒸馏找回精度(关键一步)
剪完即用的模型基本"失忆":9B 剪到 7B 后未经蒸馏的平均基准分只有 18.4。必须用原始模型当教师做知识蒸馏,脚本是 examples/megatron_bridge/distill.py:
torchrun --nproc_per_node 8 distill.py \ --teacher_hf_path nvidia/NVIDIA-Nemotron-Nano-9B-v2 \ --student_hf_path /path/to/Pruned-7B \ --seq_length 8192 --gbs 768 --train_iters 16000 \ --lr 1e-4 --min_lr 1e-5官方推荐的蒸馏超参数(来自 examples/pruning/README.md 的 Pruning Guidelines):
| 超参数 | 建议值 |
|---|---|
| 序列长度 | 8192(数据集序列短则用 4096) |
| 全局 Batch Size | 与原训练一致,或 768 |
| 学习率 | 1e-4 → 1e-5 线性衰减(压缩率越高,起点越高) |
| 训练量 | 80–100B tokens 效果最佳 |
| 数据配比 | 标准模型 100% 预训练;推理模型 70% 推理数据 + 30% 预训练 |
💡 经验法则:若知道原训练的最大学习率,压缩约 50% 时用它的1/5作为蒸馏起点。
蒸馏过程中各基准分数的恢复曲线(9B→7B,横轴为训练 token 数):
可以看到 2.5B tokens 时大部分能力已恢复,80B tokens 后 7B 模型在 GPQA、IFEval 上甚至反超官方 9B 模型——这得益于 12B→9B→7B 的迭代剪枝策略(每次压 25% 左右)。蒸馏损失曲线同样平稳下降,Minitron 子网与 Puzzletron 子网都能稳定收敛:
第 4 步:评估 + FP8 量化叠加
恢复精度后用 NeMo Evaluator 跑 MMLU、MMLU Pro、GPQA、LiveCodeBench、AIME 等基准(配置文件见 nemo_evaluator.yaml)。
Model Optimizer 的一大亮点是技术可叠加:剪枝蒸馏完成后,再用 examples/hf_ptq/hf_ptq.py 做 FP8 量化,一行命令完成校准与导出:
python hf_ptq.py --pyt_ckpt_path <蒸馏后检查点> \ --export_path <输出路径> --qformat fp8 --trust_remote_code第 5 步:部署到 vLLM / TensorRT-LLM
量化后的检查点可直接被 vLLM、TensorRT-LLM、SGLang 加载。在单张 H100 上(输入 32K/输出 1K)的实测吞吐:
| 检查点 | 显存占用 | 输出 tokens/s | 相对原版加速 |
|---|---|---|---|
| Nemotron-3-Nano-30B-A3B-BF16(官方) | 58.9 GiB | 598 | 1.0× |
| 剪枝后 22B/A3.0B-BF16 | 41.5 GiB | 1,190 | 2.0× |
| 剪枝 22B + FP8 | 22.8 GiB | 1,576 | 2.6× |
剪枝(-30% 参数)与 FP8 量化叠加后,30B MoE 模型实现2.6× 吞吐加速 + 2.6× 显存下降,且基准分仅比官方 30B 低 1.6 分(70.5 vs 72.1):
新手实践清单:剪枝比例与常见坑
官方 Pruning Guidelines(examples/pruning/README.md)总结的核心经验:
- 深度 vs 宽度:深度剪枝(减层数)配置最简单、固定参数下推理更快;宽度剪枝(减 hidden/FFN)同参数下精度更好。追求最优效果时两者结合,但调参成本更高;
- 超过 1/3 的压缩是安全区:剪掉 1/3 以内 + 高质量数据(80–100B tokens)蒸馏,通常能得到延迟-精度帕累托前沿上的模型;
- 压缩 >50% 请迭代剪枝:先压 30% → 蒸馏 → 再压 30% → 再蒸馏,一次压太多很难恢复;
- FFN 比 hidden 更好剪:MLP 维度(
ffn_hidden_size)可以比嵌入维度和注意力维度剪得更激进; - 注意力头跳过剪:官方复现中普遍
--hparams_to_skip num_attention_heads,因为注意力头剪枝最难恢复; - 蒸馏后还要后训练:若需要推理能力,蒸馏后追加指令微调/偏好对齐(如 Nemotron-Post-Training-Dataset-v2)。
完整资料索引
想动手复现,建议按以下顺序阅读仓库中的文件:
- examples/pruning/README.md — 剪枝总览:Minitron / Puzzletron / FastNAS 三种算法、支持矩阵与调参指南;
- examples/pruning/minitron/NVIDIA-Nemotron-Nano-9B-v2/README.md — 9B→7B 完整端到端教程(数据、剪枝、蒸馏、评估、量化、vLLM 压测);
- examples/megatron_bridge/README.md — Megatron-Bridge 框架下的剪枝与蒸馏操作手册(含多机 Slurm 用法);
- examples/pruning/minitron_vs_puzzletron/README.md — Minitron 与 Puzzletron 的场景选型与对比实验;
- examples/dataset/MEGATRON_DATA_PREP.md — 蒸馏数据 tokenize 与配比准备;
- modelopt/torch/prune/ — 剪枝算法源码实现;
- docs/source/guides/3_pruning.rst — 官方剪枝 API 文档。
环境方面,剪枝 LLM 建议直接使用 NeMo 容器(nvcr.io/nvidia/nemo:26.08)并挂载 Model-Optimizer 仓库运行,避免手工安装 Megatron 全家桶依赖。剪枝后如果还想进一步压显存,记得 Model Optimizer 的量化、QAT(量化感知蒸馏)、稀疏化都能在同一套工作流里无缝叠加——这就是"统一压缩库"的价值所在。
【免费下载链接】Model-OptimizerA unified library of SOTA model optimization techniques like quantization, distillation, pruning, neural architecture search, speculative decoding, etc. It compresses deep learning models for downstream deployment frameworks like TensorRT-LLM, TensorRT, vLLM, etc. to optimize inference speed.项目地址: https://gitcode.com/GitHub_Trending/te/Model-Optimizer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考