HuggingFace又出炼丹神器!稀疏矩阵运算进入平民化时代!

2020 年 10 月 25 日 AINLP

文 | rumor酱

编 | YY


一提到模型加速,大家首先想到的就是蒸馏、(结构性)剪枝、量化(FP16),然而稀疏矩阵(sparse matrix)运算一直不被大家青睐。原因也很简单,一是手边没有现成的代码(懒),二是即使用了,速度也不一定有之前的稠密矩阵(dense matrix)快。

不过,框架的开发者们并没有停下他们的脚步,就在不久前,HuggingFace开心地宣布,他们可以支持稀疏矩阵运算啦!75%的sparsity换来了1/4的内存和2倍的速度提升!

这个消息还是比较令人激动的,首先稀疏矩阵在存储上省略了0值,另外在计算上,也没必要计算和0值相关的结果。所以稀疏矩阵能显著提升运算速度,并节约大量存储空间。

不过老司机们的第一反应肯定是:效率不错,但效果(精度)怎么样?

普普通通……(注意上图高亮的modest,感觉效果的确一般,否则就直接放结果了=。=)

Anyway,虽然精度有些美中不足,但单从速度上讲已经很好了。技术的进步要一步步来,以HuggingFace的效率,之后应该还会有更多动作。

细心的同学们看到这里一定很疑惑,为啥压缩了4倍,但只提升了2倍速呢?

在pytorch_block_sparse[1]的Github库中,官方详细解释了这个问题:主要是当前使用的CUTLASS库还不够快

在继续下文的讨论前,先介绍些GPU编程的小知识:

  • CUDA(Compute Unified Device Architecture):Nvidia家的编程平台,帮大家把C++等程序转换为GPU指令。
  • BLAS(Basic Linear Algebra Subprograms):一个线性代数计算的API标准。
  • cuBLAS:用cuda实现的GPU BLAS计算库。像我们所用的Pytorch、Tensorflow都是基于一系列的cuda库开发的。只用于dense矩阵运算,已经配合GPU优化得很好了。这也就是为什么之前大家不在意稀疏矩阵, 因为这样就不能用cuBLAS了,同时还得加上更多的逻辑,可能还不如用cuBLAS直接运算dense要快。
  • CUTLASS:CUDA Templates for Linear Algebra Subroutines,一个CUDA C++ 模板集,用于在CUDA上实现更多样的矩阵乘法计算(GEMM)。

HuggingFace为了实现稀疏矩阵,选取了CUTLASS库,其本身在计算矩阵乘法时就比cuBLAS库要慢上两倍。所以即使理论上75%稀疏度应该加速4倍,最后测出来也只提升了2倍。

可见如果深入研究出定制化的稀疏矩阵运算库,速度上可能还会有所提升。

对于想试用的同学,HuggingFace也一如既往地重视“拿来即用”的体验,提供了两种使用方法:

  1. 自己写网络时,可以直接用BlockSparseLinear替换Linear层
# from torch.nn import Linear
from pytorch_block_sparse import BlockSparseLinear

# self.fc = nn.Linear(1024, 256)
self.fc = BlockSparseLinear(1024, 256, density=0.1)
  1. 想转换别人已经写完的网络,可以直接转整个模型。可惜不能自动转参数,需要重新训练。
from pytorch_block_sparse import BlockSparseModelPatcher
# Create a model patcher
mp = BlockSparseModelPatcher()

# Selecting some layers to sparsify.
# This is the "artful" part, as some parts are more prone to be sparsified, other may impact model precision too much.

# Match layers using regexp (we escape the ., just because, it's more correct, but it does not change anything here)
# the [0-9]+ match any layer number.
# We setup a density of 0.5 on these layers, you can test other layers / densities .
mp.add_pattern("roberta\.encoder\.layer\.[0-9]+\.intermediate\.dense", {"density":0.5})
mp.add_pattern("roberta\.encoder\.layer\.[0-9]+\.output\.dense", {"density":0.5})
mp.add_pattern("roberta\.encoder\.layer\.[0-9]+\.attention\.output\.dense", {"density":0.5})
mp.patch_model(model)

