写点什么

使用 NNPACK 库加速 Apache MXNet

  • 2019-10-31
  • 本文字数:2958 字

    阅读完需:约 10 分钟

使用 NNPACK 库加速 Apache MXNet

Apache MXNet 是供开发人员构建、训练和重复使用深度学习网络的开源库。在这篇博文中,我将向您介绍如何使用 NNPACK 库来加速推理。事实上,当 GPU 推理不可用时,要想从实例中获取更多性能,将 NNPACK 添加到 Apache MXNet 中或许不失为一种简单的方法。和往常一样,“您的情况可能会有所不同”,而且您应该始终运行自己的测试。


在我们开始之前,先来了解一些训练和推理的基础知识吧。

培训

_训练_是神经网络学习如何正确预测数据集中各个示例的正确标签的步骤。每次一批 (通常包含 32 到 256 个示例),数据集被馈送到网络中,通过反向传播算法调整权重以减少总误差。


浏览完整的数据集被称为 epoch。大型网络可能会接受数百个 epoch 的训练,以达到尽可能最高的准确度。这可能需要几天甚至几周的时间。GPU 具有强大的并行处理能力,即使与最强大的 CPU 相比,训练时间也可以大大缩短。

推理

_推理_是实际使用经过训练的网络预测新数据示例的步骤。您可以一次预测一个示例,例如像 Amazon Rekognition 一样尝试识别单个图像中的对象,或者在处理来自多个用户的请求时可以一次预测多个示例。


当然,GPU 在推理方面同样十分高效。然而,许多系统由于成本、功耗或外形尺寸限制而无法容纳 GPU。因此,能够快速运行基于 CPU 的推理仍然是一个重要的课题。这正是 NNPACK 库发挥作用的地方,它可以帮助我们在 Apache MXNet 中加速 CPU 推理。

NNPACK 库

NNPACK 是一个可在 GitHub 上使用的开源库。它将如何帮助我们呢?您肯定了解卷积神经网络。这些网络由多个层构建,应用卷积和池来检测输入图像中的特征。


在这篇文章中,我们不涉及实际理论,而是介绍 NNPACK 如何以高度优化的方式实施这些操作 (以及其他一些操作,如矩阵乘法)。如果您对基础理论感兴趣,请参阅这篇 Reddit 帖子的作者提到的研究论文。


NNPACK 可应用于 Linux 和 MacOS X 平台之上。它针对采用 AVX2 指令集的 Intel x86-64 处理器以及采用 NEON 指令集的 ARMv7 处理器和 ARM v8 处理器进行了优化。


在这篇文章中,我使用了运行 Deep Learning AMI 的 c5.9xlarge 实例。以下是我们将要执行的操作:


  • 从源代码构建 NNPACK 库。

  • 使用 NNPACK 从源代码构建 Apache MXNet

  • 使用各种网络运行一些图像分类基准


让我们开始吧。

构建 NNPACK

NNPACK 使用 Ninja 构建工具。但是 Ubuntu 存储库并没有托管最新的版本,所以我们也需要从源代码进行构建。


Bash


cd ~git clone git://github.com/ninja-build/ninja.git && cd ninjagit checkout release./configure.py --bootstrapsudo cp ninja /usr/bin
复制代码


现在,让我们按照以下说明来准备 NNPACK 的构建。


Bash


cd ~sudo -H pip install --upgrade git+https://github.com/Maratyszcza/PeachPysudo -H pip install --upgrade git+https://github.com/Maratyszcza/confugit clone https://github.com/Maratyszcza/NNPACK.gitcd NNPACKconfu setuppython ./configure.py
复制代码


在实际构建之前,我们需要调整一下配置文件。因为 NNPACK 只是作为一个静态库来构建,而 MXNET 则是作为一个动态库来构建的。也就是说他们将不能正确连接。MXNet 文档建议使用旧版 NNPACK,不过还有另一种方法。


我们需要编辑 build.ninja 文件和“-fPIC”标志,以便将 C 和 C ++ 文件构建为与位置无关的代码,这其实就是我们与 MXNet 共享库连接所需要的全部内容。


