Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

路 王淑婷参与

MXNet开放支持Keras,高效实现CNN与RNN的分布式训练

今日 AWS 发布博客宣布 Apache MXNet 已经支持 Keras 2,开发者可以使用 Keras-MXNet 深度学习后端进行 CNN 和 RNN 的训练,安装简便,速度提升,同时支持保存 MXNet 模型。

感谢 Keras 和 Apache MXNet(孵化)开源项目的贡献者,Keras-MXNet 深度学习后端现已可用。

地址:https://github.com/awslabs/keras-apache-mxnet

Keras 是用 Python 编写的高级神经网络 API,因其快速、简单的 CNN 和 RNN 原型而广受欢迎。

Keras 开发人员现在可以使用高性能的 MXNet 深度学习引擎展开卷积神经网络(CNN)和循环神经网络(RNN)的分布式训练。通过更新几行代码,Keras 开发人员可以利用 MXNet 的多 GPU 分布式训练功能来提高训练速度。保存 MXNet 模型是该版本的另一个宝贵功能。你可以在 Keras 中进行设计,利用 Keras-MXNet 进行训练,并使用 MXNet 在生产中运行大规模推断。

用 Keras 2 和 MXNet 进行分布式训练

本文介绍了如何安装 Keras-MXNet,以及如何训练 CNN 和 RNN。如果你以前使用过其它深度学习引擎进行分布式训练,那你可能了解其中的难度和无趣。本文将展示如何使用 Keras-MXNet 进行训练。

安装仅需几步

1. 部署 AWS 深度学习 AMI

2. 安装 Keras-MXNet

3. 配置 Keras-MXNet

1. 部署 AWS 深度学习 AMI

按照 AWS 深度学习 AMI(DLAMI)部署教程来操作,教程地址:https://aws.amazon.com/getting-started/tutorials/get-started-dlami/。要利用多 GPU 训练示例,请启用 p3.8xlarge 或类似的多 GPU 实例类型。

想安装用于运行 CUDA、Keras、MXNet 和其他框架(如 TensorFlow)的依赖项?请根据 Keras-MXNet 安装指南进行操作:https://github.com/awslabs/keras-apache-mxnet/blob/master/docs/mxnet_backend/installation.md

2. 安装 Keras-MXNet

在 DLAMI 上的 MXnet Conda 环境中安装 Keras-MXnet 及其依赖项。它已经包含 Keras 1.0 版,因此你需要先卸载此版本。登录到 DLAMI 并运行以下命令:

# Activate the MXNet Python 3 environment on the DLAMI
$ source activate mxnet_p36

# Install a dependency needed for Keras datasets
$ pip install h5py

# Uninstall older versions Keras-MXNet
$ pip uninstall keras-mxnet

# Install Keras-MXNet v2.1.6 
$ pip install keras-mxnet

Keras-MXnet 及其依赖项现已安装在 DLAMI 上的 MXnet Conda 环境中。

3. 验证 Keras-MXNet 安装是否正确

使用以下代码验证 Keras 是否正在运行 MXNet 后端:

$ python
>>>import keras as k
   Using MXNet backend

支持 CNN

