亚马逊AWS官方博客

AWS DeepLens – 通过新式摄像机获得深度学习实践经验

我以前说过,“活到老,学到老”是我的人生信条之一。技术变革的速度越来越快,您也需要加快学习速度,迅速掌握全新技能。

在我职业生涯的大部分时间里,人工智能一直是一个学术课题,实际应用和实际部署始终是“若即若离”。但随着机器学习 (包括计算机视觉深度学习) 实际应用的不断增多,可以肯定地说,现在是获得实践经验和掌握新技能的时候了!此外,物联网无服务器计算也备受瞩目。虽然这两者的提出时间不算早,但它们必将在未来占据一席之地,是您最该掌握的众多技能之一。

新的 AWS DeepLens
今天我将跟大家介绍一下 AWS DeepLens – 一种直接在设备上运行深度学习模型的新式视频摄像机。您可以使用它构建炫酷的应用程序,同时获得人工智能、物联网和无服务器计算方面的实践经验。AWS DeepLens 结合了先进的硬件和精密的机载软件,让您能够在应用程序中使用 AWS GreengrassAWS Lambda、其他 AWS AI 及基础设施服务。

我们先从硬件谈起。此设备包含众多强大功能。它配备一个可拍摄 1080P 视频的 400 万像素摄像头,以及一个 2D 麦克风阵列。其搭载的 Intel Atom® 处理器提供超过 100 GLOPS 的计算能力,每秒足以通过机载深度学习模型对数十帧传入视频进行运算。DeepLens 具有完善的连接能力,提供双频 Wi-Fi、USB 及微型 HDMI 端口。最后,这部小巧的设备具有 8 GB 内存,能够运行您的预训练模型和代码,提供无与伦比的强大能力。

在软件方面,AWS DeepLens 运行的是 Ubuntu 16.04,预装 Greengrass Core (Lambda 运行时、消息管理器)。它还提供专为此设备优化的 MXNet 版本,并具备使用 TensorFlowCaffe2 等其他框架的灵活性。Intel® clDNN 库提供一套用于计算机视觉和其他人工智能工作负载的深度学习基元,利用 Intel Atom® 处理器的特殊功能加快推理。

我们还为您提供数据!当构建在 AWS DeepLens 上运行的应用程序时,您可以使用一组预训练模型进行图像检测和识别。这些模型将帮助您检测猫、狗、人脸、众多家用和日常物品、动作和行动,甚至是热狗。我们将继续训练和完善这些模型。下面是最初的一组模型:

所有这些硬件、软件和数据汇集到一起,使 AWS DeepLens 成了边缘设备的典型示例。借助这些位于现场和靠近动作的眼睛、耳朵和十分强劲的大脑,它能够通过机载深度学习模型快速、低延迟地运行传入视频和音频,并利用云完成计算密集度更高的高阶处理。例如,您可以在 DeepLens 上进行面部检测,然后让 Amazon Rekognition 处理面部识别工作。

这是个利用现成工具进行学习的绝佳机会!我们还为其提供了大量的示例代码 (Lambda 函数),您可以按原样使用,进行分解和学习,或基于这些示例代码编写自己的函数。当构建出一些很酷且有用的东西时,您可以按生产形式部署它们。我们确保 AWS DeepLens 强大又安全 – 每个设备都有唯一的证书,通过 IAM 精细控制对 AWS 服务和资源的访问。

注册设备
下面,我们演练一下注册设备和使设备做好使用准备的过程。首先,打开 DeepLens 控制台,单击 Register device

为摄像机输入一个名称,然后单击 Next

单击 Download certificate 并将其保存到一个安全的地方:

接下来,创建必要的 IAM 角色 (控制台简化了这一操作),在相应菜单中选择每个角色:

现在我可以正常使用 DeepLens 了!打开电源,将笔记本电脑连接到此设备的网络,然后访问内置门户来完成此过程。控制台概述了以下步骤:

现在,我的 DeepLens 就是一个功能完备的边缘设备。设备上的证书允许其对 AWS 进行安全的签名调用。Greengrass Core 正在运行,准备接受并运行 Lambda 函数。

创建 DeepLens 项目
完成连接和设置工作后,我可以创建第一个项目了。导航到 Projects,然后单击 Create new project

可以选择一个项目模板,或从空白项目开始。我选择了 cat and dog recognition,然后单击 Next

控制台提供了命名和自定义项目的机会。正如您所看到的,这个项目引用了一个 Lambda 函数和我在上文列出的预训练模型之一。默认设置满足我的要求,所以我直接单击 Create

现在,只需将项目部署到摄像机:

猫/狗识别训练
函数在摄像机上运行,将输出发布到 MQTT 主题。下面是从猫/狗识别函数的内部循环中摘录的一段代码 (删除了一些错误处理内容):

while doInfer:
    # 获取视频流中的一帧
    ret, frame = awscam.getLastFrame()
    numFrames += 1

    # 调整帧大小以符合模型输入要求
    frameResize = cv2.resize(frame, (224, 224))

    # 对调整后的帧运行模型推理
    inferOutput = model.doInference(frameResize)

    # 以每 100 帧为单位向云发布消息
    if numFrames >= 10:
        msg = "Infinite inference is running. Sample result of the last frame is\n"
        # 将最后一帧的推理结果输出到云
        # awsca 模型可以分析某些已知模型的输出
        outputProcessed = model.parseResult(modelType, inferOutput)

        # 获取可能性最高的前 5 个结果
        topFive = outputProcessed[modelType][0:2]
        msg += "label    prob"
        for obj in topFive:
            msg += "\n{}   {}".format(outMap[obj["label"]], obj["prob"])

        client.publish(topic=iotTopic, payload=msg)
        numFrames = 0;

就像我之前说的那样,您可以修改此示例代码,也可以从头开始。如您所见,不管使用哪种方式,都可以轻松上手。

我已经迫不及待想要知道您拿到 DeepLens 后会做些什么了。请务必参加在 AWS re:Invent 上举办的 DeepLens 研讨会 (共十六场),不仅可进一步了解 AWS DeepLens,还有机会得到一部 AWS DeepLens 哦!

立即预订
我们将于 2018 年率先向美国市场供应 AWS DeepLens。要了解有关定价和可用性的更多信息,或是想要提前预订,请访问 DeepLens 页面

Jeff

S3 Select 和 Glacier Select – 检索对象子集

Amazon Simple Storage Service (S3) 为每个行业的市场领导者使用的数以百万计的应用程序存储数据。其中许多客户还使用 Amazon Glacier 作为安全、持久且成本极低的存档存储。借助 S3,我可以存储任意数量的对象,单一对象最大可达 5 TB。一直以来,对象存储中的数据都是作为整体访问的,也就是说,当您查询一个大小为 5 GB 的对象时,您会获得全部 5 GB 的数据。这是对象存储的工作方式所决定的。今天,我们将宣布 S3 和 Glacier 的两个新功能挑战这一模式 – 它们让您能够使用简单的 SQL 表达式从这些对象中只提取需要的字节。这可从根本上增强访问 S3 或 Glacier 中对象的每一个应用程序。

S3 Select

S3 Select (随预览版发布) 让应用程序能够使用简单的 SQL 表达式只检索对象的数据子集。使用 S3 Select 仅检索应用程序所需的数据可大幅提升性能 – 在许多情况下,您可获得多达 400% 的性能提升。

例如,假设您是一家大型零售商的开发人员,您需要分析某个店铺的每周销售数据,但所有 200 家店铺的数据每天都保存在一个新的经过 GZIP 压缩的 CSV 文件中。如果没有 S3 Select,您需要下载、解压缩并处理整个 CSV 才能获得所需的数据。而利用 S3 Select,您可以使用简单的 SQL 表达式仅返回所需的店铺数据,而不必检索整个对象。这可将需要处理的数据量减少一个数量级,从而提高底层应用程序的性能。

我们来看一个简单的 Python 示例。

import boto3
from s3select import ResponseHandler

class PrintingResponseHandler(ResponseHandler):
    def handle_records(self, record_data):
        print(record_data.decode('utf-8'))

