Category: Apache MXNet on AWS*


推出适用于 Apache MXNet 的模型服务器

本周早些时候,AWS 宣布推出适用于 Apache MXNet 的模型服务器,这是构建于 Apache MXNet 上的开源组件,用于处理深度学习模型。Apache MXNet 是一种可快速进行训练和推理的可扩展框架,具有易于使用、简明扼要的机器学习 API。工程师们现在可以利用适用于 Apache MXNet 的模型服务器,轻松、快速地对 MXNet 模型进行大规模处理。

什么是适用于 Apache MXNet 的模型服务器?

适用于 Apache MXNet 的模型服务器 (MMS) 是一种开源组件,旨在简化深度学习推理模型的大规模部署任务。部署推理模型并不是无关紧要的任务。它需要收集各种模型构件、设置处理堆栈、初始化并配置深度学习框架、公开终端节点、发送实时指标,以及运行自定义预处理和后处理代码,而这只是众多工程任务中的几项。虽然每项任务都不是特别复杂,但与部署模型相关的所有工作足以使部署过程变得缓慢而繁琐。

MMS 是 AWS 贡献的一款适用于 Apache MXNet 的开源工程工具集,可以极大地简化部署深度学习模型的过程。如果您使用 MMS 部署模型,可以使用以下主要功能:

  • 将所有模型构件打包并导出为单一“模型存档”文件 (其中封装了处理 MXNet 模型的所有必要内容) 的工具作业。
  • 自动设置处理堆栈,其中包括 HTTP 推理终端节点、基于 MXNet 的引擎,所有组件均根据处理的具体模型进行自动配置。
  • 预配置的 Docker 镜像,利用 NGINX、MXNet 和 MMS 进行设置,以实现可扩展的模型处理。
  • 能够自定义推理执行管道中的每个步骤,从模型初始化到预处理和推理,再到对模型输出的后处理。
  • 用于监控推理服务和终端节点的实时运行指标,涵盖延迟、资源利用率和错误。
  • 支持 OpenAPI 规范,可实现轻松集成和自动生成热门堆栈的客户端代码,例如 Java、JavaScript、C# 等等。

可通过 PyPi 程序包使用 MMS,或直接通过模型服务器 GitHub 存储库使用 MMS,它可在 Mac 和 Linux 上运行。对于可扩展的生产使用案例,我们建议使用 MMS GitHub 存储库中提供的预配置 Docker 镜像

下图演示了示例参考架构:

模型处理快速启动

MMS 很容易入门,我们将在以下示例中进行展示。此示例利用了经过预训练的 SqueezeNet v1.1 目标物检测模型,该模型在 MMS Model Zoo 中公开提供。

要开始使用,您需要具有 Python,这是使用 MMS 的唯一先决条件。如果您未安装 Python,请根据 Python 网站上的说明,安装 Python 2.7 或 3.6。

接下来,使用 PyPi 在您所选的机器上安装 MMS。MMS 支持 Mac 和 Linux 操作系统。

$ pip install mxnet-model-server

只需要运行 MMS 并向其提供模型存档 URL 或本地文件,即可完成模型的处理:

$ mxnet-model-server --models squeezenet=https://s3.amazonaws.com/model-server/models/squeezenet_v1.1/squeezenet_v1.1.model

执行此命令后,MMS 处理将启动:下载并解压缩模型存档,使用模型构件配置服务,并开始在 /squeezenet/predict 终端节点的 localhost、端口 8080 上侦听传入请求 (可配置主机和端口)。

为了测试您新建的服务,让我们通过 HTTP 发送一个推理请求,要求模型对一个图像进行分类:

$ curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
$ curl http://127.0.0.1:8080/squeezenet/predict -F "input0=@kitten.jpg"

您将会看到与以下内容类似的一条响应,模型识别出图像中的目标物是一只“埃及猫”,概率为 85%。成功啦!

