Author: Localization Team


适用于 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 教授的研究集中在三个看似截然不同的领域:云计算、经济和能源。

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 的未来时进行分享。

AWS Cloud9 – 云开发人员环境

就像任何工匠一样,您在开始编程时首先要了解的一点就是您的工具非常重要。Notepad.exe 可能无法很好地完成工作。一个强大的编辑器和测试管道可提高您的生产力。我仍然记得第一次学习使用 Vim,并且能够在系统和复杂的程序中进行压缩。您还记得在新计算机上设置所有编译器和依赖项有多难吗?您在匹配版本、摆弄配置,然后编写文档以便对项目的新开发人员进行入职培训上浪费了多少个周期?

今天,我们推出了 AWS Cloud9,它是一种用于在您的 Web 浏览器中编写、运行和调试代码的集成开发环境 (IDE)。Cloud9 自带了适用于许多常用编程语言 (Javascript、Python、PHP 等) 的基本工具,因此,您不必安装各种编译器和工具链。Cloud9 还提供了使用无服务器应用程序的无缝体验,使您能够快速地在本地和远程测试或调试之间切换。AWS Cloud9 以常用开放源 Ace Editor 和 c9.io IDE (我们去年已收购) 为基础,旨在使通过极其强大的结对编程功能进行的协作式云开发变得轻松。提供的功能比我在这篇文章中提及的功能多得多,为了快速细分,我将 IDE 划分为 3 个部分:编辑器、AWS 集成和协作。

编辑


Ace Editor 是 Cloud9 的核心,可让您快速、轻松和出色地编写代码。它遵循做一件事情就做好的 UNIX 哲学:编写代码。

它具有您期待的所有典型的 IDE 功能:实时语法检查、自动缩进、自动完成、代码折叠、拆分窗格、版本控制集成、多个光标和选择,并且它还有一些我想重点说明的独特功能。首先,它的速度很快,即使对于大型 (100000 行以上) 文件也是如此。键入时无滞后或其他问题。它内置了 20 多个主题 (过度曝光!),并且您也可以从 Sublime Text 或 TextMate 中引入您喜欢的所有主题。它内置了对项目的 40 多种语言模式和可自定义的运行配置的支持。但最重要的是,它具有 Vim 模式 (或 emacs,前提是您指定通过这种方式工作)。它还具有键绑定编辑器,可让您按需更改编辑器。

该编辑器支持强大的键盘导航和命令 (类似于 Sublime Text 或 vim 插件 (如 ctrlp))。在 Mac 上,借助 ⌘+P ,您可以使用模糊搜索在环境中打开任何文件。借助 ⌘+. ,您可以打开命令窗格,此窗格允许您通过键入名称来调用任何编辑器命令。它还有助于在窗格中显示命令的键绑定,例如,要打开到终端,您可按 ⌥+T。噢,我是否提过有一个终端?它附带了为访问资源而预配置的 AWS CLI。

该环境还附带了适用于许多常用语言的预安装调试工具 – 但并未限定您使用已安装的工具。可轻松添加新程序和定义新的运行配置。

不过,此编辑器只是一个公认的 IDE 中的重要组件。我想为您演示其他一些引人注目的功能。

AWS 集成

AWS Cloud9 IDE 是我用过的第一个真正的“原生云”IDE。该服务是免费提供的,您只需为基础计算和存储资源付费。在创建环境时,系统将提示您选择:实例类型和自动休眠时间,或对所选计算机的 SSH 访问权。

如果您是在 AWS 中运行,则自动休眠功能将在您停止使用 IDE 后立即停止您的实例。对于运行一个更持久的开发人员桌面来说,这样做可节省大量成本。您还可在 VPC 中启动它,以使它能够安全访问您的开发资源。如果您要在 AWS 之外或现有实例上运行 Cloud9,可提供对它将用于在外部计算机上创建环境的服务的 SSH 访问权限。您的环境已预置对您的 AWS 账户的自动和安全访问权限,因此,您不必担心复制凭证。我再说一遍:您可在任何地方运行 Cloud9。

使用 AWS Cloud9 进行无服务器开发

我在 Twitch 上花了很多时间来开发无服务器应用程序。我已部署几百种 lambda 函数和 API。Cloud9 使得对所有这些函数的使用都令人愉快。下面我为您演示其工作原理。