handler = PrintingResponseHandler()
s3 = boto3.client('s3')
response = s3.select_object_content(
    Bucket="super-secret-reinvent-stuff",
    Key="stuff.csv",
    SelectRequest={
        'ExpressionType': 'SQL',
     'Expression': 'SELECT s._1 FROM S3Object AS s'',
        'InputSerialization': {
            'CompressionType': 'NONE',
            'CSV': {
                'FileHeaderInfo': 'IGNORE',
                'RecordDelimiter': '\n',
                'FieldDelimiter': ',',
            }
        },
        'OutputSerialization': {
            'CSV': {
                'RecordDelimiter': '\n',
                'FieldDelimiter': ',',
            }
        }
    }
)
handler.handle_response(response['Body'])

很酷吧!为实现这一行为,S3 Select 使用二进制通信协议返回对象。目前,这需要借助一个小型附加库来帮助处理反序列化。

客户可以利用 S3 Select 加速各类应用程序。例如,这种部分数据检索功能对于使用 AWS Lambda 构建的无服务器应用程序特别有用。我们修改了 Serverless MapReduce 参考架构以使用 S3 Select 仅检索所需数据,结果显示:性能提高了 2 倍,成本则下降了 80%。

S3 Select 团队还创建了一个 Presto 连接器,它能够在不更改查询的情况下立即提高 Amazon EMR 的性能。我们运行了一个对从 S3 检索的接近 99% 的数据进行筛选的复杂查询,借此对连接器进行了测试。在禁用 S3 Select 的情况下,Presto 必须从 S3 扫描和筛选整个对象,而启用 S3 Select 后,Presto 借助 S3 Select 仅检索查询所需的数据。

[hadoop@ip-172-31-19-123 ~]$ time presto-cli --catalog hive --schema default --session hive.s3_optimized_select_enabled=false -f query.sql
"31.965496","127178","5976","70.89902","130147","6996","37.17715","138092","8678","135.49536","103926","11446","82.35177","116816","8484","67.308304","135811","10104"
 
real  0m35.910s
user  0m2.320s
sys   0m0.124s
[hadoop@ip-172-31-19-123 ~]$ time presto-cli --catalog hive --schema default --session hive.s3_optimized_select_enabled=true -f query.sql
"31.965496","127178","5976","70.89902","130147","6996","37.17715","138092","8678","135.49536","103926","11446","82.35177","116816","8484","67.308304","135811","10104"
 
real  0m6.566s
user  0m2.136s
sys   0m0.088s

不启用 S3 Select 时,此查询耗时 35.9 秒;启用 S3 Select 时,只花费 6.5 秒。速度提高了 5 倍!

需知信息

  • 在预览版中,S3 Select 支持使用和未使用 GZIP 压缩的 CSV 及 JSON 文件。预览版不支持静态加密对象。
  • 预览版使用期间,S3 Select 不收费。
  • Amazon AthenaAmazon RedshiftAmazon EMR 以及 Cloudera、DataBricks、Hortonworks 等合作伙伴都将为 S3 Select 提供支持。

Glacier Select

在受到严格监管的金融服务、医疗保健等行业中,一些公司将数据直接写入 Amazon Glacier,以满足 SEC Rule 17a-4、HIPAA 等合规性要求。许多 S3 用户制定了生命周期策略,通过将不再需要定期访问的数据移入 Glacier 来节省存储成本。大多数传统存档解决方案 (例如本地磁带库) 对数据检索吞吐量有严格限制,不适合进行快速分析或处理。需要用到存储在磁带上的数据时,您可能需要等待数周时间才能得到有用的结果。相比之下,您现在只需数分钟时间就能轻松查询存储在 Glacier 中的冷数据。

这可帮助您从存档数据中发掘大量的全新业务价值。Glacier Select 让您能够使用标准 SQL 语句直接筛选 Glacier 对象。

Glacier Select 的工作方式与任何其他检索作业一样,但它有一组您可在启动作业请求中传入的额外参数。 SelectParameters

下面是一个简单示例:

import boto3
glacier = boto3.client("glacier")

jobParameters = {
    "Type": "select", "ArchiveId": "ID",
    "Tier": "Expedited",
    "SelectParameters": {
        "InputSerialization": {"csv": {}},
        "ExpressionType": "SQL",
        "Expression": "SELECT * FROM archive WHERE _5='498960'",
        "OutputSerialization": {
            "csv": {}
        }
    },
    "OutputLocation": {
        "S3": {"BucketName": "glacier-select-output", "Prefix": "1"}
    }
}

glacier.initiate_job(vaultName="reInventSecrets", jobParameters=jobParameters)

需知信息

Glacier Select 已在提供 Glacier 的所有商业区域正式发布。

Glacier 定价包含三个要素:

  • 扫描数据量 (GB)
  • 返回数据量 (GB)
  • Select 请求

每个要素的定价取决于您希望返回结果的速度:加急 (1-5 分钟)、标准 (3-5 小时) 和批量 (5-12 小时)。

2018 年,Athena 将很快通过 Glacier Select 与 Glacier 集成。

希望本文对您利用这些功能增强或构建全新应用程序有所助益。

Randall

适用于 Kubernetes 的 Amazon Elastic Container Service

关于容器,我的同事 Deepak Singh 可以细细道来!

Jeff


我们有很多 AWS 客户在 AWS 上运行 Kubernetes。实际上,根据 Cloud Native Computing Foundation 的数据,63% 的 Kubernetes 工作负载在 AWS 上运行。尽管 AWS 常用来运行 Kubernetes,客户还是需要进行大量手动配置才能管理其 Kubernetes 群集。您必须安装和运行 Kubernetes 主节点,并配置 Kubernetes 工作节点群集。为了使 Kubernetes 群集实现高可用性,必须跨不同可用区运行至少三个 Kubernetes 主节点。每一个主节点都需要进行配置才能相互通信、可靠地共享信息、均衡负载,在某个主节点发生故障时,才能将故障转移到其他主节点。全部设置完毕并开始运行后,您还必须负责主节点和工作节点软件的升级和修补。这都需要大量的操作知识,工作量巨大,客户要求我们把这一切进行简化。

Amazon EKS 简介
适用于 Kubernetes 的 Amazon Elastic Container Service (Amazon EKS) 是一种完全托管服务,借助该服务,您无需成为管理 Kubernetes 群集的专家,就可以在 AWS 上方便地运行 Kubernetes。我们认为开发人员会很喜欢这项服务的几个特点。首先,Amazon EKS 运行开源 Kubernetes 软件的上游版本,因此您可以使用 Kubernetes 社区的所有现有插件和工具。在 Amazon EKS 上运行的应用程序与在任何标准 Kubernetes 环境 (包括本地数据中心和公有云) 中运行的应用程序完全兼容。这意味着您无需进行任何代码修改,就可以方便地将 Kubernetes 应用程序迁移到 Amazon EKS。其次,Amazon EKS 跨三个可用区使用三个主节点自动运行 K8,以免发生单点故障。在一个 AWS 可用区发生故障时,这种多可用区架构具备复原能力。

第三,Amazon EKS 还可以自动检测和替换运行状况不佳的主节点,并对主节点进行自动版本升级和修补。最后,Amazon EKS 与许多关键 AWS 功能集成,如用于负载分配的 Elastic Load Balancing、用于身份验证的 IAM、用于隔离的 Amazon VPC、用于私有网络访问权限管理的 AWS PrivateLink 和用于日志记录的 AWS CloudTrail。

工作原理
现在,我们看看其中的工作原理。Amazon EKS 通过与 Heptio 协作将 IAM 身份验证与 Kubernetes RBAC (Kubernetes 基于本机角色的访问控制系统) 集成。

您可以直接将 RBAC 角色分配给每个 IAM 实体,这样能精细控制对 Kubernetes 主节点的访问权限。因此,您可以使用标准 Kubernetes 工具 (如 kubectl) 方便地管理 Kubernetes 群集。

如果您需要直接从自己的 Amazon VPC 访问 Kubernetes 主节点,还可以使用 PrivateLink。通过 PrivateLink,Kubernetes 主节点和 Amazon EKS 服务终端节点将成为 Amazon VPC 中具有私有 IP 地址的弹性网络接口。

这样您无需使用公有 IP 地址,也无需通过 Internet 传输流量,就可以从自己的 Amazon VPC 直接访问 Kubernetes 主节点和 Amazon EKS 服务。

最后,我们还构建了一个开源 CNI 插件,任何人都可以在 AWS 上将它用于 Kubernetes 群集。这样您可以在本地将 Amazon VPC 与 Kubernetes Pod 联网。