{
  "prediction": [
    [
      {
        "class": "n02124075 Egyptian cat",
        "probability": 0.8515276312828064
      },
… (other lower probability predictions) …
}

要深入了解模型处理,请查看服务器文档

导出用于处理的模型

MMS 可处理以 MMS 模型存档格式打包的模型。它包括命令行界面 mxnet-model-export ,用于打包模型构件并导出为单一模型存档文件。导出的模型存档封装了处理模型所需的所有构件和元数据,MMS 在初始化处理终端节点时会用到它。进行处理无需其他模型元数据或资源。

下图阐明了导出过程:

如图所示,打包模型存档所需的必要构件是模型的神经网络架构和参数 (层、运算符和权重),以及服务输入和输出数据类型和张量形状定义。但是,在真实的使用案例中使用模型需要的可不只是神经网络。例如,在为模型提供图像前,许多视觉模型需要对输入图像进行预处理和转换。另一个示例是分类模型,通常需要进行后处理,以便对分类结果进行排序和截断。为了应对这些需求,并将模型完全封装到模型存档中,MMS 可以将自定义处理代码以及所有辅助文件打包到存档中,并在运行时提供这些文件。利用这一强大机制,您可以生成封装了整个处理管道的模型存档:从预处理输入到自定义推理,并在网络输出通过网络返回客户端之前应用类别标签标识符。

要了解有关模型存档导出的更多信息,请查看 MMS 导出文档

了解更多信息并做出贡献

MMS 的设计宗旨是易于使用、灵活和可扩展。除了此篇博文中提到的内容,它还提供其他功能,包括处理终端节点的配置、实时指标和日志、预配置容器映像等。

要了解有关 MMS 的更多信息,我们建议您首先参阅我们的 Single Shot MultiBox Detector (SSD) 教程,您可以通过它了解到如何导出并处理 SSD 模型。在存储库的文档文件夹中提供了更多示例和其他文档。

我们欢迎您以提问、提出请求的方式参与社区讨论并做出贡献,帮助我们进一步开发和扩展 MMS。请访问 awslabs/mxnet-model-server 存储库,开始使用!


补充阅读

了解有关 AWS 和 MXNet 的更多信息!


作者简介

Hagay Lupesko 是 AWS 深度学习的工程经理。他专注于构建让开发人员和科学家能够创造智能应用程序的深度学习工具。在业余时间,他喜欢阅读、徒步旅行以及与家人共享天伦之乐。

Ruofei Yu 是 AWS 深度学习的软件工程师。他专注于为软件工程师和科学家构建创新的深度学习工具。在业余时间,他喜欢与朋友和家人共度美好时光。

Yao Wang 是 AWS 深度学习的软件工程师。他专注于为软件工程师和科学家构建创新的深度学习工具。在业余时间,他喜欢徒步旅行、阅读和听音乐。

十二月

十一月

十月

九月

八月

七月

六月

五月

四月

二月

一月

2016


如何在1个小时之内轻松构建一个Serverless 实时数据分析平台    30 Dec

AWS Limit Monitoring ——书到用时方恨少,资源提限需趁早!    29 Dec

Amazon Polly – 支持47种语音与24种语言的文本到语音转换服务  19 Dec

开发者预览版——EC2实例(F1)携手可编程硬件    19 Dec

Amazon Lex – 构建对话语音与文本界面    15 Dec

如何在AWS上安装使用分布式TensorFlow    13 Dec

New feature launched to AWS China (BJS) region, operated by SINNET – Amazon RDS for SQL Server – Support for Native Backup/Restore to Amazon S3    5 Dec

由光环新网运营的AWS中国北京(BJS)区域现推出新RDS功能–支持SQL Server 本机备份/还原到Amazon S3   27 Nov

Amazon S3 和 Amazon Glacier 降价    27 Nov

构建健壮的混合云网络——BJS DX+VPN篇    23 Nov

构建健壮的混合云网络——BJS DX篇    23 Nov

构建健壮的混合云网络——BJS VPN篇    23 Nov

GPU为 Amazon Graphics WorkSpaces 提供助力    21 Nov

Amazon QuickSight全面上线——更快更易用的大数据商务分析服务    21 Nov

Amazon EC2 产品价格调降通知(C4,M4, 和T2实例)    21 Nov

利用 CloudWatch 搭建无人值守的监控预警平台    16 Nov

一键搞定云端网络环境,让您轻松迁移至AWS!    9 Nov

程序员的深度学习入门指南    07 Nov

如何在 AWS上构建基于 OpenSwan 的软件 VPN 解决方案    01 Nov

AWS的在线云计算专家,你用了吗?    31 Oct

CloudFront常见错误配置及解决方法    25 Oct

使用DMT工具迁移北京区域的数据库    18 Oct

VPC中NAT的那点事     17 Oct

CloudWatch Events监控您应用的安全    8 Oct

Oracle数据库迁移到AWS云的方案    28 Sep

使用AWS的数据库迁移DMS服务    28 Sep

手把手教你使用Amazon EMR进行交互式数据查询    27 Sep

使用Oracle Data Pump将数据库迁移到AWS的RDS Oracle数据库    26 Sep

手把手教你快速部署流量压测工具 – Bees with Machine Guns    26 Sep

优秀的领导者如何更进一步迈向伟大?    24 Sep

现代IT高管已然化身首席变革管理官    24 Sep

利用云方案进行实验时的四要与四不要    24 Sep

来自成功云企业的十项诀窍    24 Sep

助你决胜云时代的人才其实近在眼前    13 Sep

手把手教你如何用Lambda + Alexa调用echo设备    01 Sep

AWS Kinesis的Javascript交互方法    25 Aug

基于AWS 平台跳板机配置    08 Aug

如何使用AWS 命令行分段上传大文件    02 Aug

我喜欢我的Amazon WorkSpaces    02 Aug

算法改变世界 - 从Prisma 的走红说开去    02 Aug

为员工进行云培训时的11条箴言    07 Jul

畅谈CIO该如何合并业务和技术    07 Jul

协同合作伙伴 合力加速上云战略    07 Jul

在云端试验时的“有所为和有所不为”    07 Jul

专线直连AWS建立混合IT环境实务指南    01 Jul

手把手教你调校AWS PB级数据仓库    20 Jun

Token Vending Machine:移动应用客户端安全访问AWS服务的解决方案    20 Jun

分布式神经网络框架 CaffeOnSpark在AWS上的部署过程    16 Jun

打造DIY版Echo:树莓派+ Alexa 语音服务    01 Jun

使用Docker封装IPSec安全网关    30 May

将VMware 中的Ubuntu 12.04 映像导入成Amazon EC2 AMI    30 May

如何使用AWS Auto-reboot和Auto-recovery进一步提升单机高可用    16 May

AWS CTO对过去十年的经验总结 – 十条军规    12 Apr

AWS上的游戏服务:Lumberyard + Amazon GameLift + Twitch    12 Apr

为AWS北京区管理控制台集成ADFS访问    12 Apr

AWS的十年创新之路    12 Apr

空荡的数据中心,120种妙用!    12 Apr

媒体洞察 | 让企业自由发展的云时代    12 Apr

亚马逊 风力发电厂在福勒岭启动了!    12 Apr

使用 Amazon EMR 上的 Apache MXNet 和 Apache Spark 进行分布式推理

在这篇博客文章中,我们将演示如何使用 Amazon EMR 上的 Apache MXNet (孵化) 和 Apache Spark 对大型数据集运行分布式离线推理。我们将说明离线推理如何起作用、为何离线推理具有挑战性以及如何利用 Amazon EMR 上的 MXNet 和 Spark 来应对这些挑战。

大型数据集上的分布式推理 – 需求与挑战

在进行有关深度学习模型的培训后,可以对新数据上运行推理了。可对需要即时反馈的任务 (如欺诈检测) 执行实时推理。这通常称作在线推理。或者,也可在预计算有用时执行离线推理。离线推理的常用案例是用于具有低延迟要求的服务,例如,要求对许多用户-产品分数进行排序和排名的推荐系统。在这些情况下,将使用离线推理来预计算推荐。结果将存储在低延迟存储中,而且将按需使用存储中的推荐。离线推理的另一个使用案例是使用从先进模型中生成的预测回填历史数据。作为一个假想的示例,报纸可利用此设置来使用从人员检测模型中预测的人员姓名回填已存档的照片。分布式推理还可用于基于历史数据测试新模型以验证这些模型在部署到生产之前是否会产生更好的结果。

通常,会在跨数百万条或更多记录的大型数据集上执行分布式推理。在合理的时间范围内处理这类大规模数据集需要一组计算机设置和深度学习功能。借助分布式群集,可使用数据分区、批处理和任务并行化来进行高吞吐量处理。但是,设置深度学习数据处理群集会面临一些挑战:

  • 群集设置和管理:设置和监控节点、维护高可用性、部署和配置软件包等。
  • 资源和作业管理:计划和跟踪作业、对数据进行分区和处理作业失败。
  • 深度学习设置:部署、配置和运行深度学习任务。

接下来,本博客文章将介绍如何使用 Amazon EMR 上的 MXNet 和 Spark 来应对这些挑战。

使用 MXNet 和 Spark 进行分布式推理

利用 Amazon EMR,可轻松、经济高效地使用 Spark 和 MXNet 来启动可扩展群集。Amazon EMR 按秒计费,并且可使用 Amazon EC2 竞价型实例来降低工作负载的成本。

Amazon EMR 与 Spark 相结合,可简化群集和分布式作业管理的任务。Spark 是一种群集计算框架,支持各种数据处理应用程序。Spark 还可跨群集对数据进行高效分区以实现处理的并行化。Spark 与 Apache Hadoop 生态系统及多个其他大数据解决方案紧密集成。

MXNet 是一种快速且可扩展的深度学习框架,该框架已针对 CPU 和 GPU 上的性能进行优化。

我们将演练使用 Amazon EMR 上的 Spark 和 MXNet 在大型数据集上设置和执行分布式推理的步骤。我们将使用 MXNet model zoo 上提供的预训练的 ResNet-18 图像识别模型。我们将对包含 60000 张彩色图像的公开可用的 CIFAR-10 数据集运行推理。该示例演示的是在 CPU 上运行的推理,但您可以轻松将其扩展为使用 GPU。

以下列表包含设置和执行的高级步骤,并且以下部分将详述这些步骤:

  • 在 Amazon EMR 上设置 MXNet 和 Spark。
  • 初始化 Spark 应用程序。
  • 在群集上加载数据并对数据进行分区。
  • 提取数据并将数据加载到 Spark 执行程序中。
  • 在执行程序上使用 MXNet 进行推理。
  • 收集预测。
  • 使用 spark-submit 运行 Inference 应用程序。
  • 监控 Spark 应用程序。

Amazon EMR 上的 MXNet 和 Spark 群集设置

我们将使用 Amazon EMR 创建带 Spark 和 MXNet 的群集,可使用 EMR 5.10.0 将该群集安装为应用程序。我们将使用 AWS CLI 创建包含 4 个 c4.8xlarge 类型的核心实例和 1 个 m3.xlarge 类型的主实例的群集,但您也可以使用 Amazon EMR 控制台创建该群集。

用于创建群集的命令如下所示。我们假设您拥有创建该命令的正确凭证。

aws emr create-cluster \
--applications Name=MXNet Name=Spark \
--release-label emr-5.10.0 \
--service-role EMR_DefaultRole \
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=<YOUR-KEYPAIR>,SubnetId=<YOUR-SUBNET-ID> \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.xlarge \
InstanceGroupType=CORE,InstanceCount=4,InstanceType=c4.8xlarge \
--log-uri 's3n://<YOUR-S3-BUCKET-FOR-EMR-LOGS>/' \
--bootstrap-actions Name='install-pillow-boto3',Path=s3://aws-dl-emr-bootstrap/mxnet-spark-demo-bootstrap.sh \
--region <AWS-REGION> \
--name "mxnet-spark-demo"

替换以下参数:

  • <YOUR-KEYPAIR> – 您的用于通过 SSH 登录主实例的 Amazon EC2 密钥对。
  • <YOUR-SUBNET-ID> – 在其中启动群集的子网。您必须传递此参数以创建高计算实例,如 c4.8xlarge
  • <AWS-REGION> – 要在其中启动群集的 AWS 区域
  • <YOUR-S3-BUCKET-FOR-EMR-LOGS> – 应将 EMR 日志存储到的 S3 存储桶。

--bootstrap-actions 用于安装 Git、Pillow 和 Boto 库。

请参阅 AWS 文档以了解有关创建和使用 IAM 角色 (设置 Amazon EMR 群集所需) 的更多信息。

下面将讨论的代码段位于 mxnet-spark 文件夹下的 deeplearning-emr GitHub 存储库中。它包含用于使用 MXNet 和 Spark 运行推理的完整代码。我们还将在后续部分之一中讨论如何使用 spark-submit 提交 Spark 应用程序。 GitHub 存储库中的 mxnet-spark 文件夹包含以下 3 个文件:

  • infer_main.py,此文件包含要在驱动程序上运行的代码;
  • utils.py,此文件包含几个辅助标记方法;
  • mxinfer.py,此文件包含用于在工作程序节点上下载模型文件、将字节加载到 numpy 以及在一批图像上运行预测的代码。

初始化

我们将使用 PySpark (Spark 的 Python 接口) 创建我们的应用程序。Spark 应用程序包含一个运行用户的主函数的驱动程序以及一个或多个并行运行各种任务的执行程序进程。

为执行 Spark 应用程序,该驱动程序会将工作拆分为多个作业。每个作业会进一步拆分为多个阶段,而每个阶段包含一系列并行运行的独立任务。任务是 Spark 中的最小工作单元并且执行相同代码,每个任务位于不同的数据分区 (大型分布式数据集的逻辑数据块) 中。

图像所有权: Apache Spark 文档

Spark 提供一个用于处理分布式数据集的抽象,即弹性分布式数据集 (RDD)。RDD 是一个已跨可并行操作的群集分区的对象的不可变的分布式集合。可通过并行处理集合或外部数据集来创建 RDD。

从较高的层面来说,分布式推理应用程序的管道如下所示:

默认情况下,Spark 在执行程序上为每个内核创建一个任务。由于 MXNet 具有内置的并行机制来有效使用所有 CPU 内核,因此,我们会将应用程序配置为仅为每个执行程序创建一个任务并让 MXNet 在该实例上使用所有内核。在以下代码中,我们将配置密钥 spark.executor.cores 设置为 1,然后在创建 SparkContext 时传递 conf 对象。在提交应用程序时,您将看到我们还将执行程序数设置为群集上可用的工作程序数。这使每个节点均有一个执行程序并关闭执行程序的动态分配。

conf = SparkConf().setAppName("Distributed Inference using MXNet and Spark")
conf.set('spark.executor.cores', '1')

sc = pyspark.SparkContext(conf=conf)
logger.info("Spark Context created")

在群集上加载数据并对数据进行分区

我们已将 CIFAR-10 数据复制到 Amazon S3 存储桶 mxnet-spark-demo。由于可在所有节点上访问存储在 S3 中的数据,因此,我们无需在驱动程序与执行程序之间移动数据。我们仅在驱动程序上提取 S3 密钥并使用 boto 库创建密钥的 RDD,后者是用于访问 AWS 服务的 Python 接口。此 RDD 将进行分区并分发到群集中的执行程序,并且我们将在这些执行程序上直接提取并处理少量图像。

我们将使用辅助标记方法 fetch_s3_keys (来自 utils.py) 以从 Amazon S3 存储桶获取所有密钥。此方法还采用一个前缀以列出以该前缀开头的密钥。在提交主应用程序时将传递这些参数。

s3_client = get_s3client(args['access_key'], args['secret_key'])
keys = fetch_s3_keys(args['bucket'], args['prefix'], s3_client)

args['batch'] 决定的批处理大小是在每个执行程序上可一次性提取、预处理和运行推理的图像的数量。这受每个任务可用的内存量的约束。 args['access_key']args['secret_key'] 是可选参数,用于在使用正确权限设置实例角色的情况下访问其他账户中的 S3 存储桶。该脚本将自动使用在启动时分配给群集的 IAM 角色。

我们会将密钥的 RDD 拆分为多个分区,其中每个分区均包含小批量图像密钥。如果密钥无法划分为多个批处理大小的分区,我们将填充最后一个分区以重用其中一些初始密钥组。这是必需的,因为我们将绑定 (请参阅以下代码) 到固定批处理大小。

n_partitions = n_keys // args['batch']
# if keys cannot be divided by args['batch'] .
if (n_partitions * args['batch'] != n_keys):
  keys.extend(keys[: args['batch'] - (n_keys - n_partitions * args['batch'])])
  n_partitions = len(keys) // args['batch']

rdd = sc.parallelize(keys, num_slices=n_partitions)

提取数据并将数据加载到 Spark 执行程序中

在 Apache Spark 中,您可以在 RDD 上执行两类操作。转换对一个 RDD 中的数据运行并创建新的 RDD,而操作计算 RDD 中的结果。

RDD 上的转换已延时评估。即,Spark 将不会执行转换直到它看到操作,相反,Spark 会通过创建有向无环图来跟踪不同的 RDD 之间的依赖项,这些依赖项会引导操作以形成执行计划。这有助于按需计算 RDD 并在 RDD 的分区丢失时执行恢复。

我们将使用 Spark 的 mapPartitions,该项提供分区记录的迭代器。转换方法对 RDD 的每个分区 (数据块) 单独运行。我们将使用来自 utils.py 的 download_objects 方法作为 RDD 分区上的转换,以将该分区的所有图像从 Amazon S3 下载到内存中。

sc.broadcast(args['bucket'])
rdd = rdd.mapPartitions(lambda k : download_objects(args['bucket'], k))

我们将运行其他转换以使用 Python Pillow – Python Imaging Library 将内存中的每个图像转换为 numpy 数组对象。我们使用 Pillow 对内存中的图像 (采用 png 格式) 进行解码并将其转换为 numpy 对象。此操作在 mxinfer.py 的 read_images 和 load_images 中完成。

rdd = rdd.mapPartitions(load_images)
def load_images(images):
    """
    Decodes batch of image bytes and returns a 4-D numpy array.
    
    """    
    import numpy as np
    batch = []
    for image in images:
        img_np = readImage(image)
        batch.append(img_np)

    batch_images = np.concatenate(batch)

    logger.info('batch_images.shape:%s'%(str(batch_images.shape)))

    return batch_images

def readImage(img_bytes):
    """
    Decodes an Image bytearray into 3-D numpy array.
    
    """
    from PIL import Image
    import numpy as np
    import io
    from array import array
    img = io.BytesIO(bytearray(img_bytes))
    # read the bytearray using OpenCV and convert to RGB
    img = Image.open(img)
    img = img.convert('RGB')
    #resize the image to 224x224
    img = img.resize((224, 224), Image.ANTIALIAS)    
    # reshape the array from (height, width, channel) to (channel, height, width)  
    img = np.swapaxes(img, 0, 2)
    img = np.swapaxes(img, 1, 2)
    # add a new axis to hold a batch of images.
    img = img[np.newaxis, :]
    return img

注意:在此应用程序中,您将看到我们正在 mapPartitions 函数内部而不是文件顶部导入模块 (numpy、mxnet、pillow 等)。这是因为,PySpark 将尝试序列化在模块级别导入的所有模块和任何相关库,而且常常无法挑选模块及模块的任何其他关联二进制文件。否则,Spark 将预计例程和库在节点上可用。我们将在使用 spark-submit 脚本提交应用程序时以代码文件形式发送例程。这些库已安装到所有节点上。还需要注意一点,如果您在函数中使用某个对象的成员,则 Spark 可终止对整个对象的序列化。

在执行程序上使用 MXNet 进行推理

如之前所述,对于此应用程序,我们将对每个节点运行一个执行程序,并对每个执行程序运行一个任务。

运行推理前,我们必须加载模型文件。 MXModel 类 (在 mxinfer.py 中) 从 MXNet Model Zoo 下载模型文件,然后创建 MXNet 模块,并在第一次使用时将其存储在 MXModel 类中。我们实施了单例模式,这样一来,我们无需在每次预测中都实例化和加载模型。

download_model_files 方法 (在 MXModel 单例类中) 将下载 ResNet-18 模型文件。该模型包含一个扩展名为 .json 的描述神经网络图的符号文件和一个扩展名为 .params 的包含模型参数的二进制文件。对于分类模型,将有一个包含类及其相应标签的 synsets.txt 文件。

下载模型文件后,我们将加载这些文件并在执行以下步骤的 init_module 例程中实例化 MXNet 模块对象:

  • 加载符号文件并创建输入符号,将参数加载到 MXNet NDArray 并解析 arg_paramsaux_params
  • 创建新的 MXNet 模块并分配符号。
  • 将符号绑定到输入数据。
  • 设置模型参数。
    def init_module(self, s_fname, p_fname, batch_size):
            logger.info("initializing model")
            
            import mxnet as mx        
            #load the symbol file
            sym = mx.symbol.load(s_fname)
            
            #load parameters
            save_dict = mx.nd.load(p_fname)
            
            arg_params = {}
            aux_params = {}
            
            for k, v in save_dict.items():
                tp, name = k.split(':', 1)
                if tp == 'arg':
                    arg_params[name] = v
                if tp == 'aux':
                    aux_params[name] = v
            
            mod = mx.mod.Module(symbol=sym)
            
            #bind data shapes and label. This model was trained with an image 224x224 resolution with 3(RGB) channels.
            mod.bind(for_training = False, data_shapes=[('data', (batch_size,3,224,224))],
                     label_shapes = None)
            #set parameters
            mod.set_params(arg_params, aux_params, allow_missing=True)
            
            return mod

我们将在首次调用预测方法后立即下载并实例化 MXModel 对象。该预测转换方法还采用包含一批 (大小为 args['batch']) 彩色图像的四维数组 (RGB 的其他 3 个维度) 并调用 MXNet 模块转发方法以生成该批量图像的预测。

注意:我们出于上一个注释中讨论的原因在此方法内导入 mxnet 和 numpy 模块。

def predict(img_batch, args):
    """
    Run predication on batch of images in 4-D numpy array format and return the top_5 probability along with their classes.
    """
    import mxnet as mx
    import numpy as np
    logger.info('predict-args:%s' %(args))
 
    if not MXModel.model_loaded:
        MXModel(args['sym_url'], args['param_url'], args['label_url'], args['batch'])
    
    MXModel.mod.forward(Batch([mx.nd.array(img_batch)]))    

运行 Inference Spark 应用程序

首先克隆 deeplearning-emr GitHub 存储库,该库包含用于使用 MXNet 和 Spark 运行推理的代码。

git clone https://github.com/awslabs/deeplearning-emr.git && cd deeplearning-emr/mxnet-spark

我们将使用来自 utils.py 的 spark-submit 脚本运行 Spark 应用程序。

export LD_PATH=$LD_LIBRARY_PATH ; spark-submit --deploy-mode cluster \
--master yarn --conf spark.dynamicAllocation.enabled=false \
--conf spark.executor.memory=40g \
--conf spark.executorEnv.LD_LIBRARY_PATH=\$LD_PATH \
--driver-library-path \$LD_PATH \
--num-executors 4 \
--py-files utils.py,mxinfer.py \
infer_main.py --sym_url 'http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-symbol.json' \
--param_url 'http://data.mxnet.io/models/imagenet/resnet/18-layers/resnet-18-0000.params' \
--label_url 'http://data.mxnet.io/models/imagenet/resnet/synset.txt' \
--batch 64 \
--bucket 'mxnet-spark-demo' \
--prefix 'cifar10/test' \
--output_s3_bucket '<YOUR_S3_BUCKET>' \
--output_s3_key 'cifar10_test_results'

注意:<YOUR_S3_BUCKET> 替换为要在其中存储结果的 Amazon S3 存储桶。您应具有传递访问/私有密钥或具有实例 IAM 角色中的权限。

spark-submit 的参数包括:

  • --py-files:需要发送至工作程序的代码文件的逗号分隔的列表 (不含空格)。
  • --deploy-mode:群集或客户端。当您在群集模式下运行应用程序时,Spark 将选择其中一个工作程序来运行驱动程序和执行程序。当群集较大且 EMR 群集上的主节点忙于运行针对 Hadoop、Spark 等的 Web 服务器时,在群集模式下运行将非常有用;您还可以在客户端部署模式下运行应用程序。
  • --master: yarn. EMR 将 YARN 配置为资源管理器。
  • --conf spark.executor.memory 每个执行程序可使用的内存量。
  • --conf spark.executorEnv.LD_LIBRARY_PATH--driver-library-path: 将 设置为 LD_LIBRARY_PATH
  • --num-executors:EMR 群集中核心和任务节点的总数。
  • infer_main.py:启动 Spark 应用程序的主程序,该程序采用参数 S3 存储桶、S3 密钥前缀、批处理大小等。
  • --batch:可在每个执行程序上一次性处理的图像的数量。此值受每个工作程序节点上可用的内存和 CPU 的约束。

收集预测

最后,我们将使用 Spark 收集操作来收集为每个分区生成的预测并将这些预测写入 Amazon S3。结果将写入到的 S3 位置 (args['output_s3_bucket'], args['output_s3_key']) 可作为参数传递至 infer_main.py。

    output = rdd.collect()
    # drop the extra keys that we added to fill the last batch
    keys = keys[:n_keys]
    output = output[:n_keys]
  
    if args['output_s3_key'] and args['output_s3_bucket']:
        with open('/tmp/' + args['output_s3_key'] , 'w+') as f:
            for k, o in zip(keys, output):
                f.write("Key %s: Prediction: %s\n" % (k, o))
        upload_file(args['output_s3_bucket'], args['output_s3_key'], '/tmp/' + args['output_s3_key'], s3_client)

监控 Spark 应用程序

您可在 Amazon EMR 控制台中查看 Spark 应用程序历史记录和 YARN 应用程序状态。在整个运行时期间近实时更新应用程序历史记录,并且历史记录可在应用程序完成后 (甚至在您终止群集后) 最多保留 7 天。它还在一个位置集中提供高级指标,如内存使用率、S3 读取数、HDFS 利用率等。这还将消除对 SSH 转发的需求,这与您使用 YARN UI 时不同。您可以查找这些功能并了解如何在 EMR 控制台上的 Spark 应用程序历史记录中使用它们。

来自 EMR 控制台应用程序历史记录的以下屏幕截图显示了应用程序任务、执行时间等。

还可使用驱动程序主机端口 8088 上的 Yarn ResourceManager Web UI 监控在 Amazon EMR 上运行的 Spark 应用程序。下面列出了 Amazon EMR 群集上可用的各种 Web UI 及其访问方式:EMR 上的 YARN Web UI

以下屏幕截图说明了 Web 监控工具。我们可以查看执行时间表、作业持续时间和任务成功和失败。

Amazon EMR 的另一项出色功能是与 Amazon CloudWatch 的集成,这将允许监控群集资源和应用程序。在以下屏幕截图中,我们可以看到跨群集节点的 CPU 利用率,该值保持在 25% 以下。

结论

简而言之,我们演示了如何设置一个包含 4 个节点的 Spark 群集,该群集使用 MXNet 跨 Amazon S3 上存储的 10000 个图像运行分布式推理,同时在 5 (4.4) 分钟内完成该处理。

了解更多

未来改进

  • 计算/IO 访问优化 – 在此应用程序中,我们观察到执行程序上的计算/IO 访问具有方波图样,其中 IO (无计算) 和计算 (无 IO) 是交替的。理想情况下,这可通过交错 IO 与计算来进行优化。但是,由于我们在每个节点上仅使用一个执行程序,因此,手动管理每个节点上的资源利用率也变得具有挑战性。
  • 使用 GPU:另一个重大改进将是使用 GPU 来基于批量数据运行推理。

作者简介

Naveen Swamy 是 Amazon AI 的一名软件开发人员,负责构建创新性的深度学习工具。他专注于使深度学习可供软件工程师使用以发挥其技能并将其应用于日常应用。在业余时间,他喜欢和家人呆在一起。

《制作无人驾驶车辆》第 4 部分:通过 Apache MXNet,为您的自动驾驶车辆应用行为克隆技术

在我们无人驾驶车辆系列的第一篇博客文章中,您制作了一辆 Donkey 车并将导航服务器部署到了 Amazon EC2 实例上。在第二篇博客文章中,您学习了如何驾驶 Donkey 车辆,Donkey 车辆也学习了如何自行驾驶。在第三篇博客文章中,您学习了如何通过 AWS IoT 将 Donkey 车辆的遥测数据流式传输到 AWS 的过程。

在这篇博文中,我们将深入探讨实现车辆自行驾驶的深度学习框架,并介绍采用卷积神经网络 (CNN) 的行为克隆概念。CNN 是一项面向计算机视觉任务的先进建模技术,可帮助解答车辆可能会遇到的问题,例如,“我前面是轨道还是圆锥形路标?”


1) 在 AWS 上制造一辆无人驾驶车辆,并参加 re:Invent 机器人车拉力赛
2) 《制作无人驾驶车辆》第 2 部分:驾驶您的车辆
3) 《制作无人驾驶车辆》第 3 部分:连接您的无人驾驶车辆
4) 《制作无人驾驶车辆》第 4 部分:通过 Apache MXNet,为您的自动驾驶车辆应用行为克隆技术


