写点什么

基于 Apache MXNet 的开源 BNN (二值神经网络) 库

2019 年 11 月 07 日

基于 Apache MXNet 的开源 BNN (二值神经网络) 库

_这是一篇由德国波茨坦 Hasso Plattner 研究所的 Haojin Yang、Martin Fritzsche、Christian Bartz 和 Christoph Meinel 发布的客座文章。我们很高兴看到研究工作促进了深度学习在低功耗设备上的实际实施。这项工作在将强大的智能功能拓展到我们日常生活的过程中发挥着举足轻重的作用。


_


近年来,深度学习技术在学术界和行业里取得了良好的业绩和众多突破。但是,最先进的深度模型计算成本高昂、占用大量存储空间。移动平台、可穿戴设备、自主机器人、IoT 设备等领域的众多应用也对深度学习有着强烈的需求。如何在这样的低功耗设备上有效实施深度模型成了一大难题。


最近提出的二值神经网络 (BNN) 使用位运算代替标准算术运算,大大降低了存储器大小和访问要求。通过显著提高运行时效率和降低能耗,我们得以在低功耗设备上实施最先进的深度学习模型。这项技术与对开发人员友好 (相比 VHDL/Verilog 而言) 的 OpenCL 相结合,也使 FPGA 成为了深度学习的可行选择。


在这篇文章中,我们将为大家介绍一种基于 Apache MXNet 的开源 BNN (二值神经网络) 库 – BMXNet。开发完成的 BNN 层可以无缝应用于其他标准库组件,并且在 GPU 和 CPU 模式下均可工作。BMXNet 由 Hasso Plattner 研究所的多媒体研究小组维护和开发,在 Apache 许可证下发布。https://github.com/hpi-xnor 提供了该程序库以及一些示例项目和预训练二值模型等下载资源。


框架

BMXNet 提供支持输入数据和权重二值化的激活、卷积和全连接层。这些层称作 QActivationQConvolutionQFullyConnected,经过专门设计,可直接替换相应的 MXNet 变体。它们提供了一个附加参数 act_bit,用于控制层计算的位宽。列表 1 和列表 2 显示了提议的二值层的 Python 使用示例,并与 MXNet 做了对比。我们不为网络中的第一层和最后一层使用二值层,因为这可能会大幅降低准确性。BMXNet 中 BNN 的标准块结构实现为以下列表中显示的 QActivation-QConvolution 或 QFullyConnected-BatchNorm-Pooling。



在传统的深度学习模型中,全连接和卷积层严重依赖于矩阵点积,后者需要进行大量的浮点运算。相比之下,使用二值化权重和输入数据可借助 CPU 指令 xnorpopcount 实现高性能矩阵乘法。大多数现代 CPU 都对此类运算做了优化。计算两个二元矩阵 A◦B 的点积时不再需要乘法运算。可通过以下方法求得 A 中每行与 B 中每列元素的乘积和求和近似值:首先使用 xnor 运算组合这些值,然后统计结果中设置为 1 的位数,这称作位图计数。这样我们就可以充分利用位运算拥有硬件支持这一优势。支持 SSE4.2 的 x86 和 x64 CPU 都提供了位图计数指令;在 ARM 架构中,此指令包含在 NEON 指令集中。列表 3 显示了一个使用这些指令的未优化的 GEMM (通用矩阵乘法) 实现:



gcc 和 clang 编译器都内置了编译器内部函数 popcount,在支持的硬件上,此函数会转换为机器指令。BINARY_WORD 是一种打包数据类型,可存储 32 个 (x86 和 ARMv7) 或 64 个 (x64) 矩阵元素,一位代表一个元素。我们实现了多个优化版本的 xnor GEMM 内核,尝试通过分块和打包数据以及借助循环展开和并行化技术来充分利用处理器缓存的层次结构。


训练和推理

对于训练阶段,我们精心设计了二值化层,以便在将权重及输入限制为离散值 -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。经过我们模型转换器的转换,生成的文件大小仅为 1.5MB,压缩率高达 29 倍。


分类精度

我们对 MNIST (手写数字识别)、CIFAR-10 (图像分类) 数据集进行了 BNN 试验。试验在配备 Intel® Core™ i7-6900K CPU、64 GB RAM 和 4 TITAN X (Pascal) GPU 的工作站上进行。



上表列出了在 MNIST 和 CIFAR-10 上训练的二值和全精度模型的分类测试精度。表中数据显示,二值模型的大小显著降低。同时,准确性仍保持极高水准。此外,我们还对 ImageNet 数据集进行了二值化、部分二值化和全精度模型试验,结果显示,部分二值化模型的结果较为精准,而全二值化模型仍有较大改进空间 (有关更多详情,请参阅我们的论文)。


效率分析

我们进行了一系列试验来测量不同 GEMM 方法的效率。这些试验在配备 Intel 2.50GHz × 4 CPU (支持 popcnt 内部指令 (SSE4.2)) 和 8G RAM 的 Ubuntu16.04/64 位平台上进行。测量在卷积层内进行。我们对参数做了如下设置:filter number=64、kernel size=5×5、batch size=200、matrix sizes (M, N, K) = 64, 12800, kernel_w × kernel_h ×inputChannelSize。下图显示了测试结果。