如果您看编辑器的右上角,将看到一个 AWS“Resources”选项卡。打开此选项卡后,您会看到您区域中的所有 lambda 函数 (可通过调整 AWS 首选项窗格中的区域首选项来查看其他区域中的函数)。

您只需双击这些远程函数,即可将它们导入您的本地工作区。这使您能够完全本地编辑、测试和调试您的无服务器应用程序。您还可轻松创建新的应用程序和函数。如果您单击窗格右上角的 Lambda 图标,系统将提示您创建新的 lambda 函数,并且 Cloud9 还将自动为您创建无服务器应用程序模型模板。IDE 附带了对预安装的常用 SAM 本地工具的支持。这是我将在我的大多数本地测试和无服务器开发中使用的工具。由于您具有终端,因此安装其他工具和使用其他无服务器框架都很简单。

从 AWS CodeStar 启动环境

有了 AWS CodeStar,您可轻松预置端到端持续交付工具链以便在 AWS 上进行开发。Codestar 提供了使用 AWS CodeCommit、CodeBuild、CodePipeline 和 CodeDeploy 服务套件构建、测试、部署和管理应用程序的一致体验。现在,只需几次单击,便能预置 Cloud9 环境以开发您的应用程序。将使用已签出 CodeStar 应用程序的代码和已配置的 Git 凭证预配置您的环境。

您可轻松与同事共享此环境,这让我发现了另一组非常有用的功能。

协作

将 AWS Cloud9 与其他编辑器区分开来的许多因素之一是丰富的协作工具。您可通过几次单击来邀请 IAM 用户加入您的环境。

您可查看他们处理的文件、其光标所在的位置甚至共享终端。聊天功能也很有用。

需知信息

  • 对于此服务,超出基础计算和存储的部分不会产生任何额外费用。
  • c9.io 将继续为现有用户运行。您可继续使用 c9.io 的所有功能并添加新团队成员 (如果您具有团队账户)。不久以后,我们将提供工具以便将您的 c9.io 工作区轻松迁移到 AWS Cloud9。
  • AWS Cloud9 已在美国西部 (俄勒冈)、美国东部 (俄亥俄)、美国东部 (弗吉尼亚北部)、欧洲 (爱尔兰) 和亚太地区 (新加坡) 区域提供。

我迫不及待想看到您使用 AWS Cloud9 创作的作品!

Randall

宣布 Alexa for Business 即将发布:将 Amazon Alexa 的支持语音的设备用于工作场所

要说什么东西融入到了我的日常生活中,只有少数几个比得上 Alexa。我使用 Echo 设备和已启用的 Alexa 技能来打开家里的灯、观看我的 Echo Show 中的视频以了解谁在按门铃、每周跟踪我长长的待办事项清单、播放音乐等。我甚至让我的家庭成员也在其 Echo 设备上对他们似乎绝对离不开的各种类型的活动启用 Alexa 技能。我的母亲是年纪比我们大得多的一代人 (请别告诉她我这么说),她使用 Echo 设备以及我为她构建的自定义 Alexa 技能来存储烘焙食谱。她还喜欢探索拥有最新的健康和美食信息的技能。难怪每次我去上班总觉得少了点什么。例如,我希望能够要求 Alexa 在我到达办公室时读出我的新闻简讯。

对于想要让 Alexa 作为工作时的智能助手的人来说,我有一条激动人心的消息。我很高兴地宣布 Alexa for Business 即将发布,它是一项全新的服务,使企业和组织能够将 Alexa 大规模引入工作场所。Alexa for Business 不仅将 Alexa 引入您的日常工作以提升您的工作效率,还为提供了供组织大规模设置和管理 Alexa 设备、启用私人技能以及登记用户的工具和资源。

利用 Alexa for Business 让工作场所更智能

Alexa for Business 可将您了解和喜爱的 Alexa 引入工作场所以在个人和共享 Echo 设备上帮助各种类型的工作人员变得更有效率和更有条理。在工作场所中,共享设备可以放置在公共区域以供任何人使用,并且工作人员可以使用其个人设备在办公点和家里进行连接。

最终用户可以使用共享设备或个人设备。以下是用户可从每种设备执行的操作。