P2 上的 Donkey 训练数据设置

我们已在博客文章 2 中详细演练了如何运行训练。但是,让我们在这里回顾一下关键步骤和命令:

  1. 将数据从 Pi 复制到 Amazon EC2 实例:
    $ rsync -rva --progress -e "ssh -i /path/to/key/DonkeyKP-us-east-1.pem" /home/pi/d2// ec2-user@ec2-your-ip.compute-1.amazonaws.com:~/d2/data/
  2. 启动训练过程:
    $ python ~/d2/manage.py train --model /path/to/myfirstpilot
  3. 将训练过的模型复制回 Pi:
    $: rsync -rva --progress -e "ssh -i /path/to/key/DonkeyKP-us-east-1.pem" ec2-user@ec2-your-ip.compute-1.amazonaws.com:~/d2/models/ /home/pi/d2/models/

模型幕后

在本部分中,我将讨论模型学习的内容以及它如何能够自行驾驶。目前制作的 Donkey 车辆使用 Keras 作为其默认的深度学习框架。AWS 正在添加面向 Apache MXNet、Gluon 和 PyTorch 等其他框架的支持。在这篇博文中,我们将使用 Apache MXNet 来深入分析实现自动驾驶的模型的内部工作原理。如前所述,我们使用名为行为克隆的技术来实现车辆的自动驾驶。基本上,此模型基于训练数据学习驾驶,而训练数据则是通过环绕轨道行驶收集而来的。保证大部分数据都很“干净”非常重要,也就是说,假定我们的目标始终未偏离轨道,那么训练数据中车辆脱离轨道或转弯错误的图像就不会太多。就像驾驶员控制方向盘,保证车辆在车道上行驶一样,我们将制作一个会根据当前场景确定转向角的模型,引导我们将问题模型化为“根据输入图像,我们需要采用哪种转向角?”。实际驾驶情况更复杂,因为涉及到了加速和变速齿轮等更多组件。为了简单起见,我们在开始的时候先把油门固定到某个百分比,然后再让车辆行驶。在实践中我们发现,对于备用训练数据,25-30% 的油门已被证明是 Donkey 车辆的最佳行驶速度。

