http://www.atyun.com/9625.html

最近提出的二进神经网络(BNN)可以通过应用逐位运算替代标准算术运算来大大减少存储器大小和存取率。通过显着提高运行时的效率并降低能耗,让最先进的深度学习模型也能在低功耗设备上使用。这种技术结合了对开发者友好的OpenCL(与VHDL或Verilog相比),同时也让FPGA成为深度学习的可行选择。

在这篇文章中,我们要介绍BMXNet,它是一种基于Apache MXNet的开源BNN(二进神经网络)库。成熟的BNN层可以很好地应用于其他标准库组件,并且在GPU和CPU模式都可以工作。BMXNet由Hasso Plattner研究所的多媒体研究小组维护和开发,并根据Apache许可发布。库、示例项目以及预训练的二进制模型集合可从https://github.com/hpi-xnor下载。

框架

BMXNet提供支持输入数据和权重二值化的激活,卷积和完全连接的层。这些层被设计成相应MXNet变体的嵌入式替代,称为QActivation,QConvolution和QFullyConnected。它们提供了一个额外的参数act_bit,它可以控制由层计算的位宽度。在列表1和列表2中展示了使用推荐的二进制层与MXNet相比较的Python示例。在网络中的第一层和最后一层不能使用二进制层,因为这可能会大大降低精度。BMXNet中BNN的标准块结构:QActivation-QConvolution或QFullyConnected-BatchNorm-Pooling如下所示。

在传统的深度学习模型中,全连接层和卷积层主要依赖于矩阵的点积,这需要大量的浮点运算。相反,使用二值化权重和输入数据可以通过利用CPU指令xnorpopcount来执行高性能矩阵乘法实现。现在大多数的CPU都针对这些类型的操作进行了优化。每一行的A和每一列的B的乘法和加法的点积近似于,首先将它们与xnor操作结合起来然后统计结果中位组为1的数量,也就是位1计数。这样我们就可以利用这种按位操作的硬件支持。位1计数指令在支持SSE4.2的x86和x64 CPU上可用,而在ARM架构中,它包含在NEON指令集中。使用这些说明的未优化的GEMM(通用矩阵乘法)实现如列表3所示:

编译器内置的popcount由gcc和clang支持,它编译并转换为支持的硬件上的机器指令。BINARY_WORD是封装的数据类型,存储32(x86和ARMv7)或64(x64)矩阵元素,每个元素代表一个位。我们实施了几个优化版本的xnor的GEMM内核,我们尝试通过阻止和打包数据以及使用unrolling和并行化技术来利用处理器缓存层次结构。

训练和推理

在训练阶段,当将权重和输入值限制在离散值-1和+1之间时,我们仔细设计二值化层以精确匹配MXNet内置层的输出(使用BLAS点产品操作计算)。在计算点积后,我们将结果映射回所提出的xnor样式点积的值范围,如下式所示:

其中n是值范围参数。此设置可通过应用CuDNN实现GPU支持的大规模并行训练。然后,训练后的模型可用于对功能不强大的设备(无GPU支持和小型存储空间)进行推理,其中预测的前向传递将使用xnor和popcount操作而不是标准算术运算来计算点积。

在使用BMXNet训练网络后,权重存储在32位浮点变量中。这同样适用于以1位位宽训练的网络。我们提供一个model_converter,它读取二进制训练的模型文件,并封装QConvolution和QFullyConnected的权重。转换后,每个权重仅使用1位存储和运行时内存。例如,具有完全精确权重的ResNet-18网络(在CIFAR-10上)的大小为44.7MB。我们的模型转换器的转换实现29倍压缩,压缩后的文件大小为1.5MB。

分类精度

我们用BNN在MNIST(手写数字识别),CIFAR-10(图像分类)数据集上进行了实验。实验在具有Intel(R)Core TM i7-6900K CPU,64GB RAM和4TITAN X(Pascal)GPU的工作站上进行。