彩色列表示不同输入通道大小的处理时间 (毫秒);xnor_32 和 xnor_64 表示 32 位和 64 位 xnor gemm 操作数;xnor_64_omp 表示使用 OpenMP 并行编程库加速的 64 位 xnor gemm;二值化输入和 xnor_64_omp 进一步累加了输入数据二值化的处理时间。尽管计入了输入数据的二值化时间,我们的方法仍比 Cblas 方法快 13 倍。


结论

我们介绍了一种使用 C/C++ 基于 MXNet 实现的开源二值神经网络 – BMXNet。在目前的试验中,我们实现了高达 29 倍的模型大小节约和更高效的二元 gemm 计算。我们使用二值化 ResNet-18 模型开发了在 Android 和 iOS 上运行的图像分类示例应用程序。源代码、文档、预训练模型和示例项目发布在 GitHub 上。接下来,我们打算对不同深度架构的准确性和效率进行更系统的探索,重新实现 Q_Conv 层中的 unpack_patch2col 方法,进一步提高 CPU 模式下的推理速度。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/research-spotlight-bmxnet-an-open-source-binary-neural-network-implementation-based-on-mxnet/


2019 年 11 月 07 日 08:00224

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

深入理解Deno是如何借助PowerShell进行安装脚本

梁龙先森

前端 deno shell脚本编写 PowerShell 28天写作

【LeetCode】翻转图像Java题解

HQ数字卡

算法 LeetCode 28天写作 2月春节不断更

抖音春晚红包互动为啥全程无宕机?看完字节内部高并发速成笔记我悟了!

程序员小毕

Java 程序员 高并发 秒杀 字节

面面俱到!阿里SpringBoot全栈宝典新开源,Spring技术入门进阶提升必备!

Java王路飞

Java spring 程序员 面试 springboot

安卓软件开发文献!阿里P8架构师的Android大厂面试题总结,建议收藏

欢喜学安卓

android 程序员 面试 移动开发

Serverless 如何在阿里巴巴实现规模化落地?

Serverless Devs

阿里云 Serverless 云原生 前端

园区网为主的 DNS 架构设计

冯骐

程序员 运维 监控 网络 DNS

架构设计篇之微服务实战笔记(五)

小诚信驿站

架构师 刘晓成 小诚信驿站 成长笔记 28天写作

iOS开发前景

ios

网络编程入门从未如此简单(二):假如你来设计TCP协议,会怎么做?

JackJiang

TCP 网络编程

立足智能化发展,风电能源产业互联网平台加快建设

一只数据鲸鱼

物联网 数据可视化 3D可视化 能源管理 风力发电

Kafka 是怎么存储的?为什么速度那么快?

码农架构

Java kafka 架构·

API策略量化机器人系统开发|API策略量化机器人APP软件开发

开發I852946OIIO

系统开发

细节完美炸裂!GtiHub上点赞已破百万的并发编程四套全彩手册

Java架构追梦

Java 阿里巴巴 架构 面试 并发

Flink 如何实时分析 Iceberg 数据湖的 CDC 数据

Apache Flink

flink

使用PG_STAT_REPLICATION监视复制

PostgreSQLChina

数据库 postgresql 开源 软件 开源社区

第五周作业-流程图及时序图

Au revoir

为什么挤破头进大厂,大厂如何设置薪资职级体系?

不脱发的程序猿

HR 校园招聘 28天写作 二月春节不断更 互联网行业薪资

C语言重要的知识点

c 考核 重要知识 简单清楚 好看

MySQL索引原理,一篇从头到尾讲清楚

云流

数据库 架构

一周信创舆情观察(2.8~2.21)

统小信uos

MT马特量化机器人软件开发|MT马特量化机器人APP系统开发

开發I852946OIIO

系统开发

火山版强势来袭!字节21版Java程序员面试涨薪手册现已开源

周老师

Java 编程 程序员 架构 面试

资深大牛带你了解源码!分析Android未来几年的发展前景,快来收藏!

欢喜学安卓

android 程序员 面试 移动开发

中小公司开展NPS的好处

Geek_459987

拒绝知识碎片化!阿里大牛亲码Java核心技能精讲笔记,系统梳理Java知识体系,金三银四面试必备!

程序员小毕

Java 程序员 架构 面试 分布式

一个员工的离职成本,很恐怖!

不脱发的程序猿

职场 HR 28天写作 二月春节不断更 员工离职

Open-Falcon 中的交换机监控

冯骐

go 运维 监控 网络 交换机

新时代计算机技术

大数据时代

Mr.cool

2021年,是时候把技术债务管理提上日程了

禅道项目管理

效率 产品 创新 技术债

4月17日 HarmonyOS 开发者日·上海站

4月17日 HarmonyOS 开发者日·上海站

基于 Apache MXNet 的开源 BNN (二值神经网络) 库-InfoQ