通过 Amazon EKS,启动 Kubernetes 群集非常简单,只需在 AWS 管理控制台中单击几次。Amazon EKS 负责其余工作:升级、修补和高可用性。Amazon EKS 现在提供预览版。我们期待收到您的反馈意见。

— AWS Container Services 总经理 Deepak Singh

AWS Fargate 简介 – 运行容器无需管理基础设施

容器是开发人员用来开发、封装和部署其应用程序的一种强大方法。AWS 每周启动超过十万 ECS 群集和数亿新容器。这相当于从 2016 年以来实现了超过 400% 的客户增长。Amazon ECS 和 Kubernetes 这样的容器编排解决方案让部署、管理和扩展这些容器工作负载变得更简单,从而增强敏捷性。但是,如果使用这些容器管理解决方案中的任何一个,您都仍然要负责底层基础设施的可用性、容量和维护。AWS 从中发现机会,致力于消除部分重复性的繁重工作。我们希望您能充分利用容器提供的速度、敏捷性和不变性,集中精力构建应用程序,而不必管理基础设施。

AWS Fargate

AWS Fargate 是一种在 AWS 上部署容器的简单方法。简单地说,Fargate 像 EC2,只是它提供的是容器而不是虚拟机。通过这种技术,您可将容器用作基础计算基元,而不必管理基础实例。您只需构建容器映像,指定 CPU 和内存要求,定义联网和 IAM 策略,以及启动。Fargate 提供灵活的配置选项,可以极为一致地满足应用程序需求,计费可精确到秒。

最大的好处?您仍然可以使用所有相同的 ECS 基元、API 和 AWS 集成。Fargate 提供与 Amazon Virtual Private CloudAWS Identity and Access Management (IAM)Amazon CloudWatch 和负载均衡器的原生集成。Fargate 任务使用 AWSVPC 联网模式,在 VPC 中配置弹性网络接口 (ENI) 与资源安全通信。通过 AWS 命令行界面 (CLI) 启动 Fargate 任务非常简单。

ecs run-task --launch-type FARGATE --cluster BlogCluster --task-definition blog --network-configuration "awsvpcConfiguration={subnets=[subnet-b563fcd3]}"

使用该控制台来创建任务定义和运行 Fargate 启动类型的任务也很简单。

启动一些任务之后,可以看到它们在群集中运行。

可以看到 ECS 群集是异构的。它们可以包含在 Fargate 中和 EC2 上运行的任务。

如果深入看看其中某个任务,可以看到一些有用的信息,包括 Fargate 在 VPC 中配置的 ENI 以及该任务使用的所有容器。使用记录选项卡也可以方便访问 CloudWatch Logs 以查看该任务的相关信息。

我们介绍一下 Fargate 的配置选项和定价详情。

定价

AWS Fargate 使用按需定价模型。应用程序使用的 vCPU 和内存资源量是按秒计费的。每个 vCPU 的价格是 0.00084333 USD/秒 (0.0506 USD/小时),每 GB 内存的价格是 0.00021167 USD/秒 (0.0127 USD/小时)。使用 Fargate,您可以对 vCPU 和内存使用 50 个配置选项来支持各种工作负载。配置选项如下。

CPU (vCPU) 内存值 (GB)
0.25 0.5、1、2
0.5 1、2、3
1 最小2GB,最大8GB,以 1GB 为增量
2 最小4GB,最大16GB,以 1GB 为增量
4 最小8GB,最大30GB,以 1GB 为增量

需知信息

  • 您可以将 Fargate 配置为高度一致地满足应用程序的资源要求,仅为容器所需的资源付费。您可以在几秒钟内启动数十个到数万个容器。
  • Fargate 任务的运行方式与在 EC2 上运行的任务相似。您可以将它们添加到 VPC、配置负载均衡器和分配 IAM 角色。

关于路线图

我不能透露所有信息,不过对于 AWS Fargate,我们有非常令人激动的路线图。我们计划在 2018 年使用 Amazon EKS 支持在 Fargate 上启动容器。与往常一样,我们期待您提供反馈。请在 Amazon ECS 论坛留言,告诉我们您的想法。

Fargate 今天在美国东部 (弗吉尼亚北部) 区域发布。

Randall

Amazon DynamoDB 更新 – 全局表和按需备份

各行各业的 AWS 客户都在使用 Amazon DynamoDB 存储关键任务数据。金融服务、商业、广告技术、物联网和游戏应用程序 (仅举几例) 每秒向包含数百 TB 数据和数万亿项目的表发起数百万个请求,依靠 DynamoDB 在十毫秒内返回结果。

今天,我们介绍两个强大且必将受到欢迎的新功能:

全局表 – 现在您可以创建跨两个或更多 AWS 区域自动复制的表,可完全支持只需几次点击即可实现的多主表写入。这让您能够为全球用户群构建快速、大规模扩展的应用程序,而无需管理复制过程。

按需备份 – 现在您可以一键创建 DynamoDB 表的完整备份,并且对性能或可用性没有任何影响。您的应用程序保持在线状态全速运行。备份适用于长期保留和存档,可帮助您满足法规要求。

全局表
DynamoDB 已将您的表复制到三个可用区,为您提供持久、高度可用的存储。现在,您可以使用全局表在两个或更多 AWS 区域间复制表 – 只需几次点击操作即可完成设置。您将获得极高的读写性能,并可进一步扩展,满足要求最苛刻的全球应用程序的需求。

您无需对现有代码进行任何更改,只需将写入请求和最终一致性读取请求发送到任意指定区域的 DynamoDB 终端节点即可 (与强一致性读取关联的写入应共享一个公共终端节点)。DynamoDB 在后台实施多主表写入,确保以对特定项目的最后一次写入为准。使用全局表时,每个项目将包含一个时间戳属性,用于表示最近一次写入的时间。更新通过 DynamoDB Streams 异步传播到其他区域,通常在一秒内完成 (可以使用新的 ReplicationLatency 和 PendingReplicationCount 指标跟踪这一过程)。

入门很简单。按照常规方式创建表,然后一键添加到其他区域的复制。必须从空表开始,且所有表都具有相同的名称和键配置 (哈希和可选排序键)。所有表还应共享一组一致的 Auto Scaling、TTL、本地二级索引、全局二级索引、预配置吞吐量设置和 IAM 策略。为方便起见,系统为新全局表自动启用 Auto Scaling。

如果不使用 DynamoDB Auto Scaling,您应该预配置充足的读取容量,以应对本地读取;预配置充足的写入容量,以容纳组中所有表的写入;并为源自本地区域的每个应用程序写入预配置额外的系统 写入。系统写入用于支持“以最后一次写入为准”模型。

下面,我们创建一个跨三个区域的全局表。先按照常规方式创建表,然后单击 Global Tables 选项卡:

DynamoDB 对表进行检查,确保其满足要求。它指出需要启用 DynamoDB Streams,于是我照做。接下来,单击 Add region,选择 EU (Frankfurt),然后单击 Continue

数秒内,表创建完毕:

再次执行上述操作,现在我有了一个跨三个 AWS 区域的全局表:

我在欧洲 (爱尔兰) 创建一个项目:

欧洲 (法兰克福) 即刻也显示了此项目:

跨区域复制过程添加 aws:rep:updateregionaws:rep:updatetime 属性;它们对应用程序可见,但您不应修改它们。

全局表于今日在美国东部 (弗吉尼亚北部)美国东部 (俄亥俄)欧洲 (爱尔兰)欧洲 (法兰克福) 区域推出,并将于 2018 年扩展到更多区域。您需要支付常规 DynamoDB 价格的读取容量和存储费用,以及跨区域复制的数据传输费。写入容量按复制的写入容量单位计费。

按需备份
此功能旨在帮助您满足法规对长期存档和数据保留的要求。您可以通过点击操作 (或 API 调用) 创建备份,而不消耗预置的吞吐容量或影响应用程序的响应能力。备份以高持久性方式存储,可用于创建新表。

现在,DynamoDB 控制台包含 Backups 部分:

我只需单击 Create backup 并为备份输入一个名称:

即可立即生成备份!备份使用 Amazon 托管密钥加密,并包含所有表数据、预配置容量设置、本地和全局二级索引设置以及流。它不包括 Auto Scaling 或 TTL 设置、标签、IAM 策略、CloudWatch 指标或 CloudWatch 警报。

