- 人工智能
- 大模型
- 模型优化
- 模型量化
- 模型压缩
【免费下载链接】Model-Optimizer
A 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.
本篇技术指南以 advanced_compression_experiments.md 为骨架,系统梳理 NVIDIA Model-Optimizer(ModelOpt)在 Minitron(同构剪枝)与 Puzzletron(异构 NAS 剪枝)两条压缩路径上的进阶实验结论:从蒸馏规模放大(WikiText → Nemotron-v2)到两种方法的串联组合,再到 Blockwise Local Distillation(BLD)与 Mamba-Transformer 混合架构的压缩探索。读完你将掌握:在不同压缩强度下如何选择与组合剪枝方法、蒸馏数据规模对精度恢复的影响规律、BLD 在激进压缩下为何能扭转方法排名,以及异构架构在混合模型上的适用边界。
0. 实验背景与方法速览
本文的所有实验均以Qwen3-8B(36 层、hidden size 4096、FFN intermediate 12288、GQA 32Q/8KV、约 8B 参数)为基准模型展开,与主教程保持同一套方法学:
- Minitron:同构(homogeneous)剪枝,基于重要性评分统一移除神经元/注意力头或整层,直接以参数量为压缩目标,输出标准同构模型。
- Puzzletron:基于神经架构搜索(NAS)+ 混合整数规划(MIP)的异构剪枝,逐层生成 FFN 宽度候选与"移除注意力"(
no_op)候选,以内存预算为硬约束求解最优逐层组合。
该进阶文档正是对主教程 Section 9 "Open Questions" 中提出的若干开放问题的实证回答,包括:蒸馏数据规模与质量的影响、Minitron 深度剪枝与 Puzzletron 宽度剪枝能否串联、如何缓解"剪枝后架构排名在蒸馏后翻转"的问题,以及异构搜索在非稠密架构(Mamba 混合)上的表现。
从源码确认两条路径的底层流程
ModelOpt 中 Puzzletron 的完整管线在 entrypoint.py 中按步骤落地:
- score_pruning_activations(分布式):校准数据上的激活重要性评分;
- pruning_ckpts(单进程):按评分剪枝并保存候选 checkpoint;
- build_library_and_stats(单进程):构建替换库(replacement library)与子块统计;
- calc_one_block_scores(分布式):对每个候选 block variant 打分;
- mip_and_realize_models(分布式):运行 MIP 求解并落地最终模型。
其中每个 Transformer 块的候选结构由 block_config.py 中的BlockConfig/AttentionConfig/FFNConfig描述:FFNConfig.intermediate_size控制 FFN 候选宽度,SubblockConfig.no_op表示整个子块被移除。MIP 求解的约束类型在 run_puzzle.py 的PuzzleConstraints._ALLOWED_HUMAN_CONSTRAINTS中定义,包括target_memory、target_throughput、target_latency_seconds、target_time_to_first_token、num_params与stats.has_attention——这正是进阶实验中"80% 内存目标""10B 参数量目标"等约束的直接来源。
1. 扩展蒸馏实验:WikiText vs. Nemotron-v2(80% 内存目标)
1.1 实验设计
主教程刻意采用最小蒸馏配置:100 次迭代的 WikiText-103(约 160 万 token)。本实验将其大幅放大:改用质量更高的Nemotron-Post-Training-Dataset-v2(约 19 亿 token,是前者的 1000 倍),在 Qwen3-8B 压缩至原始内存约 80% 的设定下对比两种蒸馏配方的恢复效果。
1.2 全基准结果
| Model | Params | Distillation | Tokens | MMLU | HellaSwag acc_norm | GSM8K flex |
|---|---|---|---|---|---|---|
| Original Qwen3-8B | 8B | — | — | 0.7493 | 0.7653 | 0.8749 |
| Puzzletron 80% | ||||||
| Puzzletron — pruned | 7.75B | — | — | 0.5910 | 0.6863 | 0.5762 |
| Puzzletron + WikiText | 7.75B | gbs=4, seq=4096, 100 iters | 1.6M | 0.6921 | 0.7390 | 0.7612 |
| Puzzletron + Nemotron-v2 | 7.75B | gbs=768, seq=8192, 300 iters | 1.9B | 0.7186 | 0.7381 | 0.8378 |
| Minitron 80% (36→28 layers) | ||||||
| Minitron — pruned | 6.65B | — | — | 0.5084 | 0.5295 | 0.0114 |
| Minitron + WikiText | 6.65B | gbs=4, seq=4096, 100 iters | 1.6M | 0.7302 | 0.6166 | 0.4761 |
| Minitron + Nemotron-v2 | 6.65B | gbs=768, seq=8192, 300 iters | 1.9B | 0.7394 | 0.6357 | 0.7453 |
1.3 关键结论
高质量蒸馏对两种方法都有增益,但收益分布不均。MMLU 上的提升相对温和(Puzzletron +2.65pp、Minitron +0.92pp),真正的回报体现在推理能力上:Puzzletron 的 GSM8K 提升 +7.66pp,Minitron 更是暴涨 +26.92pp。这强烈提示:更高品质的蒸馏数据能够不成比例地恢复推理能力。
"最小蒸馏的 Minitron" 依然能在 MMLU 上击败"千倍数据的 Puzzletron"。Minitron + WikiText(160 万 token)恢复到教师模型的 97.5%,而 Puzzletron 需要 1000 倍的计算量才能达到 95.9%。这说明在 MMLU 这类通用知识基准上,同构深度剪枝的恢复效率极高。
在推理基准(GSM8K)上,Puzzletron 无论何种蒸馏配方都保持领先。配合 Nemotron-v2 后,Puzzletron 保留了教师模型的 96.0%,而 Minitron 仅 85.4%。深度剪枝对推理链路的破坏可以被更好的蒸馏部分补偿,但异构剪枝在结构上更好地保留了推理结构。
蒸馏损失依然无法预测下游精度。Minitron 的最终损失(5.59e-1)比 Puzzletron + Nemotron-v2(5.63e-2)高约 10 倍,但 Minitron 在 MMLU 上反而得分更高——这与主教程 Section 6.3 的观察一致:KL 损失收敛不能作为任务精度的代理指标。
2. 方法串联:Minitron 深度剪枝 + Puzzletron 宽度剪枝
2.1 动机:Puzzletron 全层移除的评分缺陷
主教程将两种方法独立使用。本实验验证组合的可行性,其动机来自 Puzzletron 的一个已知局限:其独立 block 级评分在同时移除多个整层时,没有考虑层间依赖关系,导致层选择质量下降。
| Method | Layers dropped (1-indexed) | Pre-distill MMLU | Post-distill MMLU |
|---|---|---|---|
| Minitron (BI scoring) | L27–L34 | 0.5084 | 0.7302 |
| Puzzletron (Cosine Embedding Loss) | L3–L4, L8–L9, L15, L19, L21, L27 | 0.2949 | 0.4993 |
注意:为隔离深度剪枝行为,该 Puzzletron 运行被配置为只允许整层移除。
Minitron 的 Block Importance(BI)评分把待删除层集中在靠后的层(L27–L34),产出的模型明显更好;Puzzletron 的独立评分则散布在各处。这直接引出了链式思路:先用 Minitron 做深度剪枝,再用 Puzzletron 对存活层做异构宽度剪枝。
从源码看,这一组合在工具链层面是顺畅的:Puzzletron 的BlockConfig天然支持"存活层 + 逐层 FFN 宽度 / 注意力开关"的描述(见 block_config.py),而 Minitron 剪枝后的 checkpoint 可作为 Puzzletron 的输入模型继续走 entrypoint.py 的 NAS 管线。
2.2 中间步骤:Minitron 36→32L(约 90% 内存)
| Model | Params | Distillation | Tokens | MMLU | HellaSwag acc_norm | GSM8K flex |
|---|---|---|---|---|---|---|
| Qwen3-8B (teacher) | 8.19B | — | — | 0.7493 | 0.7653 | 0.8749 |
| Minitron 36→32L — pruned | 7.42B | — | — | 0.7396 | 0.6671 | 0.2873 |
| Minitron 36→32L + WikiText | 7.42B | gbs=4, seq=4096, 100 iters | 1.6M | 0.7421 | 0.6987 | 0.7604 |
关键发现:Minitron 深度剪枝在零蒸馏下保留了 98.7% 的 MMLU(0.7396),印证被删的 4 个深层对通用知识贡献很小;GSM8K 则从 0.2873 暴跌,但最小蒸馏即可恢复到 0.7604。
2.3 80% 内存目标:三种路径对比
| Model | Params | Distillation | Tokens | MMLU | HellaSwag acc_norm | GSM8K flex |
|---|---|---|---|---|---|---|
| Qwen3-8B (teacher) | 8.19B | — | — | 0.7493 | 0.7653 | 0.8749 |
| Chained: Minitron 36→32L + Puzzletron | ||||||
| Pruned | 7.42B | — | — | 0.6674 | 0.6698 | 0.6331 |
| + WikiText | 7.42B | gbs=4, seq=4096, 100 iters | 1.6M | 0.7074 | 0.6874 | 0.7081 |
| + Nemotron-v2 | 7.42B | gbs=768, seq=8192, 300 iters | 1.9B | 0.7332 | 0.7126 | 0.8499 |
| Puzzletron only | ||||||
| Pruned | 7.75B | — | — | 0.5910 | 0.6863 | 0.5762 |
| + WikiText | 7.75B | gbs=4, seq=4096, 100 iters | 1.6M | 0.6921 | 0.7390 | 0.7612 |
| + Nemotron-v2 | 7.75B | gbs=768, seq=8192, 300 iters | 1.9B | 0.7186 | 0.7381 | 0.8378 |
| Minitron depth only (36→28L) | ||||||
| Pruned | 6.65B | — | — | 0.5084 | 0.5295 | 0.0114 |
| + WikiText | 6.65B | gbs=4, seq=4096, 100 iters | 1.6M | 0.7302 | 0.6166 | 0.4761 |
| + Nemotron-v2 | 6.65B | gbs=768, seq=8192, 300 iters | 1.9B | 0.7394 | 0.6357 | 0.7453 |
2.4 关键结论
链式组合在扩展蒸馏下给出最均衡的结果。配合 Nemotron-v2 后,Minitron+Puzzletron 取得 MMLU 0.7332、HellaSwag 0.7126、GSM8K 0.8499。没有任何单一方法能匹配这种平衡:Minitron 单独在 MMLU 领先(0.7394)但 HellaSwag(0.6357)与 GSM8K(0.7453)落后;Puzzletron 单独在 HellaSwag 领先(0.7381)但 MMLU 落后(0.7186)。
串联充分发挥了各自所长。Minitron 干净利落地完成深度剪枝(BI 评分准确定位应删的深层),Puzzletron 再对存活的 32 层做逐层"外科手术式"宽度优化——既保留通用知识,又比任一方法单独使用更好地保留了推理能力。
链式方案的蒸馏前质量远高于单方法。未蒸馏前链式模型 MMLU 即达 0.6674,明显高于 Puzzletron 单独的 0.5910 和 Minitron 单独的 0.5084,为后续蒸馏提供了更好的结构起点。
结论:在 Qwen3-8B 上瞄准 80% 内存目标时,先用 Minitron 深度剪枝约 10%(36→32L)、再用 Puzzletron 宽度剪枝约 10%,最后以 Nemotron-v2 做扩展蒸馏,是所有测试基准上最均衡的取舍。
3. Blockwise Local Distillation(BLD)
3.1 原理:为什么"局部可恢复性"比"即时替换质量"更重要
主教程 Section 6.4 已经观察到:蒸馏前最优的架构,蒸馏后不一定恢复得最好。BLD(bypass)正是针对此问题的改进——在 MIP 组装之前局部训练各 block 变体,使搜索更偏好"蒸馏后能良好恢复"的块,而不是"作为即时替换看起来不错"的块。
源码层面,pruning_ckpts.py 已引入from ..tools.bypassed_training import init_child_from_parent,说明 bypass 训练机制在 Puzzletron 管线中已有实现雏形。文档同时注明:改进后的 bypass 功能将在未来版本合入main分支。
3.2 中等压缩(7B 目标):边际影响
在 Scenario 1 设定(Qwen3-8B → 7B)下,BLD 应用于被剪到原中间尺寸 50% 以下的 FFN 子块变体:
| Model | Parameters | MMLU (pruned) | MMLU (distilled) | % of Teacher |
|---|---|---|---|---|
| Minitron 7B | 6.96B | 0.7038 | 0.7166 | 95.6% |
| Puzzletron 7B | 6.99B | 0.6621 | 0.6823 | 91.1% |
| Puzzletron 7B + BLD | 6.99B | 0.6696 | 0.6867 | 91.6% |
BLD 相对标准 Puzzletron 仅有 +0.44pp 的蒸馏后提升,且 MIP 选择了非常相似的架构。在此压缩强度下收益不足以抵偿额外复杂度,Minitron 仍在 MMLU 上大幅领先。
3.3 激进压缩(80% 内存目标):显著影响
内存优化下反复出现的模式是:MIP 求解器会从许多层移除完整注意力块(因为 KV cache 主导内存),这使得这些"无注意力"变体的 FFN 部分变得关键——这正是 BLD 最能发挥作用的场景。此处 BLD 被应用于训练丢弃注意力(no_op)的 block 变体中的 FFN 部分。
蒸馏后结果(教师模型百分比,WikiText 蒸馏):
| Benchmark | Puzzletron 80% | Puzzletron 80% + BLD | Minitron 80% |
|---|---|---|---|
| MMLU | 92.4% | 98.0% | 97.5% |
| HellaSwag acc_norm | 96.6% | 95.6% | 80.6% |
| GSM8K flex | 87.0% | 92.0% | 54.4% |
完整结果:
| Model | MMLU (pruned) | MMLU (distilled) | HellaSwag acc_norm (pruned) | HellaSwag acc_norm (distilled) | GSM8K flex (pruned) | GSM8K flex (distilled) |
|---|---|---|---|---|---|---|
| Qwen3-8B (teacher) | 0.7493 | — | 0.7653 | — | 0.8749 | — |
| Puzzletron 80% | 0.5910 | 0.6921 | 0.6863 | 0.7390 | 0.5762 | 0.7612 |
| Puzzletron 80% + BLD | 0.7277 | 0.7341 | 0.7097 | 0.7317 | 0.7331 | 0.8044 |
| Minitron 80% | 0.5084 | 0.7302 | 0.5295 | 0.6166 | 0.0114 | 0.4761 |
3.4 关键结论
BLD 在这个压缩强度下彻底改写了 Puzzletron 的成绩。蒸馏前 MMLU 从 0.5910 跃升至 0.7277;WikiText 蒸馏后达到 0.7341,同时超越标准 Puzzletron(0.6921)与 Minitron(0.7302)——直接翻转了 Puzzletron vs. Minitron 在 MMLU 上的排名(无 BLD 时 Minitron 领先)。所有基准均有提升,GSM8K 增益尤其显著(0.8044 vs. 0.7612)。
与中等压缩下的"微乎其微"形成鲜明对比:在激进压缩下,BLD 显著改变了 MIP 选出的架构以及最终模型质量。这也从机制上解释了原因——当大量注意力块被移除后,FFN 的局部可蒸馏性直接决定了最终精度,而这正是 BLD 局部训练所优化的对象。
未来工作:改进后的 bypass 功能将在未来版本合入
main分支。
4. 超越稠密 Transformer:压缩 Mamba-Transformer 混合模型
4.1 实验设定
此前所有实验均基于稠密纯 Transformer 的 Qwen3-8B。本实验将两种方法应用于Nemotron-Nano-12B-v2——一个Mamba-Transformer 混合模型:12.3B 参数、62 层(Mamba 块与注意力块交替排列)。该探索处于早期阶段,仅报告蒸馏前的 MMLU结果。对应配置可参考 examples/puzzletron/configs/nemotron-nano-12b-v2/ 下的 YAML。
4.2 结果
| Model | MMLU | % of Teacher |
|---|---|---|
| Nemotron-Nano-12B-v2 (baseline, 49k MiB) | 78.6 | 100% |
| ~10B parameter target | ||
| Minitron 10B | 73.7 | 93.8% |
| Puzzletron 10B | 48.9 | 62.2% |
| ~34k MiB memory target | ||
| Minitron 34k | 51.8 | 65.9% |
| Puzzletron 34k | 54.3 | 69.1% |
4.3 观察
Puzzletron 从不移除 Mamba 块。在所有 Puzzletron 运行(10B 与 34k MiB 目标)中,每个 Mamba 块都被完整保留:MIP 求解器只针对注意力块和 FFN 层进行剪枝。这说明移除单个 Mamba 块对模型质量而言代价过高。
中等压缩(约 10B)下 Minitron 占据主导。Minitron 保留了教师 93.8% 的 MMLU,Puzzletron 仅 62.2%——与 Qwen3-8B 上"中等压缩 Minitron 胜出"的模式一致,但差距大得多。
激进压缩(约 34k MiB)下 Puzzletron 小幅领先。Puzzletron 以 54.3 vs. 51.8 的 MMLU 略胜,与 Qwen3-8B 上观察到的模式类似。
混合架构给 Puzzletron 带来独特挑战。在稠密 Transformer 上,Puzzletron 的优势是逐层异构优化;而在混合模型上,Mamba 块实际上被冻结——Puzzletron 只能优化模型中注意力/FFN 的那一半,有效搜索空间被大幅压缩。这可能解释了为何在中等压缩强度下,Minitron 更简单的统一式方法反而胜出。
从BlockConfig的设计看,这一现象在源码层面有其依据:block_config.py 的AttentionConfig支持mamba: Optional[MambaConfig]字段,Mamba 子块与标准注意力同属 attention 槽位,而no_op校验逻辑(assert not self.is_mamba)在no_op=True时会拒绝移除 Mamba 块,与实验结果"Mamba 块被完整保留"完全一致。
5. 综合启示与实践建议
将四个实验合并来看,可以得出对 ModelOpt 剪枝实践有直接指导意义的规律:
- 按压缩强度选方法:中等压缩(<20%)优先 Minitron(简单、同构、通用知识恢复高效);激进压缩(>20%,尤其硬内存预算)优先 Puzzletron(逐层异构优化保住推理结构);介于两者之间的压缩带(约 20%–38%)是排名交叉区,需要按目标基准实测。
- 按目标能力选方法:偏重通用知识(MMLU 类)时 Minitron 往往占优;偏重推理(GSM8K、HellaSwag 类)时 Puzzletron 的结构保留优势更明显。
- 串联 > 单打:在 80% 内存这类激进目标上,"Minitron 深度剪枝 + Puzzletron 宽度剪枝 + Nemotron-v2 扩展蒸馏"取得最均衡的多基准表现。
- 蒸馏数据质量至关重要:Nemotron-v2 级数据能不成比例地恢复推理能力(GSM8K +7.66pp 至 +26.92pp),而 MMLU 增益相对有限;蒸馏损失不预测下游精度。
- BLD 只在激进压缩下物有所值:当 MIP 大量移除注意力块、FFN 成为精度关键时,局部蒸馏能显著改善架构选择并翻转方法排名;中等压缩下收益可忽略。
- 混合架构限制异构搜索:Mamba-Transformer 混合模型上 Puzzletron 的搜索空间被压缩到注意力/FFN 一半,Minitron 在中度压缩下反而更合适。
复现入口
所有实验结果均可在仓库中复现与深入:
- 主教程与全部实验设定:examples/pruning/minitron_vs_puzzletron/README.md,配套四个 Notebook(00_prerequisites.ipynb、scenario1_minitron.ipynb、scenario1_puzzletron.ipynb、scenario2_minitron.ipynb、scenario2_puzzletron.ipynb);
- Puzzletron 算法端到端教程(含内存/运行时约束、MIP sweep 模式、vLLM AnyModel 部署):examples/puzzletron/README.md 及其 Qwen3-8B 配置、Nemotron-Nano-12B-v2 配置;
- 核心实现:pipeline 入口、block 配置模型、MIP 约束与求解、MIP sweep 模式、剪枝与 bypass 训练衔接;
- 蒸馏环节可参考 Megatron-Bridge 的蒸馏说明:examples/megatron_bridge/README.md。
说明:文档中所有结论均基于 Qwen3-8B(单一模型)与 Nemotron-Nano-12B-v2(单一混合模型)在特定蒸馏配方下的实验,跨模型泛化仍需谨慎;文中引用的模型与数据集(WikiText-103、Nemotron-Post-Training-Dataset-v2、Nemotron-Nano-12B-v2、Qwen3-8B)均可通过 Hugging Face Hub 获取,按各自许可协议使用。
- 人工智能
- 大模型
- 模型优化
- 模型量化
- 模型压缩
【免费下载链接】Model-Optimizer
A 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.
相关推荐
AndroidTVLauncher性能优化技巧:提升TV启动器响应速度的10个方法
AndroidTVLauncher性能优化技巧:提升TV启动器响应速度的10个方法 AndroidTVLauncher是一款基于leanback风格的轻量级电视
移动开发Ryujinx用户界面架构:Avalonia框架在模拟器中的应用
Ryujinx用户界面架构:Avalonia框架在模拟器中的应用 Ryujinx作为一款用C 编写的Nintendo Switch模拟器,其用户界面采用Aval
游戏开发图形学XbsjEarthUI自定义着色器:高级三维渲染技术解析
XbsjEarthUI自定义着色器:高级三维渲染技术解析 想要为三维GIS/BIM应用添加炫酷的视觉效果吗?XbsjEarthUI的自定义着色器功能正是实现这一
前端UI组件GIS3D渲染
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考