print(f"Final model parameters count={model.num_parameters()}")

# => 68 million parameters instead of 84 million parameters (embeddings are taking a lof of space in Roberta)

目前HuggingFace只迈出了一小步,后续CUTLASS还会继续提升,作者也会复现更多的学术成果。除了他们之外,OpenAI在20年初也宣布要将Tensorflow的部分计算代码移植到Pytorch,谷歌和斯坦福在6月的Paper Sparse GPU Kernels for Deep Learning[2] 也承诺会放出源码,大家可以把稀疏矩阵的优化学习提上日程啦。




由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:

(1)点击页面最上方"AINLP",进入公众号主页。

(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。

感谢支持,比心

欢迎加入AINLP技术交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注NLP技术交流

推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
0

相关内容

【2020新书】懒人程序员专用书C++20,681页pdf
专知会员服务
41+阅读 · 2020年12月15日
必须收藏!MIT-Gilbert老爷子《矩阵图解》,一张图看透矩阵
专知会员服务
113+阅读 · 2020年8月22日
最新《深度学习人脸识别》综述论文,
专知会员服务
67+阅读 · 2020年8月10日
【人大】大规模知识图谱补全技术的研究进展
专知会员服务
82+阅读 · 2020年5月2日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
3倍加速CPU上的BERT模型部署
ApacheMXNet
11+阅读 · 2020年7月13日
英伟达Faster Transformer:作者带你揭秘BERT优化
机器之心
13+阅读 · 2019年9月18日
教程 | 从头开始了解PyTorch的简单实现
机器之心
20+阅读 · 2018年4月11日
三味Capsule:矩阵Capsule与EM路由
PaperWeekly
10+阅读 · 2018年3月2日
深度学习人脸识别系统DFace
深度学习
17+阅读 · 2018年2月14日
干货 | 深度学习入门指北——从硬件到软件
AI科技评论
3+阅读 · 2017年11月22日
Spark机器学习:矩阵及推荐算法
LibRec智能推荐
15+阅读 · 2017年8月3日
Arxiv
0+阅读 · 2021年1月25日
Arxiv
23+阅读 · 2020年9月16日
Learning from Few Samples: A Survey
Arxiv
77+阅读 · 2020年7月30日
Heterogeneous Deep Graph Infomax
Arxiv
12+阅读 · 2019年11月19日
VIP会员
相关VIP内容
【2020新书】懒人程序员专用书C++20,681页pdf
专知会员服务
41+阅读 · 2020年12月15日
必须收藏!MIT-Gilbert老爷子《矩阵图解》,一张图看透矩阵
专知会员服务
113+阅读 · 2020年8月22日
最新《深度学习人脸识别》综述论文,
专知会员服务
67+阅读 · 2020年8月10日
【人大】大规模知识图谱补全技术的研究进展
专知会员服务
82+阅读 · 2020年5月2日
一网打尽!100+深度学习模型TensorFlow与Pytorch代码实现集合
相关资讯
3倍加速CPU上的BERT模型部署
ApacheMXNet
11+阅读 · 2020年7月13日
英伟达Faster Transformer:作者带你揭秘BERT优化
机器之心
13+阅读 · 2019年9月18日
教程 | 从头开始了解PyTorch的简单实现
机器之心
20+阅读 · 2018年4月11日
三味Capsule:矩阵Capsule与EM路由
PaperWeekly
10+阅读 · 2018年3月2日
深度学习人脸识别系统DFace
深度学习
17+阅读 · 2018年2月14日
干货 | 深度学习入门指北——从硬件到软件
AI科技评论
3+阅读 · 2017年11月22日
Spark机器学习:矩阵及推荐算法
LibRec智能推荐
15+阅读 · 2017年8月3日
Top
微信扫码咨询专知VIP会员