共享设备

  1. 在会议室加入会议:您只需说一声“Alexa,开始会议”。Alexa 就会开启视频会议设备,拨号到您的会议电话,然后进行会议。
  2. 在办公室提供帮助:访问自定义技能以帮助搞清办公室各个方向通往何处、查找开放的会议室、报告建筑设备问题或订购新的办公用品。

个人设备

  1. 启用呼叫和消息收发:Alexa 可帮助拨打电话、按免提和代表您发送消息。
  2. 自动拨号到会议电话:Alexa 可在家里、在办公点或在外出时通过语音使用会议电话号码加入任何会议。
  3. 智能助手:Alexa 可以快速查看日历、帮助安排会议、管理待办事项清单和设置提醒。
  4. 查找信息:Alexa 可帮助您在热门业务应用程序中查找信息,如 Salesforce、Concur 或 Splunk。

以下是可供管理员使用的一些控件:

  1. 预置和管理共享 Alexa 设备:您可以使用 Alexa for Business 控制台设置和管理工作场所周围的共享设备。对于每台设备,您可以设置一个位置 (如会议室名称),然后为该设备分配公共和私人技能。
  2. 配置会议室设置:通过简单的一句“Alexa,开始会议”来开始您的会议。利用 Alexa for Business,您可以配置会议室设置,从而能使用 Alexa 开始会议并控制会议室设备,或者从会议室内的 Amazon Echo 设备直接拨号接入。
  3. 管理用户:您可以邀请您组织内的用户使用您的 Alexa for Business 账户注册其个人 Alexa 账户。当您的用户注册后,您就可以为他们启用您的自定义私人技能以在办公点或家里通过其个人 Alexa 账户使用任一设备。
  4. 管理技能:您可以将组织已创建的公共技能和自定义私人技能分配到您的共享设备,并将私人技能提供给您的已注册用户。您可以创建技能组,然后将其分配到特定共享设备。
  5. 构建私人技能与使用 Alexa for Business API:深入了解 Alexa Skills Kit 并构建您自己的技能。您随后可以将这些技能提供给共享设备以及已在您的 Alexa for Business 账户中注册的用户,它们都不必在公共 Alexa 技能商店中发布。Alexa for Business 提供了其他 API,可用于向您的技能添加上下文和自动执行管理任务。

让我们大致了解一下 Alexa for Business。首先,我将登录到 AWS 控制台并转到 Alexa for Business 服务。

当我登录该服务后,系统将向我显示 Alexa for Business 控制面板。如您所见,我有权管理会议室、共享设备、用户和技能,还能够控制开会、日历和用户邀请。

我首先要设置我的 Alexa 设备。Alexa for Business 提供了一个设备设置工具,用于设置多台设备,将这些设备连接到您的 Wi-Fi 网络,然后将它们注册到 Alexa for Business 账户。此过程与个人 Alexa 设备的设置过程大不相同。利用 Alexa for Business,您可以一次预置 25 台设备。

在预置我的设备后,我可以为要放置这些设备的位置 (例如我的会议室) 创建位置配置文件。我们在 Alexa for Business 控制台中将这些位置称为“Rooms”。我可以转到“Room profiles”文件菜单,然后创建会议室配置文件。会议室配置文件包含您会议室内的 Alexa 设备的常用设置,例如设备的唤醒词、地址、时区、度量单位以及我是否要启用出站呼叫。

下一步是为我设置的设备启用技能。我可以启用 Alexa 技能商店中的任何技能,或者使用私人技能功能来启用我自行构建的技能并将其提供给我的 Alexa for Business 账户。要为我的共享设备启用技能,我可以转到“Skills”菜单选项并启用技能。在启用技能后,我可以将它们添加到技能组并向我的会议室分配技能组。

对于 Alexa for Business,我非常喜欢的一点是我可以使用 Alexa 拨号到会议电话。要启用此功能,我将转到“Conferencing”菜单选项并选择“Add provider”。在 Amazon,我们使用的是 Amazon Chime,但您也可以从不同提供商的列表中进行选择,或者甚至可以添加您自己的提供商 (如果您需要)。