为实现这一目标,我们将使用名为卷积神经网络 (CNN) 的深度学习技术。CNN 已成为面向计算机视觉问题的实际网络。CNN 由多个卷积层组成,其中每个节点都与一个名为感受野的小窗口关联。这可以让我们提取图像中的局部特征。像“图像中是否有轨道或人?”这样的问题就可以通过使用先前计算出来的这些局部特征进行计算。您可以在此处找到有关 CNN 工作原理的详细说明。

数据集

在这篇博文中我将使用一个数据集,这个数据集是车辆环绕轨道行驶大约 15 分钟收集来的。如前所述,我们会先过滤一下,将车辆明显不在轨道上的图像丢弃。Donkey 软件已经提供了一个基于浏览器的 UI,用来删除“坏”的图像 (命令: donkey tubclean <包含 Tub 的文件夹>)。与此类似的、车辆在轨道上行驶的图像数据集可在此处获取

(more…)

在 Amazon EMR 上运行带有多种 GPU 实例类型的深度学习框架

今天,AWS 很高兴地宣布 Amazon EMR 将支持 Apache MXNet 和新一代 GPU 实例类型,让您可以在进行机器学习工作流程和大数据处理的同时运行分布式深度神经网络。此外,您还可以在采用 GPU 硬件的 EMR 群集上安装并运行自定义深度学习库。通过使用深度学习框架,您可以使用新工具包来处理多种使用案例,包括无人驾驶车辆、人工智能、个性化医疗和计算机视觉。

