文 | 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] 也承诺会放出源码,大家可以把稀疏矩阵的优化学习提上日程啦。


文末福利
后台回复关键词【入群
加入卖萌屋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又出炼丹神器!稀疏矩阵运算进入平民化时代!相关推荐

  1. 只需两行代码,2080Ti 就能当 V100用,这个炼丹神器真牛!

    作者 | 陈大鑫.青暮 话说人工智能江湖门派众多且繁杂,好似那大脑中的神经网络一般,但繁杂中却仍然有着一统的迹象...... 许久之前,ML派坐落美利坚合众山中,百年来武学奇才辈出,隐然成江湖第一大名 ...

  2. echart label 不随值变化位置_炼丹神器来了! 模型结构、训练日志、特征提取都能可视化,调参不慌了!...

    点击上方"CVer",选择加"星标"置顶 重磅干货,第一时间送达 开发者在炼丹的过程中会不会遇到这些问题呢?比如说深度学习模型训练过程中盯 Log 盯得头晕眼花 ...

  3. 小米“祭出” AIoT 神器!| 技术头条

    如何挑战百万年薪的人工智能! https://edu.csdn.net/topic/ai30?utm_source= csdn_bw 作者 | 小米MACE团队 责编 | 胡巍巍 近年来,依托硬件算力 ...

  4. 机器学习之炼丹神器-autosklearn

    文章目录 一,什么是autosklearn 1. 需求: 2. 概念: 二,autosklearn有什么用 1. 作用 2. 应用场景 数据科学竞赛: 模型选择: 计算资源受限: 数据集变化: 三,a ...

  5. 程序员被女朋友拉黑之后,开发出绝世神器

    作者丨林萌 来源丨知乎 在一个阳光明媚的清晨,我打开窗户呼吸了一口新鲜空气. 阳光灿烂,岁月静好,又是一个约女朋友出去爬山吃饭看电影的好日子. 想到女朋友的大眼睛,我脸上不禁洋溢起了幸福的微笑. 打开 ...

  6. C/C++利用三元组实现稀疏矩阵运算

    三元组((x,y),z)其中(x,y)表示非零元位置,z表示该坐标的值 由于实际操作时,我们所用的矩阵0非常多,所以一个一个输入值很浪费时间,也浪费空间,所以用一些三元组表示非零元即能表示一个矩阵 三 ...

  7. 炼丹神器!模型调参这门“玄学”,终于被破解了

    吃一个苹果要几步?这对普通人来说,是一件很简单的事. 那么AI模型调参需要几步呢?调参是机器学习中至关重要的一环,因其复杂性而被称之为一门"玄学".这对开发小白和AI专业算法工程师 ...

  8. 推荐一个快速定位深度学习代码bug的炼丹神器!

    文 | McGL 源 | 知乎 写深度学习网络代码,最大的挑战之一,尤其对新手来说,就是把所有的张量维度正确对齐.如果以前就有TensorSensor这个工具,相信我的头发一定比现在更浓密茂盛! Te ...

  9. Python稀疏矩阵运算库scipy.sparse用法精要

    1.稀疏矩阵的常见存储形式 bsr_matrix(arg1[, shape, dtype, copy, blocksize]) Block Sparse Row matrix coo_matrix(a ...

最新文章

  1. linux 新建用户_使用Xshell和Xftp连接管理Linux服务器
  2. VC++读取AVi视频文件
  3. VMware10.0中安装CentOS8时提示客户机操作系统已禁用CPU,请关闭或重置虚拟机
  4. 和sexy_“纸片人”没曲线?Mark这三招,H型身材也能驾驭sexy
  5. 什么是Ajax和JSON,它们的优缺点
  6. 【渝粤教育】电大中专药剂学基础知识_1作业 题库
  7. linux简单进程调用
  8. qt android编程,Qt for Android开发实例教程
  9. javascript查看详情与收起详情
  10. 多项式时间 P问题 NP问题
  11. 《我们终将遇到爱与孤独》
  12. css圣杯模式的HTML代码,三种方式实现圣杯布局
  13. AI自动修复图片网站
  14. LAMP编程之Linux(2)
  15. 一次linux oops分析
  16. 华为交换机查看网口光功率命令
  17. 机器学习中的距离公式
  18. Verilog实现移位寄存器
  19. Ctfhub解题 web RCE
  20. 近1、2年来设计的几个飞机构型

热门文章

  1. What code you will get when you create a wcf library
  2. SQLSERVER字符串截取------STUFF
  3. ASP.NET中Request.IsAuthenticated和Request.User.Identity.IsAuthenticated的区别
  4. [推荐]VMware Workstation 6.5虚拟机(汉化补丁+注册机+原版安装文件)
  5. 你见过出道即巅峰吗?
  6. 安卓camera总体框架
  7. php项目index页面空白,如何解决vue项目打包后打开页面空白的问题
  8. get请求可以传body吗_都9102年了,GET和POST的区别掌握了没有?
  9. python selenium自动化测试面试题_selenium 自动化测试面试题及答案
  10. Mongoose 预定义模式修饰符 Getters 与 Setters 自定义修饰符