在设置此选项后,我可以说“Alexa,加入我的会议”;然后 Alexa 会要求我提供我的 Amazon Chime 会议 ID,之后,我的 Echo 设备将自动拨号到我的 Amazon Chime 会议。Alexa for Business 还提供了一个快速开始任何会议的智能方法。我们都遇到过以下情况:我们走进会议室但找不到会议 ID 或会议电话号码。利用 Alexa for Business,您可以链接到我的企业日历,让 Alexa 为我展示会议信息,然后自动拨号接入 – 我甚至不需要我的会议 ID。以下是执行此操作的方式:

Alexa 还可以控制会议室内的视频会议设备。为此,我只需为拥有的设备选择技能,选择设备提供商,然后为我的会议室启用设备即可。现在,当我要求 Alexa 加入我的会议时,Alexa 将从会议室中的设备拨号接入,然后开启视频会议系统,无需我执行任何其他操作。

接下来,让我们将话题转到已注册用户。

我首先将为我的组织设置用户邀请,以便我可以邀请用户使用我的 Alexa for Business 账户。要允许用户在组织内使用 Alexa for Business,您可以通过从管理控制台发送用户邀请电子邮件来将其个人 Alexa 账户注册到该服务。如果让我选择,我可以将用户注册电子邮件自定义为包含其他内容。例如,如果我的组织有可在用户接受邀请并完成注册过程后启用的 Alexa 技能,那么我可以添加有关该技能的信息。我的用户必须加入才能使用 Alexa for Business 的功能,例如自动拨号到会议电话、链接其 Microsoft Exchange 日历或使用私人技能。

既然我已自定义我的用户邀请,我将为我的组织邀请用户使用 Alexa for Business,方法为转到控制面板上的“Users”菜单,然后输入用户的电子邮件地址。这将发送一封电子邮件,其中包含可用于加入我的组织的链接。用户将使用其个人 Alexa 设备注册到的 Amazon 账户来加入。让我们邀请 Jeff Barr 加入我的 Alexa for Business 组织。

在 Jeff 使用我的 Alexa for Business 账户进行注册后,他可以了解我为已注册用户启用的私人技能,还可以从他的任一个人设备 (包括他的家庭办公室中的 Echo 设备) 访问工作技能并加入会议电话。

总结

我们在我们的 Alexa for Business 控制台和服务功能简要概述中仅学习了一些皮毛。您可以通过访问 Alexa for Business 网站、阅读 AWS 文档中的管理和 API 指南或通过在 Alexa for Business 控制台内观看入门视频来了解有关 Alexa for Business 的更多信息。

您可以通过访问 Alexa for Business 网站、观看 Alexa for Business 概述视频、阅读 AWS 文档中的管理和 API 指南或通过观看 Alexa for Business 控制台内的入门视频来了解有关 Alexa for Business 的更多信息。

Alexa,说再见并在博客文章上签字。”

Tara 

在笔记本电脑上自定义并显示 AWS DeepLens 项目输出

AWS DeepLens 是一个带有摄像头的支持深度学习的开发人员工具包。它使您能够通过实操计算机视觉教程和预建模型来开发机器学习技能并进行扩展。预构建模型的示例包括:用于识别和检测房间里的不同对象 (如电视显示器、人和瓶子) 的对象检测以及用于识别不同类型的动作 (如刷牙、涂口红、打鼓、拉小提琴和打篮球) 的动作识别。

AWS DeepLens 可让您从设备的摄像头显示流以及在 IoT 控制台和本地设备上显示模型的输出。有关了解有关如何执行此操作的更多信息,您可以参阅文档。在本博客文章中,我们将讨论如何通过 HTML 页面上的 AWS DeepLens 自定义和显示项目输出。

我们将使用:

  • Amazon Cognito,旨在使 HTML 页面能够通过 IoT WebSockets 访问 AWS DeepLens MQTT 消息
  • AWS IoT,旨在处理数据订阅和发布
  • Amazon S3,旨在存储用于显示输出的 HTML 文件

您可以使用 AWS CLI 或 AWS 管理控制台来自定义 AWS DeepLens 项目输出。使用 CLI 和控制台的步骤如下所示。

先决条件

要执行以下步骤以自定义 AWS DeepLens 输出,您需要

  • 拥有一台 AWS DeepLens 设备
  • 注册该设备
  • 创建一个项目并将它部署到该设备

有关更多信息,您可以参阅文档。如果您没有 AWS DeepLens 设备,则可以注册以加入到我们的等待名单。