Bash


cflags = -std=gnu99 -g -pthread -fPICcxxflags = -std=gnu++11 -g -pthread -fPIC
复制代码


现在,我们来构建 NNPACK 并运行部分基本测试。


Bash


ninjaninja smoketest
复制代码


我们完成了 NNPACK 构建。您应该可以在 ~/NNPACK/lib 中看到这个库。

使用 NNPACK 构建 Apache MXNet

首先,我们安装 dependency 以及最新的 MXNet 源代码 (撰写本文时为 0.11.0-rc3)。详细的构建说明请参阅 MXNet 网站


Bash


cd ~sudo apt-get install -y libopenblas-dev liblapack-dev libopencv-devgit clone --recursive https://github.com/apache/incubator-mxnet.gitcd incubator-mxnet/git checkout 1.0.0
复制代码


现在,我们需要配置 MXNet 构建。您应该编辑 make/config.mk 文件并设置以下变量,以便在构建中包含 NNPACK 以及之前安装的 dependency。只需复制文件末尾的所有内容。


Bash


NNPACK = /home/ubuntu/NNPACK# the additional link flags you want to addADD_LDFLAGS = -L$(NNPACK)/lib/ -lnnpack -lpthreadpool# the additional compile flags you want to addADD_CFLAGS = -I$(NNPACK)/include/ -I$(NNPACK)/deps/pthreadpool/include/
USE_NNPACK=1USE_BLAS=openblasUSE_OPENCV=1
复制代码


现在,我们准备构建 MXNet。我们的实例有 36 个 vCPU,让我们来好好利用它们吧。


Bash


make -j72
复制代码


大约四分钟后,构建完成。让我们来安装全新的 MXNet 库及其 Python binding。


Bash


sudo apt-get install -y python-dev python-setuptools python-numpy python-pipcd pythonsudo -H pip install --upgrade pipsudo -H pip install -e .
复制代码


我们可以在 Python 中导入 MXNet,从而快速检查是否有合适的版本。


Bash


Python 2.7.12 (default, Nov 20 2017, 18:23:56)[GCC 5.4.0 20160609] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import mxnet>>> mxnet.__version__'1.0.0'
复制代码


一切准备完毕。可以运行部分基准了。

基准测试

用几张图像进行基准测试并不能让我们就 NNPACK 是否发挥效用得出可靠的判断。不过幸好 MXNet 源代码包含一个基准测试脚本,可以通过以下模型以各种批处理大小提供随机生成的图像:AlexNet、VGG16、Inception-BN、Inception v3、ResNet-50 和 ResNet-152。当然,这里的重点不是执行预测,而只是测算推理时间。


在我们开始之前,需要在脚本中修复一行代码。我们的实例没有安装 GPU (这是关键问题),而且脚本无法正确检测到这一事实。以下是需要在 ~/incubator-mxnet/example/image-classification/benchmark_score.py 中做出的修改。执行到这里时,让我们来添加其他批处理大小。


Bash


#devs = [mx.gpu(0)] if len(get_gpus()) > 0 else []devs = []devs.append(mx.cpu())batch_sizes = [1, 2, 4, 8, 16, 32, 64, 128, 256]
复制代码


可以运行部分基准了。我们对 NNPACK 使用八个线程,这是最大的推荐值。


Bash


cd ~/incubator-mxnet/example/image-classification/export MXNET_CPU_NNPACK_NTHREADS=8python benchmark_score.py
复制代码


作为参考,我也在运行 vanilla MXNet 1.0 的相同实例上运行了相同的脚本。以下图表显示了每秒图像数量与批处理大小的关系。您肯定可以猜测得到,每秒的图像数量越多越好。


您可以看到,NNPACK 为 AlexNet、VGG 和 Inception-BN 的加速非常明显,尤其是单个图像推理 (速度提高了 4 倍之多)。


注意:由于本文讨论范围以外的原因,Inception v3 和 ResNet 没有加速,所以我没有提供这些网络的图表。



