HuggingFace又出炼丹神器!稀疏矩阵运算进入平民化时代!
文 | 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也一如既往地重视“拿来即用”的体验,提供了两种使用方法:
自己写网络时,可以直接用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)
想转换别人已经写完的网络,可以直接转整个模型。可惜不能自动转参数,需要重新训练。
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] 也承诺会放出源码,大家可以把稀疏矩阵的优化学习提上日程啦。
文末福利
后台回复关键词【入群】
加入卖萌屋NLP/IR/Rec与求职讨论群
有顶会审稿人、大厂研究员、知乎大V和妹纸
等你来撩哦~
参考文献
[1] pytorch_block_sparse:
https://github.com/huggingface/pytorch_block_sparse
[2] Sparse GPU Kernels for Deep Learning:
https://arxiv.org/abs/2006.10901
HuggingFace又出炼丹神器!稀疏矩阵运算进入平民化时代!相关推荐
- 只需两行代码,2080Ti 就能当 V100用,这个炼丹神器真牛!
作者 | 陈大鑫.青暮 话说人工智能江湖门派众多且繁杂,好似那大脑中的神经网络一般,但繁杂中却仍然有着一统的迹象...... 许久之前,ML派坐落美利坚合众山中,百年来武学奇才辈出,隐然成江湖第一大名 ...
- echart label 不随值变化位置_炼丹神器来了! 模型结构、训练日志、特征提取都能可视化,调参不慌了!...
点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 开发者在炼丹的过程中会不会遇到这些问题呢?比如说深度学习模型训练过程中盯 Log 盯得头晕眼花 ...
- 小米“祭出” AIoT 神器!| 技术头条
如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_source= csdn_bw 作者 | 小米MACE团队 责编 | 胡巍巍 近年来,依托硬件算力 ...
- 机器学习之炼丹神器-autosklearn
文章目录 一,什么是autosklearn 1. 需求: 2. 概念: 二,autosklearn有什么用 1. 作用 2. 应用场景 数据科学竞赛: 模型选择: 计算资源受限: 数据集变化: 三,a ...
- 程序员被女朋友拉黑之后,开发出绝世神器
作者丨林萌 来源丨知乎 在一个阳光明媚的清晨,我打开窗户呼吸了一口新鲜空气. 阳光灿烂,岁月静好,又是一个约女朋友出去爬山吃饭看电影的好日子. 想到女朋友的大眼睛,我脸上不禁洋溢起了幸福的微笑. 打开 ...
- C/C++利用三元组实现稀疏矩阵运算
三元组((x,y),z)其中(x,y)表示非零元位置,z表示该坐标的值 由于实际操作时,我们所用的矩阵0非常多,所以一个一个输入值很浪费时间,也浪费空间,所以用一些三元组表示非零元即能表示一个矩阵 三 ...
- 炼丹神器!模型调参这门“玄学”,终于被破解了
吃一个苹果要几步?这对普通人来说,是一件很简单的事. 那么AI模型调参需要几步呢?调参是机器学习中至关重要的一环,因其复杂性而被称之为一门"玄学".这对开发小白和AI专业算法工程师 ...
- 推荐一个快速定位深度学习代码bug的炼丹神器!
文 | McGL 源 | 知乎 写深度学习网络代码,最大的挑战之一,尤其对新手来说,就是把所有的张量维度正确对齐.如果以前就有TensorSensor这个工具,相信我的头发一定比现在更浓密茂盛! Te ...
- Python稀疏矩阵运算库scipy.sparse用法精要
1.稀疏矩阵的常见存储形式 bsr_matrix(arg1[, shape, dtype, copy, blocksize]) Block Sparse Row matrix coo_matrix(a ...
最新文章
- linux 新建用户_使用Xshell和Xftp连接管理Linux服务器
- VC++读取AVi视频文件
- VMware10.0中安装CentOS8时提示客户机操作系统已禁用CPU,请关闭或重置虚拟机
- 和sexy_“纸片人”没曲线?Mark这三招,H型身材也能驾驭sexy
- 什么是Ajax和JSON,它们的优缺点
- 【渝粤教育】电大中专药剂学基础知识_1作业 题库
- linux简单进程调用
- qt android编程,Qt for Android开发实例教程
- javascript查看详情与收起详情
- 多项式时间 P问题 NP问题
- 《我们终将遇到爱与孤独》
- css圣杯模式的HTML代码,三种方式实现圣杯布局
- AI自动修复图片网站
- LAMP编程之Linux(2)
- 一次linux oops分析
- 华为交换机查看网口光功率命令
- 机器学习中的距离公式
- Verilog实现移位寄存器
- Ctfhub解题 web RCE
- 近1、2年来设计的几个飞机构型
热门文章
- What code you will get when you create a wcf library
- SQLSERVER字符串截取------STUFF
- ASP.NET中Request.IsAuthenticated和Request.User.Identity.IsAuthenticated的区别
- [推荐]VMware Workstation 6.5虚拟机(汉化补丁+注册机+原版安装文件)
- 你见过出道即巅峰吗?
- 安卓camera总体框架
- php项目index页面空白,如何解决vue项目打包后打开页面空白的问题
- get请求可以传body吗_都9102年了,GET和POST的区别掌握了没有?
- python selenium自动化测试面试题_selenium 自动化测试面试题及答案
- Mongoose 预定义模式修饰符 Getters 与 Setters 自定义修饰符