Amazon EMR 提供一个 Hadoop 托管框架,可以让您轻松、快速且经济高效地使用 Apache Spark、Apache Hive、PrestoApache HBase 和 Apache Flink 等框架处理 Amazon S3 中的大量数据。您可以低成本安全、高效地处理大量大数据使用案例,包括日志分析、Web 索引、数据转换 (ETL)、财务分析、科学模拟、实时处理和生物信息。

多年来,EMR 一直致力于帮助您运行可扩展的机器学习工作负载。2013 年,我们增加了对 Apache Mahout 的支持,以帮助您使用 Apache Hadoop MapReduce 来运行分布式机器学习工作负载。2014 年,客户开始利用 Apache Spark (我们在 2015 年增加了官方支持),以便利用 Spark ML 中提供的各种开源机器学习库来轻松构建可扩展的机器学习管道。

在过去 2 年内,我们还增加了对 Apache Zeppelin 笔记本、易于安装的 Jupyter 笔记本以及适用于交互式 Spark 工作负载的 Apache Livy 的支持,从而让数据科学家可以轻松快速地开发、培训以及将机器学习模型投入生产。EMR 的按秒计费方式以及使用 Amazon EC2 竞价型实例可实现的高达 80% 的成本节约,使您可以低成本轻松运行大规模的机器学习管道。 (more…)

