自动生成低精度深度学习算子
深度学习模型变得越来越大,越来越复杂,由于其有限的计算和能源预算,部署在低功耗电话和IoT设备上变得充满挑战。深度学习的最新趋势是使用高度量化的模型,该模型可对输入和几位权重进行操作,诸如XNOR-Net,DoReFa-Net和HWGQ-Net之类的网络正在稳步发展,提高了准确性。
下面是一个低精度图形片段的示例。低精度卷积将量化的数据和位包放入适当的数据布局中,实现有效的比特卷积。输出具有更高的精度,在对其进行重新量化,另一个低精度算子发送之前,将传统的深度学习层(如批处理归一化和ReLu)应用于该输出。

低精度卷积管线。
理论上讲,低精度算子比浮点算子使用更少的运算,可以实现巨大的加速。深度学习框架难以置信的良好优化的低级BLAS和LAPACK库,利用了数十年的工程工作,CPU包含用于加速这些任务的内在指令。开发与8位量化甚至浮点算子的卷积之类的低级算子并不简单。本文介绍了为CPU自动生成优化的低精度卷积的方法。声明低精度算子,根据有效存储的低精度输入进行计算,描述用于描述实现参数搜索空间的调度。依靠AutoTVM来快速搜索空间,找到针对特定卷积,精度和后端的优化参数。
二进制计算背景
低精度模型的核心是biterial点积,使得仅使用按位运算和popcount即可计算卷积和密集算子。点积是两个向量的元素逐次相乘,将所有元素相加来计算的,就像下面的简单示例一样。如果所有数据都是二进制数据,可以将输入向量打包为单个整数,按位与打包的输入,使用popcount对结果中的1进行计数来计算点积。根据输入数据的量化方式,可以使用按位xnor代替按位二进制点积。

首先将输入数据分成位平面,可以以这种方式计算任意精度的点积。一旦在该表示形式中,就可以对A和B的位平面之间的加权二进制点积求和来计算点积。二进制点积的数量随A和B的精度乘积而增长,该方法仅适用于非常低精度的数据。

Bitserial点积
在TVM中定义算子
计算之前,需要对输入数据进行位打包,以便可以访问输入数据的位平面,打包为受支持的数据类型,例如uint8或uint32。提供了一种灵活的位打包算子,该算子采用任意大小的输入张量,返回一个位打包张量,用户可以在其中指定位平面应位于哪个轴。

不同的位压缩布局
一旦采用这种位打包格式,就可以按位计算低精度卷积。该数据沿输入通道打包,位平面被添加到最里面的轴,数据打包为32位整数。比特卷积的计算与普通卷积类似,按位与(&)代替乘法,使用popcount累积打包数据中的值。位平面轴成为附加的归约轴,计算输入和内核的不同位平面之间的二进制点积。解压缩格式和更高的精度计算输出。
Input_bitpacked = bitpack(Input, activation_bits, pack_axis=3, bit_axis=4, pack_type=’uint32’)
Weights_bitpacked = bitpack(Filter, weight_bits, pack_axis=2, bit_axis=4, pack_type=’uint32’)
batch, in_height, in_width, in_channel_q, _ = Input_bitpacked.shape
kernel_h, kernel_w, _, num_filter, _ = Filter_bitpakced.shape

stride_h, stride_w = stride
pad_top, pad_left, pad_down, pad_right = get_pad_tuple(padding, (kernel_h, kernel_w))

Computing the output shape

out_channel = num_filter
out_height = simplify((in_height - kernel_h + pad_top + pad_down) // stride_h + 1)
out_width = simplify((in_width - kernel_w + pad_left + pad_right) // stride_w + 1)
pad_before = [0, pad_top, pad_left, 0, 0]
pad_after = [0, pad_down, pad_right, 0, 0]
Input_padded = pad(Input_bitpacked, pad_before, pad_after, name=“PaddedInput”)

Treat the bitplane axes like additional reduction axes

rc = tvm.reduce_axis((0, in_channel_q), name=‘rc’)
ry = tvm.reduce_axis((0, kernel_h), name=‘ry’)
rx = tvm.reduce_axis((0, kernel_w), name=‘rx’)
ib = tvm.reduce_axis((0, input_bits), name=‘ib’)
wb = tvm.reduce_axis((0, weight_bits), name=‘wb’)

tvm.compute((batch, out_height, out_width, out_channel), lambda nn, yy, xx, ff:
tvm.sum(tvm.popcount(
Input_padded[nn, yy * stride_h + ry, xx * stride_w + rx, rc, ib] &
Weights_bitpacked[ry, rx, rc, ff, wb])) << (ib+wb))).astype(out_dtype),
axis=[rc, ry, rx, wb, ib]))

在调度中,应用了常见的优化,例如矢量化和内存切片,提供更好的内存局部性利用SIMD单元。其中的一些优化(如平铺)需要针对特定的微体系结构调整参数。将这些参数作为旋钮暴露给TVM,使用AutoTVM来自动同时自动调整所有参数。
可以制作小的微内核来替换最内层的计算循环,使用TVM的张量化原语调度。由于编译器会产生次优的代码,人们经常可以编写较短的汇编序列,提高效率。这些微内核利用引入的新内在函数,帮助加速深度学习工作负载,使用巧妙的方式来改善内存访问或减少所需的指令数量。
结果
树莓派Raspberry
与16位整数TVM实现相比,Raspberry Pi 3B的卷积速度提高了。工作负载是ResNet18的卷积层。