开始使用 AWS CLI 的步骤

要开始使用 AWS CLI,请执行以下步骤。

步骤 1:创建 Cognito 身份池

每当您注册 AWS DeepLens 设备时,该服务都会创建一个唯一的 MQTT 主题。本主题将在 AWS IoT 控制台上展示您的已部署模型的输出。例如,如果您已部署到 AWS DeepLens 的项目检测到您的周边环境中的对象,则可以使用 MQTT 主题向 IoT 控制台发送检测到的对象名称。在本博客文章中,我们希望能够在自定义 HTML 页面上显示 MQTT 消息。对此,我们将使用 Amazon Cognito。

利用 Amazon Cognito,您可以轻松地使用临时凭证以一种安全的方式访问 AWS 资源,从而不必将 AWS 凭证放在源代码或网页中。

为此,我们首先需要创建一个身份池。我们稍后会将此 IdentityPoolId 提供给 HTML 页面,使其能够使用临时凭证订阅 MQTT 主题。

在 AWS CLI 上,粘贴以下命令。在执行该步骤之前,请确保您是在所需的 AWS 区域中创建身份。

> aws cognito-identity create-identity-pool \ 
  --identity-pool-name DeepLens_Console  \
  --allow-unauthenticated-identities --region us-east-1

响应将采用以下格式:

{
    "IdentityPoolId": "us-east-1:XXXXXXX-1cd1-4c3a-9a39-dac267545277",
    "AllowUnauthenticatedIdentities": true,
    "IdentityPoolName": "DeepLensConsole"
}

记下 IdentityPoolId (以黄色突出显示)。您稍后会将它用作 HTML 页面的参数。

注意:此身份池将允许未经身份验证的用户获取一些访问您的 AWS 资源的权限 (我们将在后续步骤中定义)。这样做是为了简化与 HTML 页面的交互。如果您要增强该页面的安全性,则可以完全取消对未经身份验证的用户的支持,或者将页面访问限制为有限的功能。您还可以向该页面添加注册功能,以使用各种登录提供商对用户进行身份验证。

步骤 2:创建 IAM 角色以允许 AWS IoT MQTT 订阅

AWS DeepLens 设备使用 MQTT 主题和消息通过 IoT 订阅与云进行通信。这些渠道进行了优化以便在 IoT 环境中实现安全可靠的通信。要能够接收这些消息并在 HTML 页面上显示它们,我们需要定义以下 IAM 角色和权限。

首先,为 IAM 角色创建一个策略文档。为此,请将以下内容保存到名为 DeepLensConsoleUnauthName.json 的文件,该文件位于您运行 CLI 命令的同一目录下。请记住将 IdentityPoolId 替换为在上一步中检索到的内容。

在本步骤中,我们将为未经身份验证的用户访问 AWS 资源定义信任策略。现在,该角色没有权限,但我们允许 Amazon Cognito 代入它。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:XXXXX-1cd1-4c3a-9a39-dac267545277"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "unauthenticated"
        }
      }
    }
  ]
}

接下来,创建一个 IAM 角色,然后将您刚刚创建的策略附加到该角色。请注意,您需要使用在上一步中创建的同一路径和文件名。记住角色名称,因为您在后续步骤中需要它。

> aws iam create-role --role-name DeepLensConsoleUnauthName \  
  --assume-role-policy-document file://DeepLensConsoleUnauthName.json

接下来,将 AWSIoTDataAccess 策略附加您刚刚创建的角色。这会将一个允许此角色读取和写入消息的托管策略附加到您的 IoT 终端节点的所有主题。您可以创建一个更严格的策略来限制允许的主题和命令,或者也可以向该角色添加更多权限。例如,您可以使用以下策略 ARN 允许 Amazon Polly 读出标签:arn:aws:iam::aws:policy/AmazonPollyReadOnlyAccess

> attach-role-policy \
  --role-name DeepLensConsoleUnauthName \
  --policy-arn arn:aws:iam::aws:policy/AWSIoTDataAccess

步骤 3:连接身份池和 IAM 角色

现在,您需要将 Cognito 身份池连接到 IAM 角色。请使用以下命令实现此关联。