考虑到有些客户的表大小接近 0.5 PB,您可能会对此功能为何能即刻生成备份感到好奇。事实上,DynamoDB 在后台创建完整快照并保存所有更改日志。因此,生成备份就变得十分简单,只需保存时间戳和表的当前元数据即可。

下面是我的备份:

我通过以下方式将备份还原到新表:

下面是需要牢记的关于 DynamoDB 备份的一些事项:

设置 – 创建新表后,DynamoDB 必须先完成一些设置工作 (大概需要一顿饭的工夫),然后才能开始创建第一个备份。

还原 – 还原时间视表大小而定。对于非常大的表,完成还原可能需要半小时到数小时的时间。

可用性 – 我们将尽快逐账户部署此项新功能,美国东部 (弗吉尼亚北部)美国东部 (俄亥俄)美国西部 (俄勒冈)欧洲 (爱尔兰) 区域率先部署。

定价 – 备份存储费用以每月千兆字节为单位计算,还原费用基于还原数据量计算。

Jeff

开发进行时 – Amazon Aurora Serverless

对于 Amazon Aurora,您可能已有所了解。Aurora 是一种完全托管、可自动扩展到 64 TB 的数据库存储,提供与 MySQL 兼容或与 PostgreSQL 兼容的版本。创建 Aurora 数据库实例时,您可以选择所需的实例大小,并可以选择使用只读副本提高读取吞吐量。如果处理要求或查询率发生变化,您可以选择修改实例大小或根据需要更改只读副本的数目。此模型在工作负载可预测、请求速率和处理要求较高的环境中运行极佳。

在某些情况下,工作负载可能是间歇性和/或不可预知的,并且每天或每周可能有仅持续数分钟或数小时的请求高峰。限时抢购、偶发或一次性事件、在线游戏、报告工作负载 (每小时或每天)、开发/测试和新上线应用程序都具有上述特点。要分配恰好够用的容量很难;按固定价格付费又不够明智。

Amazon Aurora Serverless 发布
我们于今日推出 Amazon Aurora Serverless 预览版 (立即注册)。此新配置专为多变的工作负载设计,让您能够以秒为单位为所用的数据库资源付费。

此无服务器模型构建在处理和存储清晰分离的基础上,处理和存储清晰分离是 Aurora 架构的一部分 (有关更多信息,请参阅 Design Considerations for High-Throughput Cloud-Native Relational Databases)。您不必预先选择数据库实例大小,而是创建一个终端节点,根据需要设置所需的最小和最大容量,然后向此终端节点发出查询。终端节点是一个简单代理,它将查询路由到快速扩展的数据库资源队列。这样,即使在后台执行扩展操作,您的连接也能保持不变。扩展操作极为迅速,新资源可在 5 秒内上线。下图说明了这些功能是如何结合在一起的:

存储和处理是分开的,因此处理容量可以缩减至零 (此时,您只需支付存储费用)。我认为这一点很棒,它有可能催生随开即用的新型瞬时应用程序。基于可随时启用以处理请求的“热”资源池进行扩展 (可在数秒内完成)。新增资源基于现有的已缓存和已缓冲内容,可实现全速运行。这让您能够毫不费力地将现有 Aurora 数据库转换为无服务器模型。

基于 Aurora 容量单位计费,每个单位代表计算能力与内存的组合。以 1 秒为增量进行计量,每个新增资源最低计 1 分钟。

敬请关注
2018 年初,我将向大家介绍有关 Amazon Aurora Serverless 的更多信息。我们目前的计划是在 2018 年上半年推出可用于生产环境的 MySQL 兼容版本,随后发布 PostgreSQL 兼容版本。现在,您可以注册试用预览版

Jeff

AWS 和加州理工学院通过新的研究协作携手加快人工智能和机器学习的发展

从自主机器人到最前沿的计算机视觉,加州理工学院和 Amazon 具有很多共同点,包括二者都认为打破人工智能 (AI) 和机器学习 (ML) 的边界不仅会颠覆各个行业,还会从根本上改变科学研究的本质。我们相信这些技术有可能改变诸如工业自动化、机器人、癌症研究、神经科学等领域,甚至帮助发现下一个引力子!

今天,我们宣布两家组织建立研究合作伙伴关系,以推动对人工智能、数据科学和机器学习的研究。

作为为期两年且可延长的合作伙伴关系的一部分,Amazon 将以资助研究生奖学金的形式提供财务支持,以 AWS 云积分的形式提供计算资源,以加速加州理工学院师生在这些领域中的工作。团队将借助 AWS 云 (包括最前沿的 Nvidia GPU 实例),使用 Apache MXNet 等开源项目训练深度神经网络,以及协作突破人工智能的基础性限制。合作关系包括加州理工学院计算和数学科学 (CMS) 系和电气工程 (EE) 系的研究人员,以及在加州理工学院从事其他 AI/ML 应用工作的研究人员,包括与新落成的自主系统技术中心 (CAST)、最近宣布成立的陈神经科学研究院以及世界著名的喷气推动硏究室 (JPL) 等开展协作的研究人员。加州理工学院是一个真正可以进行跨学科研究的地方,我们不对他们的人工智能研究类型施加任何限制 – 我们希望团队能够大胆设想,大胆创新!

这种合作关系也是加州理工学院和 AWS 之间已经开展的合作的一种自然延伸。AWS ML 研究团队的多名成员,包括 Anima Anandkumar 和 Pietro Perona 在内,都会在 Amazon 和加州理工学院之间分配他们的时间。除这两个人外,领导合作关系的主要研究人员包括:

Aaron Ames
机械与土木工程及控制动力系统 Bren 教授

Ames 教授的研究方向为机器人、非线性控制、混合系统、自治和网络物理系统,重点是机器人系统的基础理论和实验实现。他的实验室设计、构建和测试新型双足机器人和假肢,目标是实现像人类一样行走的双足机器人,并将这些功能转化为机器人辅助设备。


Animashree (Anima) Anandkumar
AWS 首席科学家兼计算和数学科学系 Bren 教授

Anandkumar 教授的研究兴趣在大规模机器学习、非凸优化和高维统计等领域。特别是,她是开发和分析机器学习张量算法的先锋。张量分解方法属于尴尬平行并可扩展到巨大的数据集。它们保证收敛到全局最优,并对许多概率模型 (如主题模型、社区模型和隐马尔可夫模型) 提供一致的估计。更通俗地讲,Anandkumar 教授一直在研究高效的技术来加快非凸优化,如有效避开鞍点。


Pietro Perona
Amazon 研究员兼 Allen E. Puckett 电气工程教授

Perona 教授的研究在理解我们如何看和如何建造会“看”的机器方面起到了关键作用。Perona 教授的主要研究领域是视觉识别,更具体地说就是视觉分类。他正在研究机器如何能够以最少的人类监督学会识别青蛙、汽车、面孔和树木,以及我们如何让大型图像集合,甚至是 Web 可以按图像内容进行搜索。通过与研究员 Anderson 和 Dickinson 合作,Perona 教授正在建立视觉系统和统计技术来衡量果蝇和小鼠的行为和活动。这使得遗传学家和神经行为学家可以探究基因、大脑和行为之间的关系。Perona 教授还对研究人类如何执行视觉任务 (如搜索和识别图像内容) 感兴趣。他最近的一个项目是研究如何利用网络上数以千计人的视觉能力来分类和搜索图像内容。


Joel A. Tropp
Steele Family 应用与计算数学系教授

Tropp 教授的工作涉及应用数学、电气工程、计算机科学和统计学。其研究涵盖数据分析的理论和计算方面、稀疏建模、随机线性代数和随机矩阵理论。


Adam Wierman
计算和数学科学系教授;计算和数学科学系执行干事;信息科学与技术系主任

Wierman 教授的研究集中在三个看似截然不同的领域:云计算、经济和能源。尽管很多样化,但是这些领域对于他的更广泛的研究目标来说都至关重要:轻松地将可再生能源纳入 IT,更通俗地讲就是纳入电网。他的工作在领域和技术方面也呈现出多样性。这些工作利用算法、网络、运筹学、经济学和控制等工具,并且从理论开始,一直到产业转移。


Yisong Yue
计算与数学科学系助理教授