上表列出了我们在MNIST和CIFAR-10上训练的二进制和全精度模型的分类测试精度。我们能看到表内显示二进制模型非常小。并且准确性仍然很不错。我们还在ImageNet数据集上进行了二值化,部分二值化和全精度模型的实验,其中部分二值化模型结果不错,而完全二值化的模型仍具有很大的改进空间(更多细节访问论文:https://arxiv.org/abs/1705.09864)。

效率分析

我们对基于ubuntu160.04/64位平台的不同GEMM方法的效率进行了实验,采用英特尔2.50GHz×4 CPU,配有popcnt指令(SSE4.2)和8G RAM。测量在卷积层内进行。在这里,我们修改参数如下:filter number = 64,kernel size = 5×5,batch size = 200,矩阵大小M,N,K分别为64,12800,kernel_w×kernel_h×inputChannelSize。下图显示了结果。

不同颜色的柱形表示不同输入通道大小的处理时间(以毫秒为单位):xnor_32和xnor_64表示xnor和gemm在32位和64位中操作;xnor_64_omp表示通过使用OpenMP并行程序库加速的64位xnor和gemm;“binarize input and xnor_64_omp”进一步累加了输入数据二值化的处理时间。通过积累输入数据的二值化时间,我们仍然实现了比Cblas方法快约13倍的加速度。

结论

我们在基于MXNet的C/C++中引入了BMXNet,一种开源二进制神经网络实现。在我们目前的实验中,我们已经实现了高达29倍模型大小的节省和更高效的二进制gemm计算。我们开发了针对Android和iOS的图像分类的示例应用程序,并使用了一个二进制的resne-18模型。

GitHub地址:https://github.com/hpi-xnor

AWS研究热点:BMXNet – 基于MXNet的开源二进神经网络实现的更多相关文章

  1. [转] X-RIME: 基于Hadoop的开源大规模社交网络分析工具

    转自http://www.dataguru.cn/forum.php?mod=viewthread&tid=286174 随着互联网的快速发展,涌现出了一大批以Facebook,Twitter ...

  2. [转]基于C#的开源GIS项目介绍之SharpMap篇

    我是一个刚毕业的GIS本科毕业生,目前在杭州从事GIS软件应用开发.在项目开发中总感觉自己的编程水平还不够,于是想找些开源GIS小项目来研究研究,借以提高自己的编程能力和项目开发能力.在网上搜了一下“ ...

  3. Android研究之为基于 x86 的 Android* 游戏选择合适的引擎具体解释

     摘要 游戏开发者知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中.它们所占的比例超过 90% ...

  4. 预见未来丨机器学习:未来十年研究热点 量子机器学习(Quantum ML) 量子计算机利用量子相干和量子纠缠等效应来处理信息

    微软研究院AI头条 https://mp.weixin.qq.com/s/SAz5eiSOLhsdz7nlSJ1xdA 预见未来丨机器学习:未来十年研究热点 机器学习组 微软研究院AI头条 昨天 编者 ...

  5. 基于 Markdown 的开源的 Node.js 知识库平台

    Raneto 是一个免费,开源的 Node.js 知识库平台,基于静态 Markdown 文件实现. Raneto 可以被称为静态网站生成器,因为它并不需要数据库支持.所有的内容都存储在 Markdo ...

  6. 高性能、高容错、基于内存的开源分布式存储系统Tachyon的简单介绍

    Tachyon是什么? Tachyon是一个高性能.高容错.基于内存的开源分布式存储系统,并具有类Java的文件API.插件式的底层文件系统.兼容Hadoop MapReduce和Apache Spa ...

  7. 基于CSS UI开源框架汇总

    从16年数据统计就有20几款UI框架出现在市面上,至今为止能统计的框架应该有40款左右了.前端框架都是基于HMTL5.CSS.JS开发的,这里主要给大家聊一下CSS UI开源框架有哪些?以后工作中选择 ...

  8. 基于docker搭建开源扫描器——伏羲

    基于docker搭建开源扫描器——伏羲 1.简介 项目地址 伏羲是一款开源的安全检测工具,适用于中小型企业对企业内部进行安全检测和资产统计. 功能一览: 基于插件的漏洞扫描功能(类似于巡风) 漏洞管理 ...

  9. 基于STM32L4的开源NBIOT开发资料

    基于STM32L4的开源NBIOT开发资料 1. 参考路径:http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=615 ...

随机推荐

  1. WDA演练一:用户登陆界面设计(二)

    一,登陆界面设计: 1.将系统编号灰显,默认初值 2.密码栏勾选密码显示,这样就不会明文显示在页面上了: Init方法中添加默认值代码: METHOD wddoinit . DATA lo_nd_zh ...

  2. 关于控制Broker端入站连接数的讨论

    Kafka Broker端处理请求采用Reactor模型.每台Broker上有个类似于Dispatcher的Acceptor线程,还有若干个处理请求的Processor线程(当然真正处理请求逻辑的线程 ...

  3. 《linux就该这么学》课堂笔记06 编写shell脚本、if、for

    1.1.脚本的两种方式 交互式(Interactive):用户每输入一条命令就立即执行. 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令. 1. ...

  4. ELK快速入门(三)logstash收集日志写入redis

    ELK快速入门三-logstash收集日志写入redis 用一台服务器部署redis服务,专门用于日志缓存使用,一般用于web服务器产生大量日志的场景. 这里是使用一台专门用于部署redis ,一台专 ...

  5. Ugly Pairs CodeForces - 1156B

    题目链接:https://vjudge.net/problem/CodeForces-1156B 题意:给定一串字符,相邻字符的ASCII码不能是相邻的数字,比如ABC,假设ASCII码为,99 10 ...

  6. NumPy基本操作快速熟悉

    NumPy 是 Python 数值计算非常重要的一个包.很多科学计算包都是以 NumPy 的数组对象为基础开发的. 本文用代码快速过了一遍 NumPy 的基本操作,对 NumPy 整体有一个把握.希望 ...

  7. maven:读取程序版本号的三种方案

    方案1在应用项目中,如果应用程序需要获取当前程序的版本号,可以读取”/META-INF/maven/${groupId}/${artifactId}/pom.properties“,获取maven生成 ...

  8. python 比较2个文件内容

    1. 通过使用md5字符串比较2个文件 import hashlib def get_file_md5(filename): '''可以比较两个文件的md5值,来比较文件内容.未使用''' md5 = ...

  9. 【Java】Java环境变量配置

    一.windows系统 右键你的电脑(计算机/此电脑)打开属性->高级系统设置->环境变量,在系统变量里配置三个环境变量. 假设jdk的安装路径为C:\Program Files\Java ...

  10. param动作

    param动作通常与forword一起使用 <jsp:forword page="目标页面" > <jsp:param value="参数值" ...