> aws cognito-identity set-identity-pool-roles \ 
--identity-pool-id "us-east-1:XXXXX-1cd1-4c3a-9a39-dac267545277" \ 
--roles unauthenticated=DeepLensConsoleUnauthName

步骤 4:查找您的账户的 IoT 终端节点

使用 AWS CLI 执行以下步骤:

键入命令。

aws iot describe-endpoint

它将返回您的 IoT 终端节点

{
       "endpointAddress": "XXXXXXXXXXXXX.iot.us-east-1.amazonaws.com"
}

步骤 5:打开 HTML 页面以查看您的项目输出

您现在可以通过传递之前定义的参数在 Amazon S3 中打开静态 HTML 页面:

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=IoTEndpoint&id-pool=IdentityPoolId

例如,以下是包含本指南中使用的值的链接:

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=XXXXXXXXX.iot.us-east-1.amazonaws.com&id-pool=us-east-1:XXXXXXXX-XXXX-4a79-8dd4-568590df9298

根据您的项目所显示的结果,您可以在此 HTML 页面上查看 MQTT 消息、图像和带有边界框的视频流。

开始使用 AWS 管理控制台的步骤

要开始使用 AWS 管理控制台,请执行以下步骤。

步骤 1:创建 Cognito 身份池

每当您注册 AWS DeepLens 设备时,该服务都会创建一个唯一的 MQTT 主题。本主题将在 AWS IoT 控制台上展示您的已部署模型的输出。例如,如果您已部署到 AWS DeepLens 的项目检测到您的周边环境中的对象,则可以使用 MQTT 主题向 IoT 控制台发送检测到的对象名称。在本博客文章中,我们希望能够在自定义 HTML 页面上显示 MQTT 消息。对此,我们将使用 Amazon Cognito。

利用 Amazon Cognito,您可以轻松地使用临时凭证以一种安全的方式访问 AWS 资源,从而不必将 AWS 凭证放在源代码或网页中。

为此,我们首先需要创建一个身份池。我们稍后会将此 IdentityPoolId 提供给 HTML 页面,使其能够使用临时凭证订阅 MQTT 主题。

Amazon Cognito 控制台中,选择“Manage Federated Identities”和“Create new identity pool”。为其指定名称 (例如,“DeepLens_Console”) 并选中选项“Enable access to unauthenticated identities”。

注意:此身份池将允许未经身份验证的用户获取一些访问您的 AWS 资源的权限 (我们将在后续步骤中定义)。这样做是为了简化与 HTML 页面的交互。如果您要增强该页面的安全性,则可以完全取消对未经身份验证的用户的支持,或者将页面访问限制为有限的功能。您还可以向该页面添加注册功能,以使用各种登录提供商对用户进行身份验证。

允许 Amazon Cognito 代表您代入角色。

在下一个屏幕上,您将看到有关如何在移动和 Web 界面中使用 IdentityPoolId 的说明和代码示例。现在,请选择“Edit identity pool”按钮,并记下未经身份验证的身份的 IdentityPoolId 和 role name

步骤 2:编辑 IAM 角色以允许 AWS IoT MQTT 订阅

AWS DeepLens 设备使用 MQTT 主题和消息通过 IoT 订阅与云进行通信。这些渠道进行了优化以便在 IoT 环境中实现安全可靠的通信。要能够接收这些消息并在本地 HTMP 页面上显示它们,我们需要定义具有访问 IoT 资源的适当权限的特定 IAM 角色。

转到 IAM 控制台并搜索未经身份验证的角色的名称。选择带有 Unauth_Role 后缀的角色 (列表上的第二个)。

现在,为角色单击“Attach policy”,搜索 IoT 托管策略,然后选择“AWSIoTDataAccess”。

选择“Attach policy”。

这会将一个允许此角色读取和写入消息的托管策略附加到您的 IoT 终端节点的所有主题。您可以创建一个更严格的策略来限制允许的主题和命令,或者向该角色添加更多权限 (例如,您可以使用以下策略 ARN 允许 Amazon Polly 读出标签):arn:aws:iam::aws:policy/AmazonPollyReadOnlyAccess )。

步骤 3:查找您的账户的 IoT 终端节点

使用 AWS IoT 控制台选择 Settings 选项:

步骤 4:打开 HTML 页面以查看您的项目输出