Yue 教授的研究兴趣主要在于统计机器学习的理论和应用。他对开发结构化预测、时空推理、自适应学习系统以及在循环中与人类一道学习的新方法特别感兴趣。过去,他的研究已经应用于信息检索、内容推荐、文本分类、从丰富的用户界面学习、分析隐含的人类反馈、数据驱动的动画、运动分析、机器人策略学习以及自适应路由和分配问题。

我们很高兴能够将来自两个团队的才华横溢的人才汇聚在一起,并在合作中分享成果。在 Twitter 上关注我们:#Caltech#AmazonAI

作者简介

Joseph Spisak 负责领导 AWS 的合作伙伴生态系统,重点关注人工智能和机器学习。他在 Amazon、Intel 和 Motorola 等公司获得了 17 年以上的丰富技术经验,主要研究视频、机器学习和人工智能。闲暇时,他喜欢打冰球和阅读科幻小说。

Adam Wierman 是加州理工学院的计算和数学科学系教授。Wierman 教授的研究集中在三个看似截然不同的领域:云计算、经济和能源。

走近Fargate,动手配置属于自己的Fargate集群

Fargate简介

就在大约三年前,AWS宣布Amazon Elastic Container Service(Amazon ECS)在AWS上大规模运行和管理容器。 利用Amazon ECS,您可以高规模和高可用性地运行您的工作负载,而无需担心运行自己的集群管理和容器编排软件。

现在,AWS宣布推出AWS Fargate ,使您能够将容器作为基本的计算单元,而无需管理底层实例。 借助Fargate,您不需要在集群中配置,部署或扩展虚拟机来运行容器。 今天,Fargate可以与Amazon ECS一起使用,计划在未来支持Kubernetes(Amazon EKS)的亚马逊弹性容器服务。

Fargate具有灵活的配置选项,因此您可以紧密匹配您的应用程序需求和精确的每秒计费。

  • 无需管理任何EC2实例
  • 基于任务的源生API
  • 计费到CPU和Memory级别,按照Task使用的这些资源按秒计费

Fargate优势

无需管理群集

使用 AWS Fargate,您只需考虑容器,以便能够集中精力构建和运行应用程序。AWS Fargate 消除了管理 Amazon EC2 实例群集的需要。您不必再选择实例类型、管理群集调度和优化群集利用率。使用 Fargate,所有这些麻烦都将不复存在。

无缝扩展

借助 Fargate,您可以轻松扩展应用程序。您不必再担心是否为容器应用程序预置了足够多的计算资源的问题。在您指定应用程序要求 (例如 CPU、内存等) 后,AWS Fargate 会以高度可用的方式管理运行您的容器所需的所有扩展和基础设施。您不再需要决定何时扩展群集,也不需要将其打包即可实现最佳利用率。使用 Fargate,您可以在几秒钟内启动数以万计的容器,并轻松扩展以运行最重要的关键任务型应用程序。

与 AMAZON ECS 和 EKS 集成

AWS Fargate 与 Amazon ECS 无缝集成。您只需按照定义 Amazon ECS 的方式定义您的应用程序。您可以将应用程序打包到任务定义中,指定所需的 CPU 和内存,定义每个容器需要的联网和 IAM 策略,并将所有这些内容上传至 Amazon ECS。完成所有设置后,AWS Fargate 就会为您启动和管理容器。

ECS和Fargate集成的优势总结:

开始动手配置Fargate集群

在之前配置基于EC2的AWS ECS服务时,您需要首先创建包含几个EC2实例的ECS集群。在这个集群中,您需要根据所有运行的容器性能选择合适的EC2实例, 配置好自动扩展策略,以保证底层的EC2实例可以完全有效的承载上层容器。

但是在Fargate中,您可以直接跳过配置底层EC2实例的细节,直接根据您的需要配置您希望使用的容器任务参数。而将承载容器的底层EC2实例交给AWS来维护。

下面就让我们来亲手配置一个属于自己的Fargate集群,来体验Fargate给我们带来的容器配置和管理的便利性。

目前Fargate已经可以在AWS的控制台上正式使用了,不过现在仅支持us-east-1区域。我们登录后切换到us-east-1进行配置。Docker镜像采用的是Docker官方的Nginx镜像。

Fargate基本配置步骤

1. 在Amazon ECS服务下面的Task Definition创建界面可以选择Fargate。

如果希望创建原来使用的普通ECS集群,则是选择EC2类型

2. 设置Task和Container细节

目前Fargate的网络类型只能选择awsvpc类型。awsvpc网络类型会给每一个任务单独分配一个ENI网卡,可以使得在网络层面访问每个任务容器和访问VPC内部的EC2一个。详细关于awsvpc网络类型的介绍,可以参考下面两篇文档:

Under the Hood: Task Networking for Amazon ECSIntroducing Cloud Native Networking for Amazon ECS Containers

因为没有EC2的概念了,所以需要给Task设定内存和CPU。而且在配置的时候下面有推荐的CPU和内存数量

Container配置部分和普通的ECS一样

配置容器名称,容器镜像的URL,容器占用的内存大小以及容器内部希望暴露的端口等。

使用Fargate创建的任务,容器日志会自动启用。启用后容器的日志会在CloudWatch创建并直接打入CloudWatch日志流中。因为用户使用Fargate时不会创建EC2实例,所以推荐打开容器日志,可以更好的监控容器的状态。

3. 设置ECS Cluster

在Cluster配置中选择AWS Fargate使用的集群

在配置集群和网络中,如果要创建新的VPC,那么需要勾选该选项。如果希望利用现有的VPC,那么不勾选该选项即可。后面在创建任务时,会进入分配任务到某个VPC的步骤。

在创建好了集群之后,在总界面上可以看见,每个Cluster可以混搭Fargate以及普通基于EC2的ECS主机。而我们刚才通过Fargate创建的集群,从控制台可以看见,是无需我们维护底层的EC2实例信息的。也不会在这里出现。

集群创建完毕之后。开始创建Fargate的任务。在集群中启动Task,Launch类型选择Fargate

网络部分选择对应希望放入的VPC,如果希望Fargate创建的Task可以被公网访问的话,勾选auto-assign public IP。全部设置完毕之后,点击Run Task,启动任务

4. 查看Fargate相关Task细节

在Task处可以看见运行了Fargate的容器,

点入Task,可以看见该Task绑定的网卡细节,包括私网IP地址和MAC地址。但是如果要看公网地址,那么需要进一步点击ENI

访问该界面发现Nginx已经启动

5. 增加负载均衡器(ALB/NLB)

多个任务创建完毕之后。我们需要给新创建的任务添加负载均衡器。因为Fargate没有EC2实例会暴露出来。只会暴露ENI网卡的IP地址。所以在负载均衡器方面,仅支持可以添加IP地址的ALB和NLB。

添加Target Group,再次注意,因为Fargate没有Instance的概念,所以Target Type需要选择IP

针对这个Target Group添加目标

创建ALB,Target Group选择之前创建的组

创建ALB结束之后,已经可以通过ALB的域名可以正常访问Fargate创建的容器了

6. Fargate容器日志查看

前面说到可以通过CloudWatch Logs的方式记录任务容器的日志。打开CloudWatch服务,在Logs界面写,可以找到新创建的ECS Fargate任务的日志流。

在该日志流中记录了Fargate生成的2个容器的日志

点击进入其中一个容器的日志,可以看见刚才MAC笔记本通过firefox浏览器通过ALB访问容器的日志记录

至此,一个前端通过ALB做负载均衡,后端由Fargate生成的由Nginx组成的集群搭建完成。整个过程不需要您维护任何EC2的实例。完全由AWS来帮您维护EC2实例,您只需要关系您的容器即可。

 

作者介绍:

姚远

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广。现致力于网络和DevOps相关领域的研究。在加入AWS之前,在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。

 

 

Whooshkaa + Amazon Polly:结合阅读与收听,拓宽发布渠道

本文是特邀文章,由 Whooshkaa 的创始人兼 CEO Robert Loewenthal 撰写。

Whooshkaa 总部位于澳大利亚,提供创新的点播式音频播客平台,帮助出版商和广告商赢得听众。我们一直在尝试新的产品和方法,并将二者结合起来,为我们的客户开创全新的解决方案。

Amazon Polly 文本转语音 (TTS) 功能的采用就是极好的例证。很多顶级出版商、体育机构,以及澳大利亚最大的电信公司已在使用 Amazon Polly 来扩充其既有的发行方式。