宣布为 Apache MXNet 推出 ONNX 支持

今天,AWS 宣布推出 ONNX-MXNet,它是一种用于将 Open Neural Network Exchange (ONNX) 深度学习模型导入到 Apache MXNet 的开源 Python 程序包。MXNet 是功能齐全且可扩展的深度学习框架,可以跨 Python、Scala 和 R 等多种热门语言提供 API。通过 MXNet 的 ONNX 格式支持,开发人员可以使用 PyTorch、Microsoft Cognitive Toolkit 或 Caffe2 等其他框架构建和训练模型,然后将这些模型导入 MXNet 中运行,从而使用 MXNet 高度优化且可扩展的引擎进行推理。

我们还很激动地告诉大家,AWS 将在 ONNX 格式方面参与合作。我们将与 FacebookMicrosoft 和深度学习社区合作,进一步开发 ONNX,让深度学习从业人员都可以访问和使用它。

什么是 ONNX?

ONNX 是一种用于对深度学习模型进行编码的开源格式。ONNX 定义神经网络计算图的格式以及图中使用的大量运算符的格式。随着越来越多的框架和硬件供应商支持 ONNX,从事深度学习的开发人员可以轻松地在框架间移动,选择最适合当前任务的框架。

快速入门

我们将介绍如何使用 ONNX-MXNet 将 ONNX 模型导入 MXNet,以及如何使用导入的模型进行推理,从 MXNet 优化的执行引擎中获益。

