
Torch-Pruning
一键剪枝任意 PyTorch 模型,自动处理复杂依赖,压缩提速不降准。
项目预览
项目数据
项目介绍
Star 增长趋势
本站每日记录该项目 GitHub 星标变化,观测越久曲线越完整
数据来源:GitHub API 逐日快照 · 收录于 2026-08-09 · 当前星标 ★ 3369
使用教程
环境要求
- Python 环境(建议 3.8 及以上)
- PyTorch(README 测试覆盖 1.x 与 2.x,徽章标注 PyTorch>=2.0)
- NumPy(Torch-Pruning 仅依赖 PyTorch 和 Numpy)
- 可用的 pip 包管理工具
安装与启动步骤
-
1安装 Torch-Pruning
官方推荐方式,自动安装最新版;升级已有版本同样使用该命令。
pip install torch-pruning --upgrade -
2源码可编辑安装
需要改源码或跟最新代码时使用,克隆仓库后以 -e 模式安装到当前环境。
git clone https://github.com/VainF/Torch-Pruning.git cd Torch-Pruning && pip install -e . -
3加载模型与示例输入
以 torchvision 的 resnet18 为例准备模型和输入张量,作为剪枝的依赖图分析入口。
import torch from torchvision.models import resnet18 import torch_pruning as tp model = resnet18(pretrained=True) example_inputs = torch.randn(1, 3, 224, 224) -
4设置忽略层并建剪枝器
分类器层不参与剪枝,需加入 ignored_layers;BasePruner 无需稀疏训练即可使用。
ignored_layers = [] for m in model.modules(): if isinstance(m, torch.nn.Linear) and m.out_features == 1000: ignored_layers.append(m) pruner = tp.pruner.BasePruner( model, example_inputs, importance=imp, pruning_ratio=0.5, ignored_layers=ignored_layers, round_to=8, ) -
5执行剪枝并统计
调用 pruner.step() 完成剪枝,再用 count_ops_and_params 对比剪枝前后的 MACs 与参数量。
base_macs, base_nparams = tp.utils.count_ops_and_params(model, example_inputs) tp.utils.print_tool.before_pruning(model) pruner.step() tp.utils.print_tool.after_pruning(model) macs, nparams = tp.utils.count_ops_and_params(model, example_inputs) print(f"MACs: {base_macs/1e9} G -> {macs/1e9} G, #Params: {base_nparams/1e6} M -> {nparams/1e6} M") -
6用自有代码微调
README 未提供训练脚本,剪枝后需用你自己的训练代码微调剩余权重以恢复精度。
关键配置
| 配置项 | 必填 | 说明 | 示例 |
|---|---|---|---|
pruning_ratio | 是 | 默认通道/维度剪枝比例 | 0.5 |
ignored_layers | 否 | 不参与剪枝的层列表,如最终分类器 | ignored_layers |
round_to | 否 | 通道数对齐倍数,便于实际加速,建议 4 或 8 | 8 |
global_pruning | 否 | 开启全局剪枝,在所有层上统一排名 | True |
isomorphic | 否 | 开启同构剪枝,缓解全局剪枝过度剪裁问题 | True |
pruning_ratio_dict | 否 | 按模块或模块元组自定义剪枝比例 | {(model.layer1, model.layer2): 0.4, model.layer3: 0.2} |
如何确认成功
运行后打印的 MACs 与 #Params 相比剪枝前明显下降,且模型仍可正常前向推理。
常见问题
Q:为什么 pruning_ratio=0.5 时参数量并没减少一半?
A:该比例指通道数比例,输入输出维度都会被移除,实际参数剪枝率约为 1-(1-p)^2;想去掉 50% 参数可用 pruning_ratio=0.30。
Q:为什么最后一层分类器要放进 ignored_layers?
A:README 明确提示不要剪枝最后的分类器,否则输出维度与类别数不匹配,会导致模型失效。
Q:如何做全局剪枝或同构剪枝?
A:在 BasePruner 中设置 global_pruning=True 和/或 isomorphic=True 即可;全局剪枝可能过度剪裁某些层,同构剪枝用于缓解该问题。
Q:想逐组查看和控制剪枝过程怎么办?
A:使用 pruner.step(interactive=True) 取回所有 group,再调用 group.prune() 逐个处理,注意 group 必须顺序处理不能存成列表。
注意事项
- Torch-Pruning 仅依赖 PyTorch 和 Numpy,无需额外重型依赖。
- 通道维度建议对齐到 4x 或 8x,实际推理加速更明显。
- 剪枝后必须自行微调,README 未提供训练脚本。
- 交互式剪枝时 group 必须顺序处理,不要保存为列表后再统一执行。
核心亮点
- 自动建模层间依赖,支持残差、注意力等复杂结构,无需手工指定剪枝规则
- 覆盖视觉模型和大语言模型,提供 LLaMA、ViT 等前沿架构的剪枝示例
- API 设计简洁,与 PyTorch 原生集成,可快速嵌入现有训练/推理流程
不足之处
- 文档相对简略,高级用法需阅读源码或论文
- 对超大规模模型(如百亿参数)的剪枝效率有待验证
适用场景
- 在部署前压缩视觉模型(如 ResNet、ViT)以适配边缘设备
- 对大语言模型进行结构化剪枝,减少显存占用和推理成本
- 研究结构化剪枝算法,作为 DepGraph 方法的复现和扩展基础
替代项目
NNI、PaddleSlim、torch.nn.utils.prune
同类项目推荐
minAlphaFold2
开源
用 PyTorch 极简复现 AlphaFold2,读懂蛋白质结构预测
A minimal PyTorch re-implementation of AlphaFold2's model & training
lora
开源
用少量图片和普通显卡,快速训练专属图像模型
Using Low-rank adaptation to quickly fine-tune diffusion models.
gigaevo-core
开源
让大模型当变异器,自动迭代把程序改到更好
Evolutionary algorithm that uses Large Language Models (LLMs) to automatically impro···
doc-to-lora
开源
让大模型随时记住新知识,不用重训
Hypernetworks that update LLMs to remember factual information
LlamaFactory
开源
上百种模型随意挑,教出你专属的 AI
Unified Efficient Fine-Tuning of 100+ LLMs & VLMs (ACL 2024)
rapidfireai
开源
拖拽式搞定 AI 定制,从 RAG 到微调一键加速
RapidFire AI: Rapid AI Customization from RAG to Fine-Tuning
meta-context-engineering
开源
让AI自动进化上下文策略,告别手写提示词
[ICML 2026] Meta Context Engineering via Agentic Skill Evolution
Composition-RL
开源
把可验证提示词自动组合,低成本扩充 RL 训练数据
[Neurips 2026] Official repository for the paper "Composition-RL: Compose Your Verif···
Matlab-GAN
开源
用 MATLAB 跑通多种 GAN,从入门到 CycleGAN 一步到位
MATLAB implementations of Generative Adversarial Networks -- from GAN to Pixel2Pixel···