这些传统信息提供商发现,客户现在不只需要阅读信息,还希望能够收听信息。借助 Amazon Polly TTS,Whooshkaa 让信息提供商能够用 48 种语音和 24 种语言向听众发布信息。

今年早些时候,Amazon Polly 为澳大利亚的主要全国性报纸《The Australian》提供语音版本。订阅者在驾车、锻炼或其他不方便阅读的情况下可以收听 Amazon Polly 朗读的新闻报道、食谱或体育赛事比分。

通过 Amazon Polly,Whooshkaa 的优秀合作伙伴可以方便地选择任何新闻报道,在几秒之内将文本转换为播客内容。我们还提供一些工具,可以合并多个报道,并通过更改口音、音调、速度和音量对声音进行自定义。

Whooshkaa 有庞大的发布网络,也就是说,听众可以选择多种方式来收听内容。最直接的选择是听众常用的播客应用程序。不过,因为 Whooshkaa 与 Facebook 存在独特的合作关系,我们的播客可以通过 Facebook 的音频播放器播放。我们的 Web 播放器可进行自定义,在 Twitter 上也受支持,实际上它可以嵌入任何网站。

我们相信,当这项技术成熟时,出版商能够以任何语言在世界上任何地方提供其新闻报道。新闻报道可以根据听众的偏好和需求进行自定义。

我们还与澳大利亚最大的电信公司 Telstra 和澳大利亚全国橄榄球联赛合作,通过任何联网的智能播音设备发布用户最爱球队的现场比分。用户可以直接向其设备询问当前比分,设备能够立即播报结果。

我们的开发人员 Christian Carlsson 认为,Amazon Polly TTS 的即时性和对各种语言的广泛支持可以为各类出版商带来无限机会。

“通过将功能强大的 Whooshkaa 平台与人工智能集成,我们现在可以在 30 秒内从文字创建完全自动化的播客内容,而这仅仅是开始。”Carlsson 说。

AFL 集成的技术实现

澳大利亚橄榄球联赛 (AFL) 希望粉丝们可以通过与智能播音设备进行语音互动来关注其最爱的球队。为此,Whooshkaa 需要创建一个 RSS 源,每两分钟更新一次,以提供最新结果。下面是我们实现方法的简单概图。

为触发 AFL 的 API 爬网 (其中包含我们需要的数据),我们开发了一个简单的 AWS Lambda 函数来调用 API。该 Whooshkaa API 提取数据、分析数据,然后将数据转换为语音,通过新创建的 RSS 源发布到 Amazon S3。

首先,我们编写 serverless.yml 文件,它负责每两分钟初始化一次请求。这没有什么出奇之处。

Serverless.yml:
createAFLFeeds:
 handler: api.createAFLFeeds
 events:
   - schedule:
       rate: rate(2 minutes)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}

这就会触发以下代码:

WhooshkaaAPI.js
createAFLFeeds() {
    return new Promise((resolve, reject) => {
      this.fetchAFLTeams().then(result => {
        for (const team of result) {
          this.createAFLFeedByTeamID(team['id']);
        }
      }, error => {
        console.log(error);
        reject(error);
      });
      resolve({message: "success"});
    });
}

接下来, createAFLFeedByTeamID 方法向我们的终端节点发送 POST 请求,终端节点执行以下操作:

  1. 从 AFL API 获取数据。为使此方法尽可能易读,数据标准化功能已分离到单独的 AFL 程序包。待分析数据由几个不同的条件确定。如果某个球队正在比赛或者在之前 24 小时内进行过比赛,则获取其比赛数据,否则默认获取该球队的最新新闻。
  2. 通过在 Amazon S3 中存储所返回数据的哈希,确保这些数据是新的。$this->publisher 也是一个抽象类,它包含三个不同存储适配器:本地、Whooshkaa S3 存储桶和 AFL S3 存储桶。我们使用本地适配器处理数据,使用 Whooshkaa S3 存储桶存储相应哈希,将生成的 RSS 源发布到 AFL S3 存储桶。
  3. 通过 Amazon Polly 获取文本并将其转换为音频流。您可以在 makeAudio 方法中看到我们如何处理某些字词,使之按我们的预期发音。例如,体育场馆 MCG 之前被理解成了“McGee”,于是我们改为让 Amazon Polly 逐个字母地读出来。
  4. 创建 RSS 源,将它发布到 AFL 的 S3 存储桶。
AFLController.php:
public function team(string $id)
{
    if (!$team = Team::findById($id)) {
        $this->response->errorNotFound('Invalid team ID.');
    }

    if ($team->isPlayingOrHasRecentlyPlayed()) {
        $story = $team->match;
    } else {
        $story = $team->news;
    }

    $this->publisher->setTeamId($id);
    $this->publisher->setStory($story->getStory());

    $hash = Hash::make($story, $this->publisher->getRemoteStorageAdapter());
    if ($hasBeenUpdated = $hash->hasBeenUpdated()) {
        $fileName = $this->publisher->getFileName();

        $audio = $this->makeAudio($story);
        $this->publisher->store($fileName, $audio->getContent());

        $feed = $this->makeFeed($team, $story);
        $this->publisher->store('feed.xml', $feed->getContent());

        $this->publisher->moveToCloud([$fileName, 'feed.xml']);
        $this->publisher->cleanUp();

        $hash->store();
    }

    return response([
        'rss' => $this->publisher->getRemoteUrl('feed.xml'),
        'updated' => $hasBeenUpdated,
    ]);
}

private function makeAudio($story)
{
   $polly = new Polly;
   $polly->setPhonemes(['live' => 'laɪve']);
   $polly->setProsody('AFL', ['rate' => 'fast']);
   $polly->setSayAs(['MCG' => 'spell-out']);

   $text = $story->getStory();
   // Trim the text to a maximum of 1500 characters.
   if (strlen($text) > 1499) {
       $text = $this->text->setText($text)->trimToWordBoundary(1499);
   }

   try {
       $audioStream = $polly->fetchAudioStream($text);
   }
   catch (\Exception $e) {
       $this->response->error($e->getMessage(), $e->getStatusCode());
   }

   return response()->make($audioStream)->header('Content-Type', 'audio/mpeg');
}

private function makeFeed(Team $team, $story)
{
   $feed = new Feed($this->publisher->getRemoteURL('feed.xml'));
   $feed->setTitle($team->getName() . "'s Official Live Feed");
   $feed->setDescription('An official live feed from the Australian Football League.');
   $feed->setLink('http://www.afl.com.au');
   $feed->setOwner('The Australian Football League', 'podcast@afl.com.au');
   $feed->setImage($team->getImage());
   $feed->appendElements([
       'itunes:subtitle' => "Follow {$team->getName()}'s Live Matches and Latest News",
       'itunes:explicit' => 'no',
       'language' => 'en-us',
       'lastBuildDate' => Carbon::now('UTC')->toRssString(),
       'ttl' => 2,
       'copyright' => 'The Australian Football League',
   ]);

   $feed->setCategories([
       'Sports & Recreation' => [
           'Professional',
       ]
   ]);

   $fileName = $this->publisher->getFileName();
   $metaData = $this->getMetaData($fileName);

   $item = $feed->addItem([
       'title' => $story->getTitle(),
       'link' => $story->getArticleURL(),
       'pubDate' => Carbon::now('UTC')->toRssString(),
       'itunes:duration' => $metaData['playtime_string'],
   ]);
   $item->appendDescription($story->getStory());
   $item->appendEnclosure($this->publisher->getRemoteUrl($fileName, true), $metaData['filesize'], $metaData['mime_type']);
   $item->append('itunes:image', null, ['href' => $team->getImage()]);
   $item->append('guid', $this->publisher->getGuid(), ['isPermaLink' => 'false']);

   return response()->make($feed->output())->header('Content-Type', 'text/xml');
}

《The Australian》“Daily News”的技术实现

The Australian 是 News Corp 旗下的报纸发行商。他们需要将每日 10 大头条新闻以音频形式提供给听众,并且要求头条新闻以播客形式每天更新五次。集成 Amazon Polly 让我们轻松实现了这些要求。下面是我们实现方法的简单概图。

此实现与 AFL 集成非常相似,但有一处不同。这次不生成 RSS 源,而是将播客发布到《The Australian》Whooshkaa 账户上的一栏指定节目。这样,内容几乎能够在 iTunes、Pocket Casts 或其他任何播客播放器中随即播放。