您现在可以通过传递之前定义的参数在 Amazon S3 中打开静态 HTML 页面。

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=IoTEndpoint&id-pool=IdentityPoolId

例如,以下是包含本博客文章中使用的值的链接:

https://s3-us-west-2.amazonaws.com/im-examples/console/index.html?region=us-east-1&host=XXXXXXXXX.iot.us-east-1.amazonaws.com&id-pool=us-east-1:XXXXXXXX-XXXX-4a79-8dd4-568590df9298

根据您的项目所显示的结果,您可以在此 HTML 页面上查看 MQTT 消息、图像和带有边界框的视频流。

从设备发送要在项目输出页面上显示的图像

边缘 AWS Lambda 函数的简单功能是将文本消息发布到 IoT 主题。您将能够在项目输出页面上 (或在 AWS IoT 控制台中的“test”选项卡上) 看到这些消息。

第一个扩展用于在模型推理之前或之后显示图像 (带边界框)。在本示例中,您将图像上传到 Amazon S3 并将图像 URL 发送到 IoT 主题。

将图像上传到 S3

首先,将 Python 函数添加到边缘 Lambda 函数以将图像上传到 Amazon S3:

# Function to write to S3
# The function is creating an S3 client every time to use temporary credentials
# from the GG session over TES 
def write_image_to_s3(img):
    session = Session()
    s3 = session.create_client('s3')
    file_name = 'DeepLens/image-'+time.strftime("%Y%m%d-%H%M%S")+'.jpg'
    # You can contorl the size and quality of the image
    encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),90]
    _, jpg_data = cv2.imencode('.jpg', img, encode_param)
    response = s3.put_object(ACL='public-read', Body=jpg_data.tostring(),Bucket='<BUCKET_NAME>',Key=file_name)

    image_url = 'https://s3.amazonaws.com/<BUCKET_NAME>/'+file_name
    return image_url

接下来,您将从推理 Python 函数调用该函数:

    ...
    # Upload to S3 to allow viewing the image in the browser
    image_url = write_image_to_s3(frame_with_bb)

并将它添加到输出消息:

    client.publish(topic=iotTopic, payload='{{"img":"{}"}}'.format(image_url))

添加到图像的另一个命令是在模型输出图像 (“ssd”类型) 时显示边界框:

# Adding top n bounding boxes results
def apply_bounding_box(img, topn_results):
        '''
        cv2.rectangle(img, (x1, y1), (x2, y2), RGB(255,0,0), 2)
        x1,y1 ------
        |          |
        --------x2,y2
        '''
        for obj in topn_results:
            class_id = obj['label']
            class_prob = obj['prob']
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            cv2.rectangle(img, (int(obj['xmin']), int(obj['ymin'])), (int(obj['xmax']), int(obj['ymax'])), (255,0,0), 2)
        return img

然后,使用以下代码获取前 n (例如 5) 个结果并将其应用于图像:

     ...
     results = model.parseResult('ssd',results)
     tops = results['ssd'][0:5]
     frame_with_bb = apply_bounding_box(frame_resize,tops)

结论

对此类输出页面还可以添加很多其他命令,将来的博客文章中将介绍其中一些。一部分示例是通过 MQTT 消息流式传输视频并在输出页面上重新生成流,或者嵌入 Amazon CloudWatch 图形或控制面板,等等。

AWS DeepLens 是一个开放式平台,用于生成教育和生产项目等内容。我们期望您构建新的深度学习模型、新的 Lambda 边缘函数、带有云逻辑的新功能以及用于控制和查看项目输出的新的人机接口,由此来扩展内置项目。
在本博客文章中,您看到了一个简单的基于 HTML 的页面,该页面能够安全地连接到您的设备以及在设备中运行的项目,并能够显示项目推理的输出。我希望它能为您提供一个良好的框架和基础,让您针对更高级的使用案例构建更先进的接口。我很想倾听您的想法,并希望与围绕 AWS DeepLens 的社区分享这些想法。


补充阅读

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


作者简介

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

Sunil Mallya 是 AWS Deep Learning 团队的高级解决方案架构师。 他致力于帮助我们的客户构建机器学习和深度学习解决方案以推进其业务。在业余时间,他喜欢烹饪、航海和打造 RC 自动驾驶汽车。