步骤 1:安装

首先,根据 ONNX 存储库相关说明安装 ONNX。

然后,安装 ONNX-MXNet 程序包:

$ pip install onnx-mxnet

步骤 2:准备要导入的 ONNX 模型

在此示例中,我们将演示导入 Super Resolution 模型,以增加图像的空间分辨率。此模型使用 PyTorch 构建和训练,并且使用 PyTorch 的 ONNX 导出 API 导出到 ONNX。有关模型设计的更多详情,请参阅 PyTorch 示例

将 Super Resolution ONNX 模型下载到您的工作目录:

$ wget https://s3.amazonaws.com/onnx-mxnet/examples/super_resolution.onnx

步骤 3:将 ONNX 模型导入 MXNet

现在我们已经准备好 ONNX 模型文件,接下来让我们使用 ONNX-MXNet 导入 API 将其导入 MXNet。在 Python 外壳中运行以下代码:

import onnx_mxnet
sym, params = onnx_mxnet.import_model('super_resolution.onnx')

此代码在 Python 运行时中创建了两个实例: sym – 模型的符号图和 params – 模型的权重。现在已完成导入 ONNX 模型,我们生成了一个标准的 MXNet 模型。

(more…)

Apache MXNet 版本 0.12 扩展了 Gluon 功能以支持前沿的研究