为了完成此实现,我们像之前在 AFL 实现中所做的那样,开发了一个 AWS Lambda 函数,这是因为我们需要在一天中几个特定时间触发“Daily News”终端节点。

Serverless.yml
createDailyNewsStory:
 handler: api.createDailyNewsStory
 events:
   - schedule:
       rate: cron(0 2,6,10,22 * * ? *)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}
   - schedule:
       rate: cron(30 14 * * ? *)
       enabled: ${self:custom.${opt:stage}.ScheduledEvents}
WhooshkaaAPI.js
createDailyNewsStory() {
 const options = {
   hostname: this.commonOptions.hostname,
   port: this.commonOptions.port,
   path: '/news-corp/daily-news',
   method: 'POST',
 };
 return new Promise((resolve, reject) => {
   this.sendRequest(options).then(result => {
     return resolve(result);
   }, error => {
     console.log(error);
     return reject('Could not create "Daily News" story.');
   });
 });
}

接下来, createDailyNewsStory 处理程序调用 createDailyNewsStory 函数,该函数通过我们的 API 触发 dailyNews 终端节点,如下所示。

NewsCorpController.php
public function dailyNews()
{
   $show = Show::find(DailyNewsStory::SHOW_ID);
   $storyBuilder = new StoryBuilder($show);

   $dateTime = Carbon::now('Australia/Sydney')->format('F j (g:00 a)');
   $title = $show->title . ' - ' . $dateTime;

   $story = new DailyNewsStory;
   $story->setLimit(10);
   $story->setTitle($title);
   $story->setDescription($title);

   $episode = $storyBuilder->fetch($story)->publish();

   return $this->response->item($episode, new EpisodesTransformer);
}

DailyNewsStory 扩展 StoryBase 类,该类对 NewsCorpApi 类进行依赖关系注入。来自 DailyNewsStory 的值传递到 NewsCorpApi 类,该类用于获取和标准化数据。

接下来,为获取的所有报道生成音频,以单集形式发布。这是通过 StoryBuilder 类实现的,如下所示。

StoryBuilder.php
public function publish()
{
   $title = $this->story->getTitle();
   $description = $this->story->getDescription();

   if (!$episode = $this->episodes->findByTitleAndDescription($title, $description)) {
       $audio = $this->makeAudio();
       $fileName = $this->storage->putContent($audio->content(), Polly::OUTPUT_FORMAT);

       $data = [
           'podcast_id' => $this->show->id,
           'title' => $title,
           'description' => $description,
           'media_file' => $fileName,
           'length' => $this->storage->getSize($fileName),
       ];

       $episode = $this->episodes->create($data);
   }

   return $episode;
}

public function makeAudio()
{
   $polly = new Polly;

   $audioStream = null;
   foreach ($this->story->getBody() as $body) {
       $audioStream .= $polly->makeAudioStream($body);
   }

   return $polly->makeAudioResponse($audioStream);
}

循环执行 $this->story->getBody() 因为它是包含前述所有 10 条报道的数组。这将通过 Amazon Polly 创建持续的音频流。然后音频流以 mp3 文件形式上传到 S3 存储桶,文件名和其余信息保存到数据库并在请求时返回。

我们很多客户生成大量的丰富内容。我们为他们提供由 Amazon Polly 支持的平台,将其内容转换为音频,然后进行发布、分析和商业化。一家新闻出版商计划通过 Whooshkaa 和 Amazon Polly 文本转语音功能提供其食谱库。

Whooshkaa 一直在寻求音频创新方法。我们寻找新的市场和技术为创作者提供最庞大的发布网络。我们发现,传统出版商和 Amazon Polly 能够成功结合。


作者简介

Robert Loewenthal 是 Whooshkaa 的创始人兼 CEO。Whooshkaa 总部位于澳大利亚悉尼市,是一家提供全方位音频点播服务的公司,可帮助创作者和品牌生成、托管、共享、跟踪内容并进行内容货币化。

AWS DeepLens 扩展:自建项目

AWS DeepLens 提供了极好的机会来学习新技术,例如深度学习和物联网 (IoT),以及构建可以解决实际问题的创新系统。该设备和服务附带有一组预定义的项目,使得从头开始运行非常简单。它设计作为开放平台,使得新手和有经验的开发人员都能构建 (和分享) 新的激动人心的项目。

在本博客文章中,您将逐步完成构建自己项目的过程,包括以下步骤:

  • 训练深度学习模型 (使用 Amazon SageMaker)
  • 优化经过训练的模型以在 AWS DeepLens 边缘设备上运行
  • 开发 AWS Lambda 函数以加载模型并用于在视频流上运行推理
  • 使用 AWS Greengrass 将 AWS Lambda 函数部署到 AWS DeepLens 设备
  • 将边缘 AWS Lambda 函数传递到云中,用于发送命令和接收推理输出
  • 营利

训练深度学习模型 (使用 Amazon SageMaker)

Amazon SageMaker 是面向繁重的数据科学的另一项新服务。它汲取了 Amazon 数据科学家在 Amazon.com 众多业务领域的多年经验,从建议引擎到 Alexa、Amazon Go、Amazon Robotics 乃至其他无穷的基于机器学习的系统。

虽然本篇博客帖子所涵盖的内容极为有趣,不过设计和构建良好机器学习模型的完整过程远不止这些。实际上,通过将深度学习模型部署到 DeepLens 设备,然后传输回来并从输出中获益,一旦通过这个流程实现生产,您就会发现自己会有越来越多的时间构建模型,来解决真实世界的新问题。

对于机器学习新手以及数据科学专家而言,当您在 Amazon SageMaker 中启动 Notebook 实例时,Jupyter Notebook 中提供的一组 Notebook 是一个很好的起点。例如,这里有一个 Notebook,展示了两个流程,一个是转换学习,另一个是使用 Amazon SageMaker 开发工具包构建、训练和部署经过调整的深度学习模型工作流,用于推理终端节点托管。

在本篇博客帖子中,您的重点是将模型项目保存到 Amazon S3 中以启用流程中的后续步骤。

以下示例模型使用 SageMaker 中的训练作业进行训练,包括输出目录以及在其训练中使用的超级参数:

超级参数可帮助您了解如何使用模型。例如,根据 image_shape (3,224,224),我们知道您可以处理彩色图像 (3=RGB 通道),并且需要将其大小调整为 224*224 像素。它还有助于在未来的训练作业中获得更准确的模型,例如,对训练数据 (epochs>2) 运行更多次数,更改 learning_rate 以及添加更多 num_training_samples。

优化经过训练的模型以在 AWS DeepLens 边缘设备上运行

对 DeepLens 设备模型进行硬件优化的步骤是它在任何实际深度学习系统中的重要示例。在之前的步骤中,您拥有几乎无限的云资源用于模型训练,但是,当您希望使用模型进行推理时,面临着一系列的业务约束,主要与业务规模有关。在云中,您可以轻松获得基于 GPU 的大量实例,并可以在很多小时数的训练中运行多个实验。但是,当您要将模型部署到边缘设备时,您需要考虑芯片集 (CPU/GPU)、内存、网络带宽和稳定性等各种设备规格。您的 DeepLens 设备可能会足够强大,能够在高帧率的高分辨率视频流上运行多个模型,不过多数情况下您需要在较低规格的设备上运行。因此,Intel 开发了库,获取 MXNet 模型的构件,并根据 DeepLens 设备中的 Intel 芯片板进行优化。从前一步骤导入模型之后,当您通过 DeepLens 控制台部署模型时,此库自动执行。

完成训练模型后,在将模型导入到 DeepLens 时,您可以指向训练作业 ID。(请注意,Sagemaker 和 DeepLens 需要位于同一个 AWS 区域中才能导入。)

开发 AWS Lambda 函数以加载模型并用于在视频流上运行推理

运行在 IoT 设备 (在我们的案例中是 AWS DeepLens 摄像机) 上的 AWS Greengrass 核心能够运行部署到其中的 AWS Lambda Python 函数。在未来的帖子中,我们将探讨创建 Greengrass 组和核心以及准备和注册设备的步骤,您可以查看 Greengrass 文档中的入门指南。AWS DeepLens 可以自动完成其中的大部分步骤。我们可以侧重于开发 Lambda 函数以部署到所注册和配置的设备。