现在我们在 CIFAR-10 数据集上训练 ResNet 模型,来识别 10 个类别:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。我们可以使用 Keras-MXNet repo 示例部分中的 Keras 2 示例脚本(https://github.com/awslabs/keras-apache-mxnet/blob/master/examples/cifar10_resnet_multi_gpu.py)。使用 MXNet 作为 Keras 的后端几乎不需要对脚本进行什么更新。

首先,从 Keras-MXNet repo 文件夹中下载示例脚本:

$ wget https://raw.githubusercontent.com/awslabs/keras-apache-mxnet/master/examples/cifar10_resnet_multi_gpu.py

脚本启用 multi_gpu_model API,并输入要使用的 GPU 数量。

然后,在终端窗口运行 nvidia-smi,以确定 DLAMI 上可用 GPU 的数量。接下来,如果你有四个 GPU,那么你需要原样运行该脚本;否则,你需要运行以下命令来打开脚本进行编辑:

$ vi cifar10_resnet_multi_gpu.py

该脚本具备以下行,该行定义 GPU 的数量。如有必要,更新该行。

model = multi_gpu_model(model, gpus=4)

现在,开始训练。

$ python cifar10_resnet_multi_gpu.py

(可选)训练过程中,使用 nvidia-smi 命令检查 GPU 利用和内存使用。打开另一个终端会话。

支持 RNN

Keras-MXNet 目前提供对 RNN 的实验性支持。在使用 RNN 和 MXNet 后端时有一些局限性。更多信息,请查看 Keras-MXNet 文档:https://github.com/awslabs/keras-apache-mxnet/blob/master/docs/mxnet_backend/using_rnn_with_mxnet_backend.md。此处的示例包括使用 LSTM 层训练 IMDB 数据集时需要的一些变通方案。尽管有这些方案,但在多 GPU AMI 上训练 RNN 会比你之前的训练经验容易一些,速度也更快。

使用 imdb_lstm 示例脚本:https://github.com/awslabs/keras-apache-mxnet/blob/master/examples/imdb_lstm.py。将输入长度传输到嵌入层,按以下说明设置 unroll=True。

首先,在 DLAMI 的终端会话中,从 Keras-MXNet repo 文件夹中下载示例脚本:

$ wget https://raw.githubusercontent.com/awslabs/keras-apache-mxnet/master/examples/imdb_lstm.py

然后,打开脚本,跳至下列行进行 review:

model.add(Embedding(max_features, 128, input_length=maxlen))
model.add(LSTM(128, unroll=True))

现在,示例脚本已经过修改,可与 MXNet 后端兼容,你可以运行以下行:

$ python imdb_lstm.py

(可选)训练过程中使用 nvidia-smi 命令检查 GPU 利用和内存使用。打开另一个终端会话进行该操作。

基准

为了帮助大家评估不同 Keras 后端的性能,AWS 向 Keras-MXNet 添加了一个基准模块。按表中描述在 CPU、单个 GPU 和多 GPU 上使用不同的模型和数据集,你会发现 Keras-MXNet 训练 CNN 的速度更快,且在多个 GPU 上实现高效的性能提升。详见训练速度柱状图。关于如何运行基准脚本以及生成详细的基准结果,详见 Keras Benchmarks readme 文档:https://github.com/awslabs/keras-apache-mxnet/tree/master/benchmark

基准配置

  • Keras Version 2.1.6

  • MXNet Version 1.2.0

  • Image Data Format: Channel first

训练 CIFAR10 数据集导致子线性缩放,因为该数据集图像更小。CIFAR10 数据集包含 5 万张图像,每张图像的大小是 32×32 像素。使用四个 GPU 传输这些小图像所需的通信开销比使用八个 GPU 的开销高。ImageNet 和合成数据数据集更好地展示了 Keras-MXNet 可能带来的性能改进。详见下表。

使用 Keras-MXNet图像处理速度对比

接下来

尝试其他的 Keras-MXNet 教程或阅读版本注释。

原文链接:https://aws.amazon.com/cn/blogs/machine-learning/apache-mxnet-incubating-adds-support-for-keras-2/

工程MXNetKeras
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

卷积技术

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

图像处理技术

图像处理是指对图像进行分析、加工和处理,使其满足视觉、心理或其他要求的技术。 图像处理是信号处理在图像领域上的一个应用。 目前大多数的图像均是以数字形式存储,因而图像处理很多情况下指数字图像处理。

MXNet技术

MXNet是开源的,用来训练部署深层神经网络的深度学习框架。它是可扩展的,允许快速模型训练,并灵活支持多种语言(C ++,Python,Julia,Matlab,JavaScript, Go,R,Scala,Perl,Wolfram语言)

推荐文章
暂无评论
暂无评论~