SparseML
用几行代码将稀疏化配方应用于神经网络的库,实现更快更小的模型
概述
SparseML 是一个开源模型优化工具包,使您能够使用剪枝、量化和蒸馏算法创建用于推理优化的稀疏模型。使用 SparseML 优化的模型可以导出为 ONNX,并使用 DeepSparse 在 CPU 硬件上部署,以获得 GPU 级性能。
✨全新✨ SparseML 一次性 LLM 压缩
Neural Magic 很高兴预览使用新的 SparseGPTModifier
的一次性 LLM 压缩工作流!
要修剪和量化 TinyLlama Chat 模型,只需安装依赖项、下载配方并将其应用于模型:
git clone https://github.com/neuralmagic/sparseml
pip install -e "sparseml[transformers]"
wget https://huggingface.co/neuralmagic/TinyLlama-1.1B-Chat-v0.4-pruned50-quant-ds/raw/main/recipe.yaml
sparseml.transformers.text_generation.oneshot --model_name TinyLlama/TinyLlama-1.1B-Chat-v1.0 --dataset_name open_platypus --recipe recipe.yaml --output_dir ./obcq_deployment --precision float16
《src/sparseml/transformers/sparsification/obcq
》中的自述文件有详细的操作介绍。
工作流程
SparseML 可以通过两种方式在您的数据集上创建一个稀疏模型:
-
稀疏迁移学习 使您能够从 SparseZoo(一个开源稀疏模型库,例如 BERT、YOLOv5 和 ResNet-50)中微调一个预稀疏化模型到您的数据集上,同时保持稀疏度。这条路径就像您在训练 CV 和 NLP 模型时惯用的微调一样运作,如果您的模型架构在 SparseZoo 中可用,这是强烈推荐的方法。
-
从头开始稀疏化 使您能够将最先进的修剪(如渐进幅度修剪或 OBS 修剪)和量化(如量化感知训练)算法应用于任意 PyTorch 和 Hugging Face 模型。这条路径需要更多的实验,但允许您创建任何模型的稀疏版本。
集成
教程
PyTorch
Hugging Face Transformers
Ultralytics YOLOv5
Ultralytics YOLOv8
额外示例
安装
此存储库在 Python 3.8-3.11 和 Linux/Debian 系统上经过测试。
建议安装在虚拟环境中,以保持系统整洁。
当前支持的 ML 框架如下:torch>=1.1.0,<=2.0
,tensorflow>=1.8.0,<2.0.0
,tensorflow.keras >= 2.2.0
。
使用 pip 安装:
pip install sparseml
有关安装的更多信息,例如可选依赖项和要求,请参见此处。
快速指南
配方
为了实现灵活性、易用性和可重复性,SparseML 使用一种称为 recipes
的声明式接口来指定应由 SparseML 应用的与稀疏性相关的算法和超参数。
recipes
是以列表形式编写的 YAML 文件,文件内容为 modifiers
,它们对 SparseML 的指示进行编码。示例 modifiers
可以从设置学习率到编码渐进幅度修剪算法的超参数。SparseML 系统将 recipes
解析为每个框架的本地格式,并将修改应用于模型和训练管道。
Python API
由于声明性、基于配方的方法,您可以将 SparseML 添加到现有的 PyTorch 训练管道中。ScheduleModifierManager
类负责解析 YAML recipes
并覆盖标准 PyTorch 模型和优化器对象,从配方中编码稀疏算法的逻辑。一旦调用 manager.modify
,您就可以像往常一样使用模型和优化器,因为 SparseML 抽象掉了稀疏化算法的复杂性。
工作流程如下:
model = Model() # 模型定义
optimizer = Optimizer() # 优化器定义
train_data = TrainData() # 训练数据定义
batch_size = BATCH_SIZE # 训练批量大小
steps_per_epoch = len(train_data) // batch_size
from sparseml.pytorch.optim import ScheduledModifierManager
manager = ScheduledModifierManager.from_yaml(PATH_TO_RECIPE)
optimizer = manager.modify(model, optimizer, steps_per_epoch)
# 典型的 PyTorch 训练循环,像往常一样使用您的模型/优化器
manager.finalize(model)
- 查看 PyTorch 集成文档 以获取 Python API 的完整使用示例。
- 查看 Hugging Face 集成文档 了解在 Hugging Face
Trainer
中使用 SparseML 的详细信息。
SparseML CLI
除了代码级 API 之外,SparseML 还通过 CLI 接口为常见 NLP 和 CV 任务提供预制的训练管道。CLI 使您可以使用各种实用工具启动训练运行,例如数据集加载和预处理、检查点保存、指标报告和日志记录。这使得在常见的训练路径中轻松启动和运行。
例如,我们可以使用以下命令启动一个 YOLOv5 稀疏迁移学习运行到 VOC 数据集(使用 SparseZoo 存根来下载稀疏模型检查点和迁移学习配方):
sparseml.yolov5.train \
--weights zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned75_quant-none?recipe_type=transfer_learn \
--recipe zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned75_quant-none?recipe_type=transfer_learn \
--data VOC.yaml \
--hyp hyps/hyp.finetune.yaml --cfg yolov5s.yaml --patience 0
其他资源
在 SparseML 文档中可以找到有关代码库和包含过程的更多信息:
资源
了解更多
- 文档:SparseML, SparseZoo, Sparsify, DeepSparse
- Neural Magic: 博客, 资源
版本历史
官方构建托管在 PyPI 上
- 稳定版: sparseml
- 夜间版(开发版):sparseml-nightly
另外,可以通过 GitHub Releases 获取更多信息。
许可证
该项目根据 Apache License Version 2.0 许可。
社区
贡献
我们欢迎对代码、示例、集成和文档的贡献,以及错误报告和功能请求!在这里了解更多。
加入
如需用户帮助或对 SparseML 有任何疑问,请注册或登录我们的 Neural Magic 社区 Slack。我们正在逐步扩大社区成员,乐见您的加入。错误、功能请求或其他问题也可以发布到我们的 GitHub 问题队列。
您可以通过订阅 Neural Magic 社区 获得最新新闻、网络研讨会和活动邀请、研究论文以及其他 ML 性能的最新资讯。
如有关于 Neural Magic 的一般问题,请填写此 表格。
引用
在您的研究或其他交流中觉得这个项目有用吗?请考虑引用:
@InProceedings{
pmlr-v119-kurtz20a,
title = {Inducing and Exploiting Activation Sparsity for Fast Inference on Deep Neural Networks},
author = {Kurtz, Mark and Kopinsky, Justin and Gelashvili, Rati and Matveev, Alexander and Carr, John and Goin, Michael and Leiserson, William and Moore, Sage and Nell, Bill and Shavit, Nir and Alistarh, Dan},
booktitle = {Proceedings of the 37th International Conference on Machine Learning},
pages = {5533--5543},
year = {2020},
editor = {Hal Daumé III and Aarti Singh},
volume = {119},
series = {Proceedings of Machine Learning Research},
address = {Virtual},
month = {13--18 Jul},
publisher = {PMLR},
pdf = {http://proceedings.mlr.press/v119/kurtz20a/kurtz20a.pdf},
url = {http://proceedings.mlr.press/v119/kurtz20a.html},
abstract = {Optimizing convolutional neural networks for fast inference has recently become an extremely active area of research. One of the go-to solutions in this context is weight pruning, which aims to reduce computational and memory footprint by removing large subsets of the connections in a neural network. Surprisingly, much less attention has been given to exploiting sparsity in the activation maps, which tend to be naturally sparse in many settings thanks to the structure of rectified linear (ReLU) activation functions. In this paper, we present an in-depth analysis of methods for maximizing the sparsity of the activations in a trained neural network, and show that, when coupled with an efficient sparse-input convolution algorithm, we can leverage this sparsity for significant performance gains. To induce highly sparse activation maps without accuracy loss, we introduce a new regularization technique, coupled with a new threshold-based sparsification method based on a parameterized activation function called Forced-Activation-Threshold Rectified Linear Unit (FATReLU). We examine the impact of our methods on popular image classification models, showing that most architectures can adapt to significantly sparser activation maps without any accuracy loss. Our second contribution is showing that these these compression gains can be translated into inference speedups: we provide a new algorithm to enable fast convolution operations over networks with sparse activations, and show that it can enable significant speedups for end-to-end inference on a range of popular models on the large-scale ImageNet image classification task on modern Intel CPUs, with little or no retraining cost.}
}
@misc{
singh2020woodfisher,
title={WoodFisher: Efficient Second-Order Approximation for Neural Network Compression},
author={Sidak Pal Singh and Dan Alistarh},
year={2020},
eprint={2004.14340},
archivePrefix={arXiv},
primaryClass={cs.LG}
}