对于每个 Lambda 函数,请遵循以下步骤:

  • 加载模型
  • 捕获帧
  • 在帧上运行模型推理
  • 解析推理的结果
  • 将结果发布到 MQTT 主题

下面的一些示例是关于这些步骤中的每个步骤。

加载模型

AWS DeepLens 设备预安装了帮助程序库 awscam。利用这个库,您很容易就可以集中注意力于 Lambda 函数逻辑。它包装了大部分常用步骤,例如加载模型。如您在以下示例中所见,您需要提供模型 XML 文件的路径以及模型 (GPU/CPU) 的上下文,然后库会自动执行模型的加载和绑定:

import awscam
modelPath = "/opt/awscam/artifacts/mxnet_deploy_CaltechTransfer_224_FP16_FUSED.xml"
# 将模型加载到 GPU (对 CPU 使用 {"GPU": 0})
mcfg = {"GPU": 1}
model = awscam.Model(modelPath, mcfg)

请注意,此步骤应该在内部推导函数之外定义 (例如,下面的 greengrass_infer_image_run)。此步骤应仅运行一次,因为将模型从磁盘加载到内存再到 GPU 需要几秒钟。

捕获帧

可使用 OpenCV (cv2) 在深度学习模型之前 (调整大小) 和之后 (绘制框和标签) 来处理图像。由于各个模型在不同的输入规范上训练,因此第一步都需要将捕获的帧大小调整为合适的尺寸:

import cv2
input_width = 224
input_height = 224
ret, frame = awscam.getLastFrame()
# 调整帧大小以适应模型输入要求
frameResize = cv2.resize(frame, (input_width, input_height))

在帧上运行模型推理

帮助程序库 awscampredict 命令包装到简单 doInference 函数中,使得 Lambda 函数的这一部分非常简明:

# 在调整大小后的帧上运行模型推理
inferOutput = model.doInference(frameResize)

解析推理的结果

帮助程序库支持几个经典的计算机视觉问题:“classification”用于对象分类,即提供标签;“ssd”(“single-shot-multibox-detector”) 用于对象检测和本地化,为对象提供标签和边界框;以及“segmentation”,用于将图像细分为区域,并提供像素级别的输出 (例如,用于风格转换)。以下示例针对常见的“ssd”类型模型:

modelType = "ssd"
parsed_results = model.parseResult(modelType, inferOutput)['ssd']

将结果发布到 MQTT 主题

最后一部分是发送模型的输出。此逻辑取决于模型的类型以及您尝试解决的问题类型。其中一个简单输出是图像的标签,例如“狗/猫”或者“热狗/非热狗”,如以下示例所示。其他类型的输出还包括从人脸检测模型剪裁图像中的脸部并发送以进行面部识别,视频流中对象的边界框,或图像/视频的神经风格转换。从设备发送输出的最简单方法是通过 MQTT 使用 Greengrass 客户端,如以下代码所示。此通道可以支持文本消息,不过也支持经过文本编码之后的图像 (例如,带有边界框和标签)。

# 创建 greengrass 核心开发工具包客户端
client = greengrasssdk.client('iot-data')
iotTopic = 'iot-data'
for obj in parsed_results:
    if obj['prob'] > max_threshold:
        label = '{{"label":"{}", "prob":{:.2f}%'.format(outMap[obj['label']], obj['prob']*100 )
        client.publish(topic=iotTopic, payload = label)

使用 AWS Greengrass 将 AWS Lambda 函数部署到 DeepLens 设备

Greengrass 以两种主要模式运行 Lambda 函数:固定和按需。针对 AWS DeepLens 模型,推荐方法是使用固定选项作为 Lambda 函数的开始。这花的时间会很长,特别是在深度学习模型很大时 (数百 MB,甚至若干 GB)。您可以通过几种模式来控制触发推理的频率和时间:

  • 最高帧率 – 以无限循环方式运行函数,帧与帧之间没有“休眠”。根据模型推理、预处理和后处理的速度,您可以得到 10-30 FPS 的帧率。
  • 特定帧率 – 以无限循环方式运行函数,帧与帧之间具有预定义的“休眠”。一些任务 (例如人脸检测) 可以按照每秒 1-5 帧的速度运行,并提供检测某一区域中所有脸部时的必需功能。您可以使用 Timer 来控制函数推理的速率:
    from threading import Timer
    def greengrass_infer_image_run():
        # 读取图像
        # 预处理
        # 对图像运行模型推理
        # 解析结果
        # 输出结果
        
        # 异步调用此函数,在 1/2 秒后重新运行
        Timer(0.5, greengrass_infer_image_run).start()
  • 按需 – 每当您希望触发时运行函数,可以手动触发,也可以从其他事件触发。即使您在以固定方式运行函数,也可以使用事件处理程序来按需触发。以下示例演示了如何在每个事件上触发推理,不过您还可以使用事件处理程序,通过解析事件参数来进一步控制函数 (例如,切换模型或模型模式)。
    def greengrass_infer_image_run():
        # 读取图像
        # 预处理
        # 对图像运行模型推理
        # 解析结果
        # 输出结果
        
    def lambda_handler(event, context):
        client.publish(topic=iotTopic, payload="About to call image inference function")
        greengrass_infer_image_run()
    return

为您的 Lambda 函数获取 Greengrass 骨架有一种简单方法,这就是在 AWS Lambda 控制台中使用 Greengrass 蓝图之一,最好是 greengrassHelloWorld,因为在其程序包中已经包括了 Greengrass 客户端库。使用此蓝图创建 Lambda 函数并使用您的代码替换函数的 Python 代码,然后发布新创建的 Lambda 函数。现在您可以将它添加到项目,然后通过 AWS DeepLens 控制台将其部署到设备。

将本地 Lambda 函数传递到云中,用于发送命令和接收推理输出

如前文所述,Lambda 函数可以使用 IoT 主题通过 MQTT 协议写出其输出。内置项目使用的默认输出主题为:

iotTopic = '$aws/things/{}/infer'.format(os.environ['AWS_IOT_THING_NAME'])

您可以在 AWS DeepLens 控制台或 AWS IoT 控制台中找到此内容。在 Lambda 函数中,您可以选择使用相同的格式,也可以使用任何其他主题名称,例如前面示例中的 iotTopic = ‘iot-data’。

在前文中还可以看到,您能够使用 lambda_handler 以按需模式触发 Lambda 函数。为了实现这一点,您需要使用 IoT 控制台,在 IoT 云与 Lambda 函数之间设置订阅。例如,此处是对 Lambda 函数的入站和出站订阅 (ImageInferenceTest 版本 19):

在本例中,边缘 Lambda 函数侦听到主题“trigger-image-inference”,并在每次有事件发布到此主题时触发推理。使用第二个订阅可以查看边缘 Lambda 函数的输出消息,并在云端对其做出反应。例如,您可以使用 AWS IoT 规则引擎筛选特定消息 (例如“face detected”),然后将其发送到其他云端 Lambda 函数、Amazon Elasticsearch Service、Amazon Kinesis 等。请不要忘记部署 (在“Actions”下) 订阅以同样在 DeepLens 设备上启用订阅。

我们还建议您为设备的 Greengrass 组启用 Amazon CloudWatch Logs,以允许您查看 Lambda 函数的日志和 Greengrass 核心信息 (或调试) 日志。您可在 Greengrass 组控制台页的“Settings”部分下找到该设置。

结论

在本篇博客帖子中,您了解了如何扩展在 AWS DeepLens 中提供的开放项目环境。在以后的博客中,您将看到以这个流程为基础的更详细、更具体的示例,它们使用相同的结构和构建块。此处的图形展示了各种步骤,您可在扩展现有项目时 (采用更好的模型或不同 Lambda 函数) 或者从头开始创建全新项目时使用这些步骤。

如果您有任何疑问,请在评论中留言。


补充阅读

了解如何扩展 AWS DeepLens 以使用 AWS Lambda 发送 SMS 通知


作者简介

Guy Ernest 是 Amazon AI 的首席解决方案架构师。他有一个令人非常兴奋的机会来帮助塑造和践行策略,以构建思想共享并广泛使用适用于 AI、机器学习和深度学习使用案例的 Amazon 云计算平台。在空闲时间,他喜欢与妻子和家人呆在一起,收集一些令人尴尬的故事,然后在谈论 Amazon 和 AI 的未来时进行分享。