与16位TVM实现相比,Raspberry Pi上低精度卷积的加速。
与移动设备上的高性能超低精度卷积的手动优化实现相比,Raspberry Pi 3B的2位激活,1位权重卷积加速得以实现,工作负载是ResNet18的卷积层。

手动优化实现2位权重1位激活Raspberry Pi卷积的速度。
x86
与32位浮点TVM实现相比,x86上的卷积速度有所提高。x86不支持此微体系结构的矢量化popcount,加速性较低。

与32位浮点TVM实现相比,x86低精度卷积的加速。

自动生成低精度深度学习算子相关推荐

  1. python自动生成字幕_深度学习实现自动生成图片字幕

    介绍 本次项目使用深度学习自动生成图像字幕.如上图,模型自动生成"The person is riding a surfboard in the ocean"字幕.我们具体该如何实 ...

  2. 自动驾驶汽车之深度学习 2018 MIT 6.S094 Deep Learning for Self-Driving Cars

    MIT自动驾驶汽车之深度学习课程更新到2018版本,PPT酷炫. ------ ------ 麻省理工学院6.S094:自驾车深度学习 跳至内容 Home DeepTraffic DeepCrash ...

  3. 幻方萤火 | 性能卓越的深度学习算子 hfai.nn

    深度学习框架的流行(如 PyTorch,Tensorflow 等)极大方便了我们研发设计各种各样的 AI 模型,而在实际落地的环节中,孵化于实验室里的模型代码往往在生产环境上面临着性能.准确度.资源等 ...

  4. opengl深度缓冲获得的深度图精度太低_深度学习行人重识别ReID最新综述与展望...

    点击上方"计算机视觉life",选择"星标" 快速获得最新干货 arXiv 新出论文 Deep Learning for Person Re-identific ...

  5. 亚马逊专家揭秘:如何建立自动检测乳腺癌的深度学习模型

    安妮 编译自 Insight Data Science 量子位出品 | 公众号 QbitAI 本文作者Sheng Weng,现亚马逊Alexa项目组数据专家,莱斯大学应用物理专业已毕业博士生,主要研究 ...

  6. 【深度学习实战】从零开始深度学习(五):生成对抗网络——深度学习中的非监督学习问题

    参考资料: <PyTorch深度学习>(人民邮电出版社)第7章 生成网络 PyTorch官方文档 廖星宇著<深度学习入门之Pytorch>第6章 生成对抗网络 其他参考的网络资 ...

  7. 加载tf模型 正确率很低_深度学习模型训练全流程!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:黄星源.奉现,Datawhale优秀学习者 本文从构建数据验证集. ...

  8. linux caffe生成的模型,深度学习之pytorch转caffe转ncnn模型转换(三)

    搭建caffe平台: 先在Linux系统下搭建caffe环境,安装依赖包: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy- ...

  9. 资源 | 《GAN实战:生成对抗网络深度学习》牛津大学Jakub著作(附下载)

    来源:专知 本文共1000字,建议阅读5分钟. 本书囊括了关于GAN的定义.训练.变体等,是关于GAN的最好的书籍之一. [ 导读 ]生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可 ...

最新文章

  1. java操作跨页的word cell,利用itext 生成pdf,处理cell 跨页问题 [转]
  2. 洛谷 - P3358 最长k可重区间集问题(最大费用最大流+思维建边)
  3. 【转】Mac本地生成SSH Key 的方法
  4. python bokeh_提升视觉效果:使用Python和Bokeh制作交互式地图
  5. Notable magic numbers
  6. 计算机网络在地理信息系统中应用,计算机网络在地理信息系统中有哪些应用?...
  7. html5数学公式编辑器,数学公式编辑器的使用技巧
  8. 手机图形计算器matlab,Mathlab图形计算器下载
  9. 项目管理:项目进度优化策略
  10. 工作总结—HMC5883L应用的一些说明
  11. 35岁开发转测试,能度过中年危机吗?
  12. 回归预测 | MATLAB实现NCA(近邻成分分析)多输入单输出
  13. (多元)偏正态分布、正态分布、对数正态分布的随机数的产生(R语言)
  14. 下载到的电子书格式是Mobi,这种格式如何打开?
  15. 【重读.转】黑客帝国中的佛法义理
  16. 基于pyqt5开发的图书管理系统UI(带登录页面)
  17. 如何设置element ui table的show-overflow-tooltip属性以及宽度
  18. AWC / Advanced SystemCare Pro(专业版)V3.7.0+有效注册码
  19. Android 网络性能优化(4)弱网优化
  20. 管理经济学【一】之 导论

热门文章

  1. 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发
  2. 2022-2028年中国玻璃纤维毡热塑性塑料(GMT)行业市场研究及前瞻分析报告
  3. LeetCode19. Remove Nth Node From End of List 删除链表中的倒数第n个位置的元素
  4. 每个年龄段,都有每个年龄段的“好”
  5. 外包工作经历暨2021年终总结
  6. SpringBoot (八) :Spring Boot多数据源(JdbcTemplate)配置与使用
  7. k8s核心组件详细介绍教程(配超详细实例演示)
  8. CVPR2020:点云分类的自动放大框架PointAugment
  9. 目标检测coco数据集点滴介绍
  10. 2021年大数据ELK(二十二):采集Apache Web服务器日志