上周,Apache MXNet 社区发布了 MXNet 版本 0.12。主要功能是支持 NVIDIA Volta GPU 和 sparse tensor。该版本还包括一些新的 Gluon 编程接口功能。特别是,可以通过这些功能在您的深度学习模型中轻松开展前沿的研究:

  • 变分丢弃;可用于有效地应用丢弃技术以减轻递归神经网络 (RNN) 中的过拟合问题
  • 卷积 RNN、长短期记忆 (LSTM) 和门控循环单元 (GRU) 单元;可用于对具有基于时间的序列和空间维度的数据集进行建模
  • 七个新的损失函数、导出功能和训练器函数增强功能

变分丢弃 (VariationalDropoutCell) 根据最新的研究提供一种新的工具以减轻 RNN 中的过拟合问题。本文参考了“A Theoretically Grounded Application of Recurrent Neural Networks”“RNNDrop: A Novel Approach for RNNs in ASR”。过拟合是一种建模错误,其中拟合的模型与训练数据集非常接近,以至于在查看新数据或测试数据集时,将会降低其预测精度。丢弃是一种建模技术,它随机地将模型参数归零,以便模型在训练过程中不会过度依赖于任何单个输入或参数。不过,这种技术尚未成功应用于 RNN。迄今为止的研究侧重于仅将丢弃完全随机地应用于输入和输出,即,在 RNN 的所有时间步长中将其归零。变分丢弃消除了这种涵盖所有时间步长的随机性,并在每个时间步长将相同的随机丢弃数组 (或掩码) 应用于 RNN 的输入、输出和隐藏状态。

(more…)

利用 Amazon CloudWatch 监控 GPU 利用率

深度学习需要进行大量的矩阵相乘和向量运算,而 GPU (图形处理单元) 可以并行处理这些运算,因为 GPU 拥有数以千计的核心。Amazon Web Services 为您提供的 P2 或 P3 实例非常适用于运行深度学习框架,如 MXNet,该框架强调加速部署大型深度神经网络。

数据科学家和开发人员在微调网络时,希望优化其 GPU 的利用率,以使用最适当的批处理大小。在这篇博文中,我将向您展示如何使用 Amazon CloudWatch 指标监控 GPU 和内存的使用情况。至于 Amazon 系统映像 (AMI),我们建议您的实例使用 Amazon Deep Learning AMI

要监控和管理已启用 GPU 的实例,目前常见的有益做法是使用 NVIDIA 系统管理接口 (nvidia-smi),这是一个命令行实用程序。用户可以利用 nvidia-smi 查询 NVIDIA GPU 设备的 GPU 利用率、内存消耗情况、风扇使用情况、功耗以及温度信息。

由于 nvidia-smi 的基础是 NVIDIA Management Library (NVML),所以我们可以使用这个基于 C 的 API 库捕捉相同的数据点,并作为自定义指标发送给 Amazon CloudWatch。如需了解有关此库的更多信息,请转至参考手册。在这篇博文中,我们将使用此库的 Python 包装程序 pyvnml

Amazon CloudWatch 可以非常出色地监控您在 EC2 实例上的工作负载,无需设置、管理,也无需为它扩展系统和基础设施。默认情况下 CloudWatch 可提供 CPU 利用率、磁盘读取操作、磁盘写入操作、网络输入和网络输出等指标。(点击此处了解适用于您的实例的完整指标列表)

除了提供这些指标,我们还能够使用 API、软件开发工具包或 CLI 通过 Amazon CloudWatch 自定义指标推送我们自己的数据点。我们将使用 Python Boto3 软件开发工具包。

(more…)

Apache MXNet 版本添加了对新的 NVIDIA Volta GPU 和 Sparse Tensor 的支持

我们对 Apache MXNet 版本 0.12 的发布感到很兴奋。MXNet 社区的参与者密切合作,为用户带来了新的增强功能。在此版本中,MXNet 添加了两项新的重要功能:

  • 对 NVIDIA Volta GPU 的支持,这使用户能够大大减少神经网络模型的训练和推理时间。
  • 对 Sparse Tensor 的支持,这使用户能够以最有利于存储和计算的方式使用稀疏矩阵训练模型。

对 NVIDIA Volta GPU 架构的支持

MXNet v0.12 版本添加了对 NVIDIA Volta V100 GPU 的支持,这使客户训练卷积神经网络的速度比 Pascal GPU 的速度快 3.5 倍。训练神经网络涉及数万亿次的浮点数 (FP) 乘法与加法运算。这些计算通常已使用单精度 (FP32) 完成以实现较高的准确度。但是,最近的研究表明,用户可以通过使用半精度 (FP16) 数据类型的训练获得与使用 FP32 数据类型的训练相同的准确度。

Volta GPU 架构引入了 Tensor Core。每个 Tensor Core 每个时钟周期可执行 64 次乘法和加法混合运算,约为每个 CUDA 核心在每个时钟周期内执行的 FLOPS 的四倍。每个 Tensor Core 执行如下所示的运算:D = A x B + C,其中 A 和 B 是半精度矩阵,而 C 和 D 可以是半精度或单精度矩阵,从而执行混合精度训练。利用新的混合精度训练,用户可以通过对网络的大多数层使用 FP16 并在必要时使用更高精度的数据类型来获得最佳训练绩效,且不会降低精度。

MXNet 使用户能够轻松使用 FP16 训练模型以利用 Volta Tensor Core。例如,您只需在 MXNet 中通过将以下命令选项传递到 train_imagenet.py 脚本即可启用 FP16 训练。

--dtype float16

最近,我们宣布推出一套新的 AWS Deep Learning AMI,它们预安装了针对 Amazon EC2 P3 实例系列中的 NVIDIA Volta V100 GPU 进行了优化的各种深度学习框架,其中包括 MXNet v0.12。只需在 AWS Marketplace 中单击一下鼠标即可开始;或者,您也可以按照此分步指南操作,开始使用您的第一个笔记本

(more…)