Puzzletron算法揭秘:Model Optimizer如何为LLM/VLM做异构剪枝与NAS
【免费下载链接】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
Puzzletron 是 NVIDIA Model Optimizer 内置的实验性模型压缩算法,基于神经架构搜索(NAS)为 LLM/VLM 做异构剪枝:它逐层评估 FFN 宽度缩减、注意力移除等候选方案,再用混合整数规划(MIP)在内存/延迟预算下拼出精度最优的"每层结构都不同"的模型,最后通过知识蒸馏找回损失。
🧩 它解决什么问题:从"一刀切"到"外科手术"
传统剪枝(如 Minitron)是同质剪枝——所有层统一减宽、统一删层,产出的模型结构标准、部署方便,但压缩一激进就容易把关键推理通路剪没。
Puzzletron 反过来:每一层都可以有自己的结构。有的层保留完整注意力,有的层直接删掉注意力;FFN 宽度从原始的 14336 到 3072 不等。这种"外科手术式"压缩在 >30% 的激进压缩下能显著保住精度,代价是产出的是异构架构,需要 vLLM 的 AnyModel 后端来部署。
理论关系:Minitron 是 Puzzletron 的特例——任何 Minitron 能产出的架构,Puzzletron 在足够大的搜索空间里也都能找到。区别在于搜索粒度和优化目标(Puzzletron 可以直接以内存预算为硬约束)。
⚙️ 8步自动化流水线:一次命令跑完 NAS
整条流水线由 examples/puzzletron/main.py 驱动,核心实现在 modelopt/torch/puzzletron/puzzletron_nas_plugin.py。一次完整运行包含 8 个阶段:
| 阶段 | 内容 | 执行方式 |
|---|---|---|
| 1 | 启动 Puzzletron 流水线 | - |
| 2 | HF 模型转换为 Puzzletron(AnyModel)格式 | 单卡 |
| 3 | 剪枝打分:用激活钩子评估各通道/注意力贡献 | 多卡 |
| 4 | 执行剪枝并保存各候选检查点 | 单卡 |
| 5 | 构建替换库(每层的候选块)+ 子块统计 | 单卡 |
| 6 | 计算单块得分(精度损失量化) | 多卡 |
| 7 | 运行 MIP 求解器并"拼装"出目标模型 | 多卡 |
| 8 | 流水线完成,输出逐层架构与评估指标 | 多卡 |
其中第 3、4 步的打分逻辑见 modelopt/torch/puzzletron/pruning/ 目录:FFN 中间维度剪枝(ffn_intermediate_pruning_mixin.py)、KV 头剪枝、MoE 专家移除等均以 Mixin 形式注册,配合激活钩子完成重要性评分。
🔍 MIP 优化:把"选结构"变成数学规划
MIP 求解入口在 modelopt/torch/puzzletron/mip/run_puzzle.py。它拿到每个层的候选块清单及其"质量/成本"分数后,求解一个混合整数规划问题:在满足约束的前提下,让总精度损失最小。
支持的约束很直白(配置在 YAML 的human_constraints里):
target_memory:显存预算(MiB)num_params:参数量上限target_latency_seconds:端到端延迟上限(需开启 runtime 统计,通过 vLLM 实测)target_throughput、stats.has_attention等
以 llama-3_1-8B_pruneffn_memory.yaml 为例,只需指定三样东西:
mip: human_constraints: target_memory: 78_000 # 78 GiB 显存预算 pruning: intermediate_size_list: [3072, 5888, 8704, 11520] # 候选 FFN 宽度求解后的输出是逐层架构清单,例如中间 12 层注意力被置为no_op(直接删掉),其余层保留gqa_4,FFN 保持或收窄——模型因此从 113 GiB 降到 75.8 GiB。
两个省时技巧:
--mip-only模式:剪枝和打分完成后,改约束(比如把target_memory从 78000 改成 96000)只需重跑 MIP,不用重新做昂贵的打分;- MIP 扫描模式:在配置里开启
sweep.enabled: true并给出一组压缩率,一次跑出完整的"精度-内存"权衡曲线,结果导出为 CSV 并绘图(即文首那张图)。
📊 实战效果:Qwen3-8B 与 Llama-3.1-8B 的公开数据
官方对比指南(examples/pruning/minitron_vs_puzzletron/README.md)在 Qwen3-8B 上的关键结论:
| 压缩目标 | 方法 | 蒸馏后 MMLU(相对教师) |
|---|---|---|
| ~14% 参数(7B) | Minitron | 95.6%✅ |
| ~14% 参数(7B) | Puzzletron | 91.1% |
| ~38% 内存(78k MiB) | Puzzletron | 74.9%✅ |
| ~38% 内存(78k MiB) | Minitron | 61.7% |
一句话决策规则:温和压缩(<20%)选 Minitron,激进压缩或有硬内存/延迟预算选 Puzzletron。两者交叉点大约在 20%~38% 压缩区间,可参考完整的内存扫描实验图:
📉 蒸馏:不是可选项,是精度恢复的必选项
剪枝后的模型"失忆"程度与压缩强度正相关:温和压缩只掉几个点,但 38% 压缩下 MMLU 会掉到接近随机猜测(25% 基线附近)。知识蒸馏(教师 logits + KL 散度损失)把 Qwen3-8B 剪枝模型拉回+28.6 个百分点,仅用 WikiText-103 跑 100 次迭代就实现。
一个有意思的观察:蒸馏前 Puzzletron 在 80% 内存档位领先 Minitron +8.3pp,蒸馏后却被反超 +3.8pp——蒸馏前的架构排名不保证蒸馏后成立,官方提到的 Blockwise Local Distillation(BLD)正是为此准备的改进方向。蒸馏流程本身基于 Megatron-Bridge,参考 examples/megatron_bridge/README.md。
🚀 部署到 vLLM 并实测加速
Puzzletron 产出的是标准 HuggingFace 检查点,但需要 vLLM 的AnyModel后端来加载异构架构(部署步骤见 examples/puzzletron/README.md 的 "Deploy compressed model in vLLM" 一节,另见 examples/puzzletron/evaluation/ 的评估脚本)。
在单张 H200 上的推理基准(并发 64):
| 模型 | 吞吐量 (tok/s) | 相对基线 |
|---|---|---|
| Qwen3-8B 基线 | 218.9 | - |
| Puzzletron 78k(压缩38%) | 370.5 | +69% |
同时别忘了"压缩组合拳":剪枝减架构、量化(FP8/NVFP4)减精度,二者互补,可叠加使用。
🗂️ 支持模型与上手路径
已内置的模型支持(见 examples/puzzletron/configs/):Llama-3.1-8B、Llama-3.2-3B、Qwen2.5-7B、Qwen3-8B、Mistral-Small-24B、Nemotron-Nano-12B-v2、Nemotron-Nano-30B-A3B(含 MoE 专家剪枝)、GPT-OSS-20B(专家移除),以及 VLM 方向的 Qwen3-VL。
接入新模型只需两步:写一个ModelDescriptor(定义权重分块正则)+ 一个Converter(生成逐层 BlockConfig),完整指引在 modelopt/torch/puzzletron/anymodel/README.md。
最小启动命令(Llama-3.1-8B,2 卡):
torchrun --nproc_per_node 2 examples/puzzletron/main.py \ --config examples/puzzletron/configs/llama-3_1-8B_pruneffn_memory/llama-3_1-8B_pruneffn_memory.yaml📚 延伸阅读
| 资料 | 路径 |
|---|---|
| Puzzletron 官方教程 | examples/puzzletron/README.md |
| Minitron vs Puzzletron 完整对比指南 | examples/pruning/minitron_vs_puzzletron/README.md |
| 算法核心插件 | modelopt/torch/puzzletron/puzzletron_nas_plugin.py |
| MIP 求解器 | modelopt/torch/puzzletron/mip/ |
| 剪枝 Mixin 与打分 | modelopt/torch/puzzletron/pruning/ |
| 替换库构建 | modelopt/torch/puzzletron/replacement_library/ |
| 蒸馏结果 | examples/pruning/puzzletron/README.md |
小结:Puzzletron 把"剪哪些层、每层剪多狠"这个架构设计问题交给了 MIP 求解器,让压缩结果精确贴合你的显存或延迟预算;温和压缩场景下 Minitron 仍是更简单可靠的选择,两者同属 Model Optimizer 的压缩工具箱,可按目标灵活切换。
【免费下载链接】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),仅供参考