DeepSparse
针对 CPU 的稀疏感知深度学习推理运行时
DeepSparse 是一个 CPU 推理运行时,利用稀疏性加速神经网络推理。与我们的优化库 SparseML 一起使用,SparseML 专用于修剪和量化您的模型,DeepSparse 在 CPU 硬件上提供了卓越的推理性能。
✨全新✨ DeepSparse 大型语言模型
Neural Magic 很高兴宣布在 DeepSparse 中初步支持高性能的大型语言模型推理:
- 用于非结构化稀疏权重的稀疏内核,可实现速度和内存节省。
- 支持 8 位权重和激活量化。
- 高效使用缓存的注意力键和值,实现最小的内存移动。
立即尝试
安装(需要 Linux):
pip install -U deepsparse-nightly[llm]
运行推理:
from deepsparse import TextGeneration
pipeline = TextGeneration(model="zoo:mpt-7b-dolly_mpt_pretrain-pruned50_quantized")
prompt="""
以下是描述任务的指令。写一个适当完成请求的回应。 ### 指令: 什么是稀疏性? ### 回应:
"""
print(pipeline(prompt, max_new_tokens=75).generations[0].text)
# 稀疏性是指矩阵或其他数据结构中,大量元素为零且少量元素为非零的特性。在机器学习的上下文中,稀疏性可以用来提高训练和预测的效率。
请参阅 TextGeneration
文档了解使用详情 并获取 我们在 HF Collection 上最新的稀疏化大型语言模型。
稀疏性 :handshake: 性能
与奥地利科技学院(IST Austria)合作开发的 我们最近的论文 详述了一种名为 稀疏微调 的新技术,该技术允许我们在微调期间将 MPT-7B 修剪到 60% 的稀疏度而不会降低准确性。通过我们对大型语言模型的新支持,DeepSparse 将稀疏量化模型加速 7 倍以上:
大型语言模型发展路线图
在此次初步发布后,我们正在快速扩展对大型语言模型的支持,包括:
- 产品化稀疏微调:通过 SparseML 使外部用户能够对其数据集应用稀疏微调。
- 扩展模型支持:将我们的稀疏微调结果应用于 Llama 2 和 Mistral 模型。
- 推动更高稀疏性:改进我们的修剪算法,以实现更高的稀疏性。
计算机视觉和自然语言处理模型
除了大型语言模型,DeepSparse 还支持多种 CNN 和 Transformer 模型变种,例如 BERT、ViT、ResNet、EfficientNet、YOLOv5/8 等更多!请查看 SparseZoo,我们优化模型的家,了解 计算机视觉 和 自然语言处理 域。
安装
pip install deepsparse
要尝试最新特性,可以使用 pip install deepsparse-nightly
进行夜间构建,或者可以克隆并从源码安装 pip install -e path/to/deepsparse
。
系统要求
- 硬件:x86 AVX2,AVX-512,AVX-512 VNNI 和 ARM v8.2+
- 操作系统:Linux
- Python:3.8-3.11
- ONNX 版本 1.5.0-1.15.0,ONNX 操作集版本 11 或更高
对于使用 Mac 或 Windows 的用户,我们建议使用 Docker 中的 Linux 容器。
部署 API
DeepSparse 包含三个部署 API:
- 引擎 是最低级别的 API。使用引擎,您可以编译一个 ONNX 模型,传递张量作为输入,并接收原始输出。
- Pipeline 封装了引擎的预处理和后处理。使用 Pipeline,您传递原始数据并接收预测结果。
- 服务器 使用 FastAPI 封装 Pipeline 提供 REST API。通过服务器,您可以通过 HTTP 发送原始数据并接收预测结果。
引擎
下面的示例从 SparseZoo 下载一个 90% 修剪量化的 BERT 模型进行情感分析(ONNX 格式),编译模型,并在随机生成的输入上运行推理。用户可以提供他们自己的 ONNX 模型,无论是密集或稀疏的。
from deepsparse import Engine
# 下载 onnx 模型,编译
zoo_stub = "zoo:nlp/sentiment_analysis/obert-base/pytorch/huggingface/sst2/pruned90_quant-none"
compiled_model = Engine(model=zoo_stub, batch_size=1)
# 运行推理(输入为原始 numpy 张量,输出为原始分数)
inputs = compiled_model.generate_random_inputs()
output = compiled_model(inputs)
print(output)
# > [array([[-0.3380675 , 0.09602544]], dtype=float32)] << 原始分数
Pipeline
Pipelines 封装了引擎的预处理和后处理,使您能够传递原始数据并接收后处理后的预测结果。下面的示例从 SparseZoo 下载一个 90% 修剪量化的 BERT 模型进行情感分析(ONNX 格式),设置一个 pipeline,并在示例数据上运行推理。
from deepsparse import Pipeline
# 下载 onnx 模型,设置 pipeline
zoo_stub = "zoo:nlp/sentiment_analysis/obert-base/pytorch/huggingface/sst2/pruned90_quant-none"
sentiment_analysis_pipeline = Pipeline.create(
task="sentiment-analysis", # 任务名称
model_path=zoo_stub, # zoo stub 或本地 onnx 文件路径
)
# 运行推理(输入为一句话,输出为预测结果)
prediction = sentiment_analysis_pipeline("我爱使用 DeepSparse Pipelines")
print(prediction)
# > labels=['positive'] scores=[0.9954759478569031]
服务器
服务器通过 REST API 封装流水线,使您能够设置运行 DeepSparse 的模型服务端点。这使您可以通过 HTTP 发送原始数据到 DeepSparse,并接收后处理预测结果。DeepSparse 服务器从命令行启动,并通过参数或服务器配置文件进行配置。以下命令下载一个 90% 剪枝量化的 ONNX 格式的情感分析 BERT 模型(从 SparseZoo 获取)并启动情感分析端点:
deepsparse.server \
--task sentiment-analysis \
--model_path zoo:nlp/sentiment_analysis/obert-base/pytorch/huggingface/sst2/pruned90_quant-none
发送请求:
import requests
url = "http://localhost:5543/v2/models/sentiment_analysis/infer" # 服务器端口默认 5543
obj = {"sequences": "卡比兽喜欢我的特斯拉!"}
response = requests.post(url, json=obj)
print(response.text)
# {"labels":["positive"],"scores":[0.9965094327926636]}
其他资源
产品使用分析
为了产品使用分析的目的,DeepSparse 收集基本的使用遥测数据,包括但不限于调用次数、软件包、版本和 IP 地址。请查看 Neural Magic 的产品隐私政策,了解我们如何处理这些数据。
要禁用产品使用分析,请运行:
export NM_DISABLE_ANALYTICS=True
通过引擎调用的日志中查找短语“Skipping Neural Magic's latest package version check.”来确认遥测数据已关闭。
社区
联系我们
如果对 Neural Magic 有一般性问题,请完成此表格。
许可证
-
DeepSparse Community 可以免费使用,且根据 Neural Magic DeepSparse Community License 进行许可。 DeepSparse GitHub 存储库或目录中包含的一些源代码、示例文件和脚本根据 Apache License Version 2.0 进行许可,如有注明。
-
DeepSparse Enterprise 需要试用许可证或可以完全许可证用于生产和商业应用。
引用
在您的研究或其他交流中觉得这个项目有用?请考虑引用:
@misc{kurtic2023sparse,
title={Sparse Fine-Tuning for Inference Acceleration of Large Language Models},
author={Eldar Kurtic and Denis Kuznedelev and Elias Frantar and Michael Goin and Dan Alistarh},
year={2023},
url={https://arxiv.org/abs/2310.06927},
eprint={2310.06927},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
@misc{kurtic2022optimal,
title={The Optimal BERT Surgeon: Scalable and Accurate Second-Order Pruning for Large Language Models},
author={Eldar Kurtic and Daniel Campos and Tuan Nguyen and Elias Frantar and Mark Kurtz and Benjamin Fineran and Michael Goin and Dan Alistarh},
year={2022},
url={https://arxiv.org/abs/2203.07259},
eprint={2203.07259},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
@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}
}
@article{DBLP:journals/corr/abs-2111-13445,
author = {Eugenia Iofinova and Alexandra Peste and Mark Kurtz and Dan Alistarh},
title = {How Well Do Sparse Imagenet Models Transfer?},
journal = {CoRR},
volume = {abs/2111.13445},
year = {2021},
url = {https://arxiv.org/abs/2111.13445},
eprinttype = {arXiv},
eprint = {2111.13445},
timestamp = {Wed, 01 Dec 2021 15:16:43 +0100},
biburl = {https://dblp.org/rec/journals/corr/abs-2111-13445.bib},
bibsource = {dblp computer science bibliography, https://dblp.org}
}