结论

希望您能够喜欢这篇文章,也期待您的反馈。如需了解有关深度学习和 Apache MXNet 内容的更多信息,请在 MediumTwitter 上关注我。


作者介绍:



Julien 一直致力于在欧洲、中东和非洲大力传播人工智能和机器学习。他倾尽全力帮助开发人员和企业实现自己的想法。闲暇之余,他反复地徜徉在 JRR Tolkien 的作品之中。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/speeding-up-apache-mxnet-using-the-nnpack-library/


2019-10-31 08:00767

评论

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

Spring Cloud入门教程-使用Hystrix Dashboard 监控熔断器的状态

爱好编程进阶

Java 面试 后端开发

计算机存储层次简析

懒时小窝

计算机基础

《零基础》MySQL 连接(四)

爱好编程进阶

Java 面试 后端开发

【并发编程系列10】阻塞队列之SynchronousQueue

爱好编程进阶

Java 面试 后端开发

【并发编程系列1】Thread生命周期及interrupted()作用分析

爱好编程进阶

Java 面试 后端开发

简单实用的redis分布式锁

Rubble

4月日更 4月月更

STM32+华为云IoTDA,带你设计一个属于自己的动态密码锁

华为云开发者联盟

stm32 iotda 华为云IoT 密码锁 Qt框架

聚焦供应链布局,新能源汽车企业重塑产业核心竞争能力

数商云

数字化转型 供应链 新能源汽车

SpringBoot+WebSocket实时监控异常

爱好编程进阶

Java 面试 后端开发

小程序能当成 App 吗?

FinClip

2022年提高远程工作效率的三大实用技巧汇总

行云管家

远程办公 居家办公 办公软件

macOS系统病毒常见的两种传播途径

火绒安全

macos 终端安全 勒索病毒 蠕虫

java高级用法之:JNA中的Function

程序那些事

Java Netty 程序那些事 4月月更

【源码分析设计模式 10】SpringMVC中的建造者模式

爱好编程进阶

Java 面试 后端开发

RadonDB MySQL on K8s 2.1.4 发布!

RadonDB

MySQL 数据库 Kubernetes 高可用 RadonDB

“双碳”下的建筑业:未来10年必须重视这5大方向

WorkPlus

云图说丨叮咚,您有一份短信通关攻略待查收

华为云开发者联盟

短信 签名 消息 签名模板 MSGSMS

“东数西算”超级工程利好云计算,多云管理背后却暗藏汹涌!

行云管家

云计算 多云 东数西算 云管

YonMaster开发者认证线上赋能培训班定档4月18日

YonBuilder低代码开发平台

WeTest平台产品&技术合作伙伴招募

WeTest

Vue 学习笔记(3)路由的基本使用 结合 SpringBoot

爱好编程进阶

Java 面试

Tiger DAO VC:DAO组织风险投资时代来临

西柚子

jackson学习之十(终篇):springboot整合(配置类)

程序员欣宸

Java web 4月月更

SSM 最简单最全面的整合Spring+SpringMVC+Mybatis三大框架 快速搭建

爱好编程进阶

Java 面试 后端开发

阿里云视频云人脸生成领域最新研究成果入选CVPR2022

阿里云视频云

计算机视觉 视频编码 CVPR 视频云

来也科技收购Mindsay背后:新旧势力交锋智能自动化备受关注

王吉伟频道

RPA 收购 机器人流程自动化 来也科技 Mindsay

Spring(十)

爱好编程进阶

面试 后端开发Java

Tiger DAO VC:将你的风险投资变成DAO组织协同

小哈区块

thinkphp5框架新建页面相关规范详解

CRMEB

TASKCTL调度服务(主/从)代理节点的启动和停止

敏捷调度TASKCTL

数据仓库 kettle 调度引擎 ETL 调度任务

SpringBoot系列:RabbitMq讲解与示例

爱好编程进阶

Java 面试 后端开发

使用 NNPACK 库加速 Apache MXNet_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章