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. vue2.0 在页面中使用process获取全局路径的时候 报错 process is not defined

    如果是刚配置好的全局变量需要 重新启动一下vue才能通过proccess.env.xxx 获取到 如果想在html中使用 需要在data中声明一个变量 然后在vue生命周期中 将process.env ...

  2. Linux Swap故障之 swapoff failed: Cannot allocate memory

    目录swap分区关闭方法1:释放内存缓存方法2:允许内存overcommit swap分区关闭准备调整Linux下的swap分区的使用率.在Linux下执行 swapoff -a -v报如下错误:sw ...

  3. .NET Core中Quartz.NET的依赖注入

    目录 介绍 项目概况 创建配置文件 使用构造函数注入 使用选项模式 结论 介绍 Quartz.NET是一个方便的库,允许您通过实现IJob接口来安排重复任务.然而,它的局限性在于,默认情况下,它仅支持 ...

  4. PAT 乙级 1007.素数对猜想 C++/Java

    1007 素数对猜想 (20 分) 题目来源 让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数.显然有d​1​​=1,且对于n>1有d​n​​是偶数.“ ...

  5. JQuery学习笔记之属性与样式

    .attr()与.removeAttr() attr()有4个表达式 attr(传入属性名):获取属性的值 attr(属性名, 属性值):设置属性的值 attr(属性名,函数值):设置属性的函数值 a ...

  6. abp记录1

    1在AbpWebApplication中的的构造函数中创建abpBootstrapper 实例,在Application_Start执行AbpBootstrapper值初始化方式 2AbpBootst ...

  7. RxSwift 在本质上简化了开发异步程序

    RxSwift 是一个组合异步和事件驱动编程的库,通过使用可观察序列和功能样式运算符来,从而允许通过调度程序进行参数化执行. RxSwift 在本质上简化了开发异步程序,允许代码对新数据作出反应,并以 ...

  8. idea 将java导出为可执行jar及导入jar依赖

    使用maven可以很好的帮助我们进行依赖的管理,也可以使用maven的jar包打包插件构建出可运行的jar.那针对不是用maven进行管理的普通java项目,可以通过以下方式导出可执行的jar包以及导 ...

  9. benchmarkdotnet docker 运行

    使用docker 运行基准测试是一个不错的选择,可以减少我们环境搭建的时间,同时也可以加速ci/cd 环境准备 docker-compose 文件 version: "3" ser ...

  10. Django 基础篇(二)视图与模板

    视图 在django中,视图对WEB请求进行回应 视图接收reqeust对象作为第一个参数,包含了请求的信息 视图就是一个Python函数,被定义在views.py中 #coding:utf- fro ...