Category: 人工智能


使用 AWS EC2 上的 Apache MXNet 和 Multimedia Commons 数据集来估计图像位置

作者:Jaeyoung Choi 和 Kevin Li | 原文链接

这是由国际计算机科学研究院的 Jaeyoung Choi 和加州大学伯克利分校的 Kevin Li 所著的一篇访客文章。本项目演示学术研究人员如何利用我们的 AWS Cloud Credits for Research Program 实现科学突破。

当您拍摄照片时,现代移动设备可以自动向图像分配地理坐标。不过,网络上的大多数图像仍缺少该位置元数据。图像定位是估计图像位置并应用位置标签的过程。根据您的数据集大小以及提出问题的方式,分配的位置标签可以是建筑物或地标名称或实际地理坐标 (纬度、经度)。

在本文中,我们会展示如何使用通过 Apache MXNet 创建的预训练模型对图像进行地理分类。我们使用的数据集包含拍摄于全球各地的数百万张 Flickr 图像。我们还会展示如何将结果制成地图以直观地显示结果。

我们的方法

图像定位方法可以分为两类:图像检索搜索法和分类法。(该博文将对这两个类别中最先进的方法进行比较。)

Weyand 等人近期的作品提出图像定位是一个分类问题。在这种方法中,作者将地球表面细分为数千个地理单元格,并利用带地理标记的图像训练了深层神经网路。有关他们的试验更通俗的描述,请参阅该文章

由于作者没有公开他们的训练数据或训练模型 (即 PlaNet),因此我们决定训练我们自己的图像定位器。我们训练模型的场景灵感来自于 Weyand 等人描述的方法,但是我们对几个设置作了改动。

我们在单个 p2.16xlarge 实例上使用 MXNet 来训练我们的模型 LocationNet,该实例包含来自 AWS Multimedia Commons 数据集的带有地理标记的图像。

我们将训练、验证和测试图像分离,以便同一人上传的图像不会出现在多个集合中。我们使用 Google 的 S2 Geometry Library 通过训练数据创建类。该模型经过 12 个训练周期后收敛,完成 p2.16xlarge 实例训练大约花了 9 天时间。GitHub 上提供了采用 Jupyter Notebook 的完整教程

下表对用于训练和测试 LocationNet 和 PlaNet 的设置进行了比较。

LocationNet PlaNet
数据集来源 Multimedia Commons 从网络抓取的图像
训练集 3390 万 9100 万
验证 180 万 3400 万
S2 单元分区 t1=5000, t2=500
→ 15,527 个单元格
t1=10,000, t2=50
→ 26,263 个单元格
模型 ResNet-101 GoogleNet
优化 使用动量和 LR 计划的 SGD Adagrad
训练时间 采用 16 个 NVIDIA K80 GPU (p2.16xlarge EC2 实例) 时为 9 天
12 个训练周期
采用 200 个 CPU 内核时为两个半月
框架 MXNet DistBelief
测试集 Placing Task 2016 测试集 (150 万张 Flickr 图像) 230 万张有地理标记的 Flickr 图像

在推理时,LocationNet 会输出地理单元格间的概率分布。单元格中概率最高的图像的质心地理坐标会被分配为查询图像的地理坐标。

LocationNet 会在 MXNet Model Zoo 中公开分享。

下载 LocationNet

现在下载 LocationNet 预训练模型。LocationNet 已使用 AWS Multimedia Commons 数据集中带地理标记的图像子集进行了训练。Multimedia Commons 数据集包含 3900 多万张图像和 15000 个地理单元格 (类)。

LocationNet 包括两部分:一个包含模型定义的 JSON 文件和一个包含参数的二进制文件。我们从 S3 加载必要的软件包并下载文件。

import os

import urllib

import mxnet as mx

import logging

import numpy as np

from skimage import io, transform

from collections import namedtuple

from math import radians, sin, cos, sqrt, asin

path = 'https://s3.amazonaws.com/mmcommons-tutorial/models/'

model_path = 'models/'

if not os.path.exists(model_path):

os.mkdir(model_path)

urllib.urlretrieve(path+'RN101-5k500-symbol.json', model_path+'RN101-5k500-symbol.json')

urllib.urlretrieve(path+'RN101-5k500-0012.params', model_path+'RN101-5k500-0012.params')

然后,加载下载的模型。如果您没有可用 GPU,请将 mx.gpu() 替换为 mx.cpu():

# Load the pre-trained model

prefix = "models/RN101-5k500"

load_epoch = 12

sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, load_epoch)

mod = mx.mod.Module(symbol=sym, context=mx.gpu())

mod.bind([('data', (1,3,224,224))], for_training=False)
mod.set_params(arg_params, aux_params, allow_missing=True)

grids.txt 文件包含用于训练模型的地理单元格。

第 i 行是第 i 个类,列分别代表:S2 单元格标记、纬度和经度。我们将标签加载到名为 grids 的列表中。

# Download and load grids file

urllib.urlretrieve('https://raw.githubusercontent.com/multimedia-berkeley/tutorials/master/grids.txt','grids.txt')

# Load labels.

grids = []

with open('grids.txt', 'r') as f:

for line in f:

line = line.strip().split('\t')

lat = float(line[1])

lng = float(line[2])

grids.append((lat, lng))

该模型使用半径公式来测量点 p1 和 p2 之间的大圆弧距离,以千米为单位:

def distance(p1, p2):

R = 6371 # Earth radius in km

lat1, lng1, lat2, lng2 = map(radians, (p1[0], p1[1], p2[0], p2[1]))

dlat = lat2 - lat1

dlng = lng2 - lng1

a = sin(dlat * 0.5) ** 2 + cos(lat1) * cos(lat2) * (sin(dlng * 0.5) ** 2)
return 2 * R * asin(sqrt(a))

在将图像提供给深度学习网络之前,该模型会通过裁剪以及减去均值来预处理图像:

# mean image for preprocessing

mean_rgb = np.array([123.68, 116.779, 103.939])

mean_rgb = mean_rgb.reshape((3, 1, 1))


def PreprocessImage(path, show_img=False):

# load image.

img = io.imread(path)

# We crop image from center to get size 224x224.

short_side = min(img.shape[:2])

yy = int((img.shape[0] - short_side) / 2)

xx = int((img.shape[1] - short_side) / 2)

crop_img = img[yy : yy + short_side, xx : xx + short_side]

resized_img = transform.resize(crop_img, (224,224))

if show_img:

io.imshow(resized_img)

# convert to numpy.ndarray

sample = np.asarray(resized_img) * 256

# swap axes to make image from (224, 224, 3) to (3, 224, 224)

sample = np.swapaxes(sample, 0, 2)

sample = np.swapaxes(sample, 1, 2)

# sub mean

normed_img = sample - mean_rgb

normed_img = normed_img.reshape((1, 3, 224, 224))
return [mx.nd.array(normed_img)]

评估并比较模型

为了进行评估,我们使用两个数据集:IM2GPS 数据集和 Flickr 图像测试数据集,后者用于 MediaEval Placing 2016 基准测试

IM2GPS 测试集结果

以下值表示 IM2GPS 测试集中正确位于与实际位置的每个距离内的图像的百分比。


Flickr 图像结果

由于 PlaNet 中使用的测试集图像尚未公开发布,因此不能直接比较这些结果。这些值表示测试集中正确位于与实际位置的每个距离内的图像的百分比。


通过目测检查定位图像,我们可以看到该模型不仅在地标位置方面表现出色,而且也能准确定位非标志性场景。

使用 URL 估算图像的地理位置

现在我们试着用 URL 对网页上的图像进行定位。

Batch = namedtuple('Batch', ['data'])

def predict(imgurl, prefix='images/'):

download_url(imgurl, prefix)

imgname = imgurl.split('/')[-1]

batch = PreprocessImage(prefix + imgname, True)

#predict and show top 5 results

mod.forward(Batch(batch), is_train=False)

prob = mod.get_outputs()[0].asnumpy()[0]

pred = np.argsort(prob)[::-1]

result = list()

for i in range(5):

pred_loc = grids[int(pred[i])]

res = (i+1, prob[pred[i]], pred_loc)

print('rank=%d, prob=%f, lat=%s, lng=%s' \

% (i+1, prob[pred[i]], pred_loc[0], pred_loc[1]))

result.append(res[2])

return result


def download_url(imgurl, img_directory):

if not os.path.exists(img_directory):

os.mkdir(img_directory)

imgname = imgurl.split('/')[-1]

filepath = os.path.join(img_directory, imgname)

if not os.path.exists(filepath):

filepath, _ = urllib.urlretrieve(imgurl, filepath)

statinfo = os.stat(filepath)

print('Succesfully downloaded', imgname, statinfo.st_size, 'bytes.')
return filepath

来看看我们的模型如何处理东京塔图片。以下代码从 URL 下载图像,并输出模型的位置预测。

#download and predict geo-location of an image of Tokyo Tower

url = 'https://farm5.staticflickr.com/4275/34103081894_f7c9bfa86c_k_d.jpg'
result = predict(url)

结果列出了置信度分数 (概率) 排在前五位的输出以及地理坐标:

rank=1, prob=0.139923, lat=35.6599344486, lng=139.728919109

rank=2, prob=0.095210, lat=35.6546613641, lng=139.745685815

rank=3, prob=0.042224, lat=35.7098435803, lng=139.810458528

rank=4, prob=0.032602, lat=35.6641725688, lng=139.746648114

rank=5, prob=0.023119, lat=35.6901996892, lng=139.692857396

仅通过原始纬度和经度值,很难判断地理位置输出的质量。我们可以通过将输出制成地图来直观地显示结果。

在 Jupyter Notebook 上使用 Google Maps 直观显示结果

为了直观地显示预测结果,我们可以在 Jupyter Notebook 中使用 Google Maps。它让您能够看到预测是否有意义。我们使用一个名为 gmaps 的插件,它允许我们在 Jupyter Notebook 中使用 Google Maps。要安装 gmaps,请按照 gmaps GitHub 页面上的安装说明操作。

使用 gmaps 直观显示结果只需几行代码。请在您的 Notebook 输入以下内容:

import gmaps


gmaps.configure(api_key="") # Fill in with your API key


fig = gmaps.figure()


for i in range(len(result)):

marker = gmaps.marker_layer([result[i]], label=str(i+1))

fig.add_layer(marker)

fig

事实上,排在第一位的定位估算结果就是东京塔所在的位置。

现在,试着对您选择的图像进行定位吧!

鸣谢

在 AWS 上训练 LocationNet 的工作得到了 AWS 研究与教育计划的大力支持。我们还要感谢 AWS 公共数据集计划托管 Multimedia Commons 数据集以供公众使用。我们的工作也得到了劳伦斯·利弗莫尔国家实验室领导的合作 LDRD 的部分支持 (美国能源部合同 DE-AC52-07NA27344)。

 

使用 Apache MXNet 对基于 CNN 的检测器的训练时间进行基准测试

作者:Iris Fu 和 Cambron Carter

这是一篇由工程总监 Cambron Carter 和 GumGum 的计算机视觉科学家 Iris Fu 联合发布的访客文章。用他们自己的话说,“GumGum 是一家在计算机视觉领域具有深厚专业知识的人工智能公司,能帮助客户充分发挥网络、社交媒体及广播电视每天生产的图像和视频的价值。”

目标物检测的最新技术 

检测是许多经典计算机视觉问题之一,已随着卷积神经网络 (CNN) 的采用而得到显著改善。随着 CNN 越来越多地用于图像分类,许多人都依靠粗糙和昂贵的预处理程序来生成候选区域 (region proposal)。通过诸如“选择性搜索”之类的算法根据区域的“客体性”(它们包含目标物的可能性) 生成候选区域,这些区域随后被馈送到训练用于分类的 CNN。虽然这种方法能得到准确结果,但需要很高的运行成本。Faster R-CNN,You Only Look Once (YOLO) 和 Single Shot MultiBox Detector (SSD) 等 CNN 架构通过将定位任务嵌入到网络中来折中解决该问题。

除了预测等级和置信度,这些 CNN 还尝试预测包含某些目标物的区域极值。在本文中,这些极值只是矩形的四个角点,通常称为边界框。先前提到的检测架构需要已经用边界框注释的训练数据,即,该图像包含一个人,而且此人在该矩形区域内。以下是分类训练数据和检测训练数据:

超级帅气又非常能干的工程师

我们开始对使用 Apache MXNet 和 Caffe 来训练 SSD 的体验进行比较。明显动机是以分布式方式训练这些新架构,而不降低准确性。有关架构的更多信息,请参阅“SSD: Single Shot MultiBox Detector”

训练工具 

对于这组实验,我们尝试了几款 NVIDIA GPU:Titan X、1080、K80 和 K520。我们使用 Titan X 和 1080 在内部进行了几次实验,但也使用了基于 AWS GPU 的 EC2 实例。此帖子仅限于 g2.2x 和 p2.8x 实例类型。幸运的是,我们已经有一些使用 MXNet 的可用 SSD 实施方案,例如这个,在此次讨论的实验中我们就使用了这个实施方案。值得注意的是,为了使实验更详尽,您应该将其他常见框架 (如 TensorFlow) 的基准测试数据也包含在内。

速度:使用 MXNet 调整批处理大小和 GPU 计数的影响

首先,我们来看看使用 MXNet 的多 GPU 训练会话的性能影响。前几个实验侧重于在 EC2 实例上使用 MXNet 对 SSD 进行训练。我们使用 PASCAL VOC 2012 数据集。这第一个练习的目的是了解 GPU 计数和批处理大小对特定 GPU 速度的影响。我们使用了几种不同的 GPU 来说明它们的绝对性能差异。如果您想进一步探索,还可了解有关不同 GPU 的价格和性能的许多信息。让我们从 g2.2x 实例附带的 K520 开始:


请注意,在批处理大小不变的情况下,添加额外的 g2.2x 实例 (每个实例一个 K520) 会使每台机器有大致恒定的速度。因此,每小时的训练周期数几乎呈线性增加。添加机器应该能继续缩短运行时间,但在某一点上可能会影响准确性。我们不在此处探讨这种情况,但需要提一下。

然后,我们想看看在本地 1080 上是否观察到这一趋势:

如预期的一样,一个 1080 轻松胜过五个 K520。除了发现的这个情况外,该实验也引起了一些人的质疑。我们发现在组合中再加入一个 1080 时,每个 GPU 的速度会大大降低。由于本实验中的进程间通信通过以太网进行,因此一开始我们认为自己受到了办公网络的限制。但根据 Iperf 数据,该假设并不成立:

我们的测试表明,我们办公网络中的带宽和传输量都高于两个 EC2 实例之间的这两个值。这就引出了我们的下一个问题:如果批处理大小是导致效率低下的原因怎么办?

啊哈!虽然仍比使用一个 1080 慢得多,但在增加一个 1080 (在单独的机器上) 的同时增加批处理大小可提高速度。我们来看一下训练对具有多个互连 GPU 的机器的影响:


我们使用了自己的内部 NVIDIA DevBox,其中包含四个 Titan X。保持批处理大小不变,但增加 GPU 数量 (技术上减少每个 GPU 的单个批处理大小),可将速度提高大约 2.5 倍!这就引出了一个显而易见的问题:如果我们增加每个 GPU 的批处理大小会怎样?

我们观察到,当我们保持批处理大小恒定 (16),并增加同一机器上的 GPU 数量时,最终速度也会提高大约 2 倍。我们本想进一步探索,但 DevBox 风扇嗡嗡作响,让我们无法再增加批处理大小。我们 1080 实验的奇案仍然无解,作为一个悬而未决的问题而为人所知。AWS 的潜在解决方案可能是使用放置组,在本文中我们不探讨此方案。

准确性:使用 MXNet 调整批处理大小的影响

由于我们花那么精力来调整批处理大小,因此值得探讨一下调整批处理大小如何影响准确性。目标很简单:我们希望在保持准确性的同时尽可能地缩短训练时间。我们在用于徽标检测的内部数据集中进行了这组实验。我们使用 MXNet 在一个 p2.8x large 实例上开展这些实验。如果检测区域和地面实测区域之间的交并比为 20% 或更高,则我们认为检测是正确的。首先,我们尝试了批处理大小 8:

训练的三个不同阶段的查准率查全率曲线。SSD 使用 300×300 像素的输入尺寸,批处理大小为 8。

如果我们同等地对查准率和查全率进行加权,就会得到大约 65% 的查准率和查全率。让我们看看使用 MXNet 调整 SSD 中的输入尺寸时会发生什么:

SSD 使用的输入尺寸为 512×512 像素,其他所有数据均与上一个实验相同。

此时,我们实际上看到性能有所改善,查准率和查全率均为 70% 左右。输入尺寸仍为 512×512 像素,我们来研究一下调整批处理大小对准确性有何影响。同样,我们的目标是保持准确性,同时尽可能缩短运行时间。

SSD 使用的输入尺寸为 512×512 像素,批处理大小为 64。准确性与之前的实验不差上下。

再试一次!准确性保持一致,我们可以通过更大的批处理大小来缩短训练时间,从而从中获益。本着科学的精神,让我们进一步深入实验…

SSD 使用的输入尺寸为 512×512 像素,批处理大小为 192。准确性与之前的实验不差上下。

基本相同,虽然我们的操作准确性与上一曲线相比有所下降。尽管如此,我们成功地保持了准确性,同时将批处理大小增加了 24 倍。重申一下,每个实验都是使用 MXNet 在实施了 SSD 的 p2.8x large 实例上进行的。下面是批处理大小实验的总结,显示了各个实验不差上下的准确性:

MXNet 的 SSD 与使用 Caffe 训练的 SSD 一样准确。

要点是准确性不差上下。言归正传,我们来研究一下训练时间:

使用多种批处理大小的 Caffe 和 MXNet 的训练时间汇总。

当批处理大小增加时,预计减少的训练时间是显而易见的。不过,为什么我们在 Caffe 中增加批处理大小时,训练时间会大幅增加?我们来看看这两个 Caffe 实验的 nvidia-smi:

使用 Caffe 训练时 nvidia-smi 的输出,使用的批处理大小 8。请注意 GPU 使用率的波动。

GPU 要处理反向传播的巨大计算开销,这通过使用率峰值反应出来。为什么使用率会波动?可能是因为需要将训练数据从 CPU 批量传输到 GPU。在这种情况下,当 GPU 等待下一个批处理加载时,使用率将下降为 0%。我们来看看将批处理大小增加为 16 后的使用率:

使用 Caffe 训练时 nvidia-smi 的输出,使用的批处理大小 16。

使用率停滞的情况更为夸张,揭示出显而易见的低效率。这解释了为什么增加批处理大小后训练时间反而增加的现象。这并不新鲜或出乎意料。事实上,我们使用 Keras (和 TensorFlow 后端) 训练 Siamese-VGG 网络时,也遇到过这个问题。关于这个话题的讨论通常倾向于“您的模型越复杂,您能感知到的 CPU 到 GPU 的瓶颈就越少。”虽然这是事实,但并没有多大帮助。是的,如果您通过增加计算梯度的方式让 GPU 承担更多工作,一定会看到平均 GPU 利用率的增加。我们不想增加模型的复杂性,即使我们这样做了,也不是为了帮助我们实现总体目标。在这里,我们关注的是绝对运行时间,而不是相对运行时间。

如果对我们的实验加以总结,那就是使用 Caffe 的 SSD 训练时间远远多于使用 MXNet 的训练时间。使用 MXNet,我们观察到训练时间稳步减少,直至我们达到 192 这一批处理大小临界规模。仅通过采用 MXNet,我们就将训练时间从 21.5 小时缩短为 4.6 小时。与此同时我们没有发现准确性有所降低。这么说绝不是在攻击 Caffe – 它是我们非常看重的一个框架 – 而只是为了庆祝 MXNet 取得的成功。我们可以通过多种方式批评数据加载问题。也许 Caffe2 已经解决了这个问题。在这里我想说明的是我们并不需要这么做,如果有任何东西能够让机器学习开发人员感到暖心,那就是编写尽可能少的代码。虽然我们还有一些问题尚未得到解答,但这是采用新工具时的正常现象。我们很乐意被当做“实验豚鼠”,并且对 MXNet 的未来充满希望。

 

通过机器学习自动优化 DBMS

本客座文章由卡内基梅隆大学的 Dana Van Aken、Geoff Gordon 和 Andy Pavlo 发布。本项目演示学术研究人员如何利用我们的 AWS Cloud Credits for Research Program 实现科学突破。点击:原文链接

数据库管理系统 (DBMS) 是所有数据密集型应用程序最重要的组成部分。它们可以处理大量数据和复杂工作负载。但它们拥有成百上千的配置“开关”,控制了诸如用于缓存的内存量以及将数据写入存储的频率等诸多因素,因此管理起来很困难。组织通常会聘请专家来帮助完成优化活动,但对许多组织来说专家的费用过于高昂。

卡内基梅隆大学数据库研究组的学生和研究人员开发了一款新工具 OtterTune,它可以针对 DBMS 配置开关自动查找较佳的设置。其目标是让每个人都可以轻松部署 DBMS,即使是毫无数据库管理专业知识的人。

与其他 DBMS 配置工具不同,OtterTune 利用在优化之前的 DBMS 部署期间获得的知识来优化新的部署。这可以显著缩短优化新 DBMS 部署所需的时间以及减少所需的资源。为此,OtterTune 维护了一个存储库,用于存储在之前的优化会话中收集的优化数据。它利用此类数据来构建机器学习 (ML) 模型,以捕获 DBMS 对不同配置的响应方式。OtterTune 使用这些模型来指导新应用程序的试验,进而推荐可改善最终目标 (例如,减少延迟或提高吞吐量) 的设置。

在本文中,我们将讨论 OtterTune ML 管道中的每一个组件,并演示这些组件如何彼此交互以优化 DBMS 配置。然后,我们将通过比较 OtterTune 推荐的最佳配置与数据库管理员 (DBA) 及其他自动优化工具选择的配置的性能,评估 OtterTune 对 MySQL 和 Postgres 的优化效力。

OtterTune 是一款开源工具,由卡内基梅隆大学数据库研究组的学生和研究人员开发。GitHub 上提供了所有代码,并且代码已获得 Apache 2.0 许可。

OtterTune 工作原理

下图显示了 OtterTune 的组件和工作流。

在新的优化会话开始时,用户须告知 OtterTune 要优化的最终目标 (例如,延迟或吞吐量)。客户端控制器连接到目标 DBMS,并收集其 Amazon EC2 实例类型和当前配置。

然后,控制器开始第一个观察期,观察 DBMS 并记录最终目标。该观察期结束后,控制器收集 DBMS 中的内部指标,例如,MySQL 从磁盘读取的页数以及写入磁盘的页数。控制器向优化管理器返回最终目标和内部指标。

OtterTune 的优化管理器收到指标时,将指标存储在存储库中。OtterTune 根据结果计算控制器应在目标 DBMS 上安装的下一个配置。优化管理器向控制器返回此配置,并估计优化此配置能够获得的预期改进。用户可以决定是继续还是终止优化会话。

备注

OtterTune 维护其支持的各 DBMS 版本的开关黑名单。该黑名单中包含无优化意义的开关 (例如,DBMS 存储文件的路径名称),或者可能导致严重或隐藏后果 (例如,可能导致 DBMS 丢失数据) 的开关。每个优化会话开始时,OtterTune 会向用户提供该黑名单,让用户添加他们不希望 OtterTune 优化的任何其他开关。

OtterTune 做出了一些假设,这些假设可能会限制其对某些用户的有用程度。例如,它假设用户拥有管理权限,允许控制器修改 DBMS 的配置。如果用户不具备该权限,则可以在其他硬件上部署另外一份数据库,用于进行 OtterTune 优化试验。这要求用户重播工作负载跟踪或转发来自生产 DBMS 的查询。有关假设和限制的完整讨论,请参阅我们的文章

机器学习管道

下图显示了在数据流过 OtterTune 的 ML 管道时如何得到处理。所有观察结果都保存在 OtterTune 的存储库中。

OtterTune 先将观察结果传入 Workload Characterization 组件。此组件确定能够最准确地捕获不同工作负载的性能差异和显著特点的一小部分 DBMS 指标。

接下来,Knob Identification 组件生成对 DBMS 性能影响最大的开关的排序列表。OtterTune 随后将所有此类信息馈送到 Automatic Tuner。此组件将目标 DBMS 工作负载映射到其数据存储库中最相似的工作负载,并再次使用此工作负载数据生成更好的配置。

我们来详细讨论一下 ML 管道中的每个组件。

Workload Characterization: OtterTune 使用 DBMS 的内部运行时指标来确定工作负载行为方式的特征。这些指标准确代表了工作负载,因为它们捕获了其运行时行为的许多方面。不过,许多指标都是多余的:一些指标其实是相同的,只是单位不同;还有一些指标表示 DBMS 的各独立组件,但它们的值高度相关。必须清除多余的指标,这可以降低使用这些指标的 ML 模型的复杂性。为此,我们基于 DBMS 指标的关联模式将它们集群化。然后,我们从每个集群中选择一个具有代表性的指标,具体而言就是最接近集群中心的指标。ML 管道中的后续组件会使用这些指标。

Knob Identification:DBMS 可能拥有数以百计的开关,但只有一小部分能够影响 DBMS 的性能。OtterTune 利用常用的功能选取技术 (称为 Lasso) 来确定严重影响系统整体性能的开关。通过向存储库中的数据应用此项技术,OtterTune 可以确定 DBMS 开关的重要性顺序。

然后,在提供配置建议时,OtterTune 必须决定使用多少个开关。使用过多开关会明显增加 OtterTune 的优化时间。使用过少开关则会导致 OtterTune 找不到最佳配置。为了自动完成此流程,OtterTune 使用一种增量方法。这种方法逐渐增加优化会话中使用的开关数。使用这种方法,OtterTune 可以先针对一小部分最重要的开关探究并优化配置,然后再扩展范围,考虑其他开关。

Automatic Tuner:Automated Tuning 组件在每个观察期后执行两步分析,确定 OtterTune 应该推荐的配置。

首先,系统使用在 Workload Characterization 组件中确定的指标的性能数据,来确定上一个优化会话中最能代表目标 DBMS 工作负载的工作负载。它将会话的指标与之前工作负载的指标进行比较,确定对不同开关设置做出相同反应的指标。

然后,OtterTune 选择另一个开关配置进行尝试。它会根据收集的数据以及存储库中最相似工作负载的数据,调整统计模型。使用此模型,OtterTune 可以预测 DBMS 在每个可能配置下的性能。OtterTune 优化下一个配置,换探索为利用,从收集信息以改善模型变为不断尝试在目标指标上做得更好。

实现

OtterTune 是用 Python 编写的。

对 Workload Characterization 和 Knob Identification 组件而言,运行时性能并不是主要考虑因素,因此我们使用 scikit-learn 来实现对应的 ML 算法。这些算法在后台进程中运行,从而在 OtterTune 存储库中有新数据可用时纳入这些数据。

而对于 Automatic Tuner,ML 算法是关键。它们在每个观察期之后运行,从而纳入新数据,以便 OtterTune 能够选取下一次尝试的开关配置。由于要考虑性能,我们使用 TensorFlow 来实现这些算法。

为了收集有关 DBMS 硬件、开关配置和运行时性能指标的数据,我们将 OtterTune 的控制器与 OLTP-Bench 基准测试框架集成在了一起。

试验设计

为进行评估,我们比较了使用 OtterTune 选择的最佳配置与使用以下配置的 MySQL 和 Postgres 的性能:

  • 默认:DBMS 提供的配置
  • 优化脚本:开源优化顾问工具生成的配置
  • DBA:DBA 选择的配置
  • RDS:由 Amazon RD 管理并部署在相同 EC2 实例类型上的 DBMS 的自定义配置

我们在 Amazon EC2 竞价型实例上进行了所有试验。我们在两个实例上运行了每个试验:一个针对 OtterTune 控制器,另一个针对目标 DBMS 部署。我们分别使用了 m4.large 和 m3.xlarge 实例类型。我们在配备 20 个内核和 128 GB RAM 的本地计算机上部署了 OtterTune 的优化管理器和数据存储库。

我们使用了 TPC-C 工作负载,它是评估联机事务处理 (OLTP) 系统性能的行业标准。

评估

对于我们在试验中使用的每个数据库 (MySQL 和 Postgres),我们测量了延迟和吞吐量。下图显示了结果。第一张图显示 99% 的延迟,表示最坏情况下完成事务的时间。第二张图显示吞吐量结果,以每秒完成的平均事务数衡量。

MySQL 结果

比较 OtterTune 生成的最佳配置与优化脚本和 RDS 生成的配置后发现,使用 OtterTune 配置,MySQL 的延迟减少了大约 60%,吞吐量提高了 22%-35%。OtterTune 还生成了几乎与 DBA 选择的配置一样出色的配置。

只有少数几个 MySQL 开关显著影响 TPC-C 工作负载的性能。OtterTune 和 DBA 生成的配置为每个这些开关提供了理想的设置。RDS 的表现稍差一些,因为它为一个开关提供了次优的设置。优化脚本的配置效果最差,因为它只修改了一个开关。

Postgres 结果

在延迟方面,与 Postgres 的默认设置相比,优化工具 OtterTune、DBA 和 RDS 生成的配置全都获得了类似的改善。我们或许可以把这些改善归功于 OLTP-Bench 客户端与 DBMS 之间的网络往返行程所需的开销。在吞吐量方面,与 DBA 和优化脚本选择的配置相比,OtterTune 建议的配置使 Postgres 的吞吐量提高了大约 12%,与 RDS 相比,提高了大约 32%。

与 MySQL 类似,只有少数几个开关显著影响 Postgres 的性能。OtterTune、DBA、优化脚本以及 RDS 生成的配置全都修改了这些开关,并且大部分提供了非常理想的设置。

结论

OtterTune 可自动完成为 DBMS 的配置开关寻找理想设置的过程。为优化新的 DBMS 部署,它会再次使用之前优化会话中收集的训练数据。由于 OtterTune 不需要生成初始数据集即可训练其 ML 模型,因此优化时间明显缩短。

接下来做什么?为适应 DBaaS 部署 (无法远程访问 DBMS 主机计算机) 的日益普及,OtterTune 将很快能够在无需远程访问的情况下,自动检测目标 DBMS 的硬件功能。

有关 OtterTune 的更多详细信息,请参阅我们的文章或 GitHub 上的代码。请密切关注本网站,我们即将在网站中提供 OtterTune 作为联机优化服务。
作者简介

Dana Van Aken 是卡内基梅隆大学计算机科学系的博士生,由 Andrew Pavlo 博士指导。她的主要研究课题是数据库管理系统。她目前的工作重点是开发自动化技术以使用机器学习来优化数据库管理系统。

Andy Pavlo 博士是卡内基梅隆大学计算机科学系数据库学科的助理教授,也是卡内基梅隆大学数据库研究组和并行数据实验室的一名成员。他的工作还需要与英特尔大数据科技中心协作。

Geoff Gordon 博士是卡内基梅隆大学机器学习系的副教授兼副教导主任。他的研究课题包括人工智能、统计机器学习、教育数据、游戏理论、多机器人系统,以及概率域、对立域和常规求和域的规划。

 

本文首发于亚马逊AWS官方博客网站,原创文章如转载,请注明出处。

 

 

新增 – Amazon Connect 和 Amazon Lex 集成

Amazon ConnectAmazon Lex 这两项我最喜欢的服务最近推出了一些增强功能,我非常高兴有机会与大家分享这些功能。Amazon Connect 是一项基于云的自助式联络中心服务,可使任何企业能够轻松地以更低成本提供更优质的客户服务。Amazon Lex 是一项使用语音和文本构建对话界面的服务。通过将这两项服务相集成,您可以利用 Lex 的自动语音识别 (ASR) 和自然语言处理 (NLU) 功能为客户打造自助式体验。为了做到这一点,Amazon Lex 团队创建了新的深度学习模型,专门用来识别 8kHz 音频样本中的呼叫中心对话,稍后我将对此进行详细介绍。如果自动程序可以处理 90% 的客户请求,则客户等待时间将会减少,从而有更多时间来使用您的产品。

如需 Amazon ConnectAmazon Lex 的更多背景信息,我强烈建议您阅读 Jeff 之前发布的有关这两项服务的帖子 [1][2] (尤其是在您喜欢 LEGO 的情况下)。


接下来,我将向您展示如何使用这项新集成。大家也许知道,我喜欢在自己的 Twitch 频道上试用这些服务。我会选择一款我们针对 Twitch 频道构建的应用程序,然后针对博客进行修改。在这款应用程序的核心,用户拨打 Amazon Connect 号码后,随即会出现一系列“连锁反应”:将用户连接到 Amazon Lex 自动程序,自动程序调用 AWS Lambda 函数,而函数随后执行一组操作。

我们的应用程序有什么作用呢?我想最终解决哪个代码编辑器最为出色这个问题:我钟爱 Vim,这是一款超赞的编辑器,它的代码编辑功能非常棒 (堪称最好的编辑器)。我的同事 Jeff 偏爱 Emacs,它是一款强大的 操作系统编辑器…如果您的手指头足够灵活的话。另一名同事 Tara 习惯用 Visual Studio 和 Sublime。究竟哪个才是最佳编辑器?无需为此纠结,我想还是让诸位亲爱的读者来投票吧,不要担心您甚至可以为 butterflies投票。

对投票感兴趣?请拨打 +1 614-569-4019,告诉我们您要为哪款编辑器投票!我们不会存储您的号码,也不记录您的语音,尽管放心投票吧,您可为 Vim 多次投票。想看投票的直播吗? http://best-editor-ever.s3-website-us-east-1.amazonaws.com

现在,我们该如何进行巧妙设计呢?

Amazon Lex

我们先看看 Lex 方面的相关设计吧。创建一个名为 VoteEditor 的自动程序,它具有单个目的 VoteEditor、名为 editorConnectToAgent的单个槽。我们会将编辑器槽填满不同的代码编辑器名称 (或许不会考虑 Emacs)。

AWS Lambda

我们的 Lambda 函数也非常简单。先创建一个Amazon DynamoDB 表来存储投票信息,然后创建帮助程序方法来响应 Lex (build_response),随后再确定逻辑。我们将使用 Python 这种最优秀的语言在最佳编辑器中进行编写。

def lambda_handler(event, context):
    if 'VoteEditor' == event['currentIntent']['name']:
        editor = event['currentIntent']['slots']['editor']
        resp = ddb.update_item(
            Key={"name": editor.lower()},
            UpdateExpression="SET votes = :incr + if_not_exists(votes, :default)",
            ExpressionAttributeValues={":incr": 1, ":default": 0},
            ReturnValues="ALL_NEW"
        )
        msg = "Awesome, now {} has {} votes!".format(
            resp['Attributes']['name'],
            resp['Attributes']['votes'])
        return build_response(msg)
    else:
        return build_response("That intent is not supported yet.")

基本上,如果我们收到某个编辑器的投票,而该编辑器并不存在,那么我们会添加该编辑器并附上 1 次投票。否则会增加该编辑器的得票数 (每次增加 1 票)。非常简单。

我们会告诉 Lex 自动程序使用 Lambda 函数来实现我们的目的。在执行下一步之前,我们可以测试一切是否能在 Lex 控制台中正常运行。

Amazon Connect

接下来就到了有趣的部分了。将 Lex 自动程序连接到 Connect 联系流,然后开始存储这些结果。

在联系流中使用自动程序之前,必须确保 Amazon Connect 实例拥有对它的访问权限。为此,我们需要转到 Amazon Connect 服务控制台,选择实例,然后导航至联系流。其中应该有一个名为“Amazon Lex”的部分,在那里,您可以添加自己的自动程序!

现在 Connect 实例已经知道 Lex 自动程序可供调用,接下来我们就可以创建包含 Lex 自动程序的新联系流。通过熟悉的“获取客户输入”小部件将自动程序添加到流中,但在单击该小部件时,其中会出现一个新的“Amazon Lex”选项卡。

里面提供有诸多选项,但简单来说,我们要添加使用自动程序的目的、要使用的自动程序版本,以及介绍自动程序的简短提示 (可能会提示客户输入信息)。

我们的最终联系流如下所示:

在真实示例中,系统可能会允许客户通过 Lex 自动程序执行许多事务,然后,根据“Error”或“ConnectToAgent”目的,将客户放入他们可与真人对话的队列中。

在此,我想特别指出教 Lex 理解 8kHz 音频的巨大优势及其如此重要的原因。Lex 最初接受训练时使用的语音模型与电话相比占用较大的带宽信道。当您与 Alexa 或 Lex 自动程序对话时,系统通常会以 16kHz 的最低速率对您发送的文本进行采样。通过这种保真度较高的记录,可更加轻松地识别声音差异,如“ess”(/s/) 和“eff”(/f/),音频专家如是告诉我。如果使用 Alexa,则音频流还会来自我们控制的有限的一些设备,因此,我们确切地知道麦克风发出的声音应是什么样子。但是,电话及其记录的音频依赖由人类植入的一些“卑鄙技巧”。人类及其耳朵非常擅长根据情景来辨识质量较差的录音的内容 (要获取此方面的证据,请参阅 NASA 阿波罗录音)。因此,大多数数字电话系统默认设置为使用 8kHz 采样率 (而非更高采样率),从而使带宽和保真度之间达到了一种较好平衡。这种基本采样率的首要问题是,您还必须应对以下事实:大量电话数据已失真 (您现在能听到我说话吗?)。目前市面上有数百家不同制造商提供的数千种不同设备,以及大量不同的软件实施方案和编解码器。那么,您该如何解决这一识别问题呢?

Lex 团队找出了解决此问题的最佳方法,即,扩展他们用来解析语音输入的模型集,以纳入专为 Connect 集成设计的 8kHz 模型。他们在 8kHz 数据集的真实客户服务呼叫中保留了自己的模型和网络,而且与其传统模型相比,单词识别率提高了 60% 以上。检测各个单词的准确率越高,识别目的的准确率也就越高。团队为此付出了巨大努力,这可让众多客户通过 Connect 执行更多操作。

最后再说明一下,Connect 使用完全相同的 PostContent 终端节点,因此,如果您是外部开发人员,也可使用该节点,而无需通过 Connect 来利用 Lex 中的这项 8kHz 功能。

希望大家都能喜欢这项功能,与往常一样,要了解真实细节,请参阅这些文档API 参考指南

Randall

Capital One 与Alexa – 看美国银行业如何玩转人工智能

随着深度学习和语义分析技术的飞速发展,基于声音的人工智能受到不同行业、不同市场越来越多的青睐。就像触屏技术颠覆了整个个人移动设备行业一样,我们相信语音技术将会是未来的颠覆者之一。在这个领域已经有很多先驱的产品问世,而其中扮演主要角色之一的就是来自亚马逊的智能音箱Echo。

什么是Alexa?

我们先简单介绍一下Echo及其背后人工智能Alexa的故事。Echo是一个可以与用户对话的智能音箱,他帮助客户完成各种信息查询(诸如天气,行车路线规划等),执行各种日常任务(如闹钟,音乐等),还能帮助客户在亚马逊电商网站搜索并购买商品。其实Echo本身并不具备复杂的学习分析能力,它的智能部分是通过互联网连接到其云端的Alexa服务完成的。也就是说如果Echo是手,Alexa就是她云端的大脑。Echo的成功正是来自于Alexa。作为云端的人工智能,Alexa的Skill Kits被亚马逊开放出来供全球更多的智能设备制造商使用,这不仅帮助这些厂商更容易地完成他们自己的智能产品,更是打造了一个庞大的基于Alexa的生态圈。很多厂商将自己研发的新的Alexa Skills Kits开源共享,使得Alexa这个超级大脑在各行各业都有着越来越多的智能功能。而刚刚过去的AWS 2016 Re:Invent大会上,Alexa也被正式打造成AWS云计算的一个服务 – LEX提供给广大客户。

Capital One 与Alexa

如果在其他行业看到Alexa广泛应用,大家可能并不新奇。但如果说在传统谨慎的银行业看到Alexa依然能大展身手,不得不说是一个惊喜。下边我们来介绍一下全美最大的银行之一Capital One如何玩转Alexa从而给客户带来全新的银行体验。

Capital One 于2015年的Re:Invent大会公布了与AWS的合作。用他们CIO Rob Alexandar 的话来说:“金融行业吸引了全世界最难对付的的网络黑客。通过与AWS的深度合作,我们意识到在云中的运维要远比我们在自己本地的数据中心安全”。可见AWS的安全性对银行业来讲并不是一个技术问题,而更多的是一种思维模式的转换和对云常态的接纳。

在探索Alexa的应用上,去年Capital One已经提出了业务设计的原型,而今年他们真正完成了Capital One 基于Alexa的智能语音银行助手。从互联网应用的角度来讲,如果说网上银行或者手机银行是银行与客户的传统互动模式,那么现在智能语音银行将开启一个全新的客户互动体验。具体来说,Capital One基于Alexa开发并实现了如下功能(第一阶段):

  • 信用卡账单支付
  • 信用卡余额查询
  • 储蓄账户余额查询
  • 列出近期消费记录
  • 查询信用卡可用额度
  • 查询信用卡账单到期日
  • 账户信息概况/总览

不难看出,目前基于智能语音的服务主要是信息查询类服务,只有第一条是交易类的信用卡支付。究其原因,一方面信息查询类服务在Alexa的应用上本就是一个经典场景;另一方面从安全的角度来说,在最糟糕的情况下,如果别人窃取了你的Alexa语音助手账号,他所能做的唯一交易也仅是替你付清信用卡账单。当然,关于安全这点,我们后边会详细分析,接着我们要说说Capital One设计这个智能语音银行助手的一些心路历程:

首先,与其他大型企业或集团的慢决策风格相似,在谨慎的银行业接受并使用智能语音银行对Capital One来说无疑是一个大胆的尝试。除了组建专门的项目组之外,Capital One 采用了Conference Driven Development的模式,通过内部不同团队间的数次会议讨论,大力促成并推荐基于Alexa的项目。

其次,Capital One也调研了其广泛的客户群体,搜集客户的声音和反馈。根据调查结果,客户对可以解放双手的智能语音银行很感兴趣,并且除了查询信息,他们甚至接受转账交易类的服务;但客户同时也提出了对软硬件安全的担心,并且不希望自己的金融信息保存在提供智能语音服务的第三方那里(比如亚马逊)。同时,Capital One将调研中客户感兴趣的主要服务功能分成了两类,一是任务类,一是状态查询类(比如,总的来说我的金融资产状况是否健康?)。这方便后期的进一步功能开发。

第三,从语义分析的角度,Capital One 基于客户的各种需求,总结了一些需要注意的地方。例如,注意结合语境回答问题,避免对余额偏低的客户用玩笑的口吻回复(因为他们可能真的不富有)。再比如,避免问客户一些可以联网查询到的常识问题,避免用生硬晦涩的专业金融或法律法规词汇回答客户问题,尽量使回复简单易懂口语化。另外,相比于机械的回答,Capital One赋予了丰富的个人性格给智能语音银行助手,使其与客户的互动更人性化,甚至有时附带幽默感。最后,结合客户的谈话深度和广度,Capital One综合了客户常用的各种表述方式开发了新的Alexa Skills Kit,努力使智能语音银行助手既能对客户提出的、意图明显的问题进行快速回答,又能在一些模糊的、泛泛的话题上不失语境地与客户互动。比如针对近期信用卡的消费记录,Capital One总结了来自不同客户的150多种询问方式,并将其植入Alexa Skills Kit,使得智能语音银行助手在不同语境下都能更好的理解客户的问题。

第四,在安全的方面,Capital One 尽量平衡了安全与便捷之间的取舍。如果纯粹的追求安全,在客户使用智能语音银行之前,需要预先连接账号,手动登录mobile app 授权,回答安全问题,验证码等等。但这种需要额外手动操作的设计违背了智能语音银行的初衷 – 那就是无手操作的便捷性,也就是客户体验大打折扣。所以在权衡了客户体验与安全性之后,Capital One采用了下边几点作为其Alexa语音银行助手的安全管理原则:1)开发了软件OAuth用来对客户使用的第三方智能硬件授权,使得任何客户的语音信息不会在第三方保存。在这个案例下,Capital One对亚马逊的智能音箱Echo做了授权。2)一个可选的语音登录密码:对安全敏感的客户可以打开这个选项,读出其语音密码以登录。对安全不是那么敏感的客户可以关闭这个选项,直接登录智能语音银行助手。3)无需任何手动操作,无需登录mobile app。通过这几点措施,Capital One既满足了客户无手操作的便捷性,又保证了客户信息的足够安全。

最后,在研发方面Capital One也给出了他们总结的几点建议。比如,区分客户首次登录和后续登录时的对话方式,许多首次登录的问题和客户已回答的一些偏好应自动记录,在后续登录时避免重复提问。再如,建立反馈学习的机制,当客户告知语音助手他的回答不正确时,后台的应该有相应的程序捕捉并总结这些回答错误的问题,以便将来更好的完善改进智能语音助手。最后,通过借助beta 客户群和A/B 测试更好的收集早期反馈 。

时至今日,据悉Capital One智能语音银行助手项目的第二阶段也即将启动,会有更多的功能加入到Alexa智能语音银行助手中,比如敏感信息掩盖,信用卡激活,锁卡或解锁,信用卡使用周报等等。

总结

以上是Capital One 在Alexa智能语音技术上的一个成功实践,也是美国金融行业基于云计算和人工智能技术实现快速创新的一个缩影。它真实反映了金融服务贴近生活、服务大众的场景金融理念,与国内的普惠金融政策不谋而合。随着利率市场化和利息收入的不断下滑,国内的银行业相继发力低净值客户群,推动对私业务,通过互联网开拓更多的新服务以寻求业务增长。在云计算已经成为新常态的全球大环境下,在越来越多的云服务百花齐放助力企业快速创新的趋势前,金融改革浪潮下的银行家们,你们准备好了么?

作者介绍:

刘宁,致力于AWS数据库云服务的应用和推广。在加入AWS之前,他曾任微软中国企业服务部产品营销经理,华侨银行科技部IT产品经理,对企业应用设计及架构有着深刻了解。

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

在准备写下这篇文章时,我的思绪不禁回到了自己的孩提时代(那时候大部分时间都用在了看电视上)。上世纪六十到七十年代,出现了大批热门的计算机与机器人语音产品。一瞬间,哈尔-9000、B9(来自〈迷失太空〉)、初代《星际旅行》中的计算机以及罗茜(来自〈摩登家庭〉)等形象再次涌现在我眼前。那个时候,人们都热衷于这种机械生成的语音——声音精准、清晰且缺乏人类应有的情感。

时间快速推进,如今我们已经拥有大量出色的计算机生成语音应用及用例可供选择,业界将其称为文本到语音或者简称TTS功能。娱乐、游戏、公共发布系统、电子学习、电话、辅助应用及设备乃至个人助手都已经开始将其引入。其中大部分应用能够很好地对接移动环境,但本地处理及存储型方案则表现平平。

你好, Polly

为了解决此类用例的实际需求(当然也包括其它大家能够想到的场景),我们推出了Polly,这项云服务能够将文本转化为逼真的语音,并允许大家将其用于您的工具及应用程序当中。Polly目前支持总计47种男声/女声表达并涵盖24种语言(暂不支持中文),而更多语言及语音选项亦在路线图规划之中。

Polly的设计目标在于解决语音生成工作中的大部分常见挑战。举例来说,我们以“live”一词为例,“I live in Seattle”代表我生活在西雅图,而“Live from New York”则代表由纽约发回的现场直播,二者在意义上显然存在差别。Polly能够理解这种同一词汇在不同语境下的含义,并给出完全不同的发音。类似的例子还有“St.”。根据语言类别及上下文背景的不同,其可以代表(或者应该发音为)“Street(街道)”或者“saint(圣)”。Polly同样能够准确识别二者间的差别。另外,Polly亦能够处理单位、分数、缩写、货币、日期、时间以及其它复杂的语言成分与表达方式。

为了实现这一目标,我们与以Polly支持的目标语言为母语的语言专家们进行合作。我们要求每位参与者利用其选定的语种提供大量单词与短语发音,并将音频拆分为声音单元,即双音素。

Polly在处理普通文本时拥有良好表现。大家只需要提交文本,Polly即可顺利完成接下来的工作,即以音频文件或者流媒体的方式给出精准、自然且与人类相似的语音表达。对于其它更为复杂的应用,大家可以使用SSML(即语音合成标记语言)为Polly提供更多附加信息。举例来说,如果您的文本内容中包含多种语言(例如英语与法语混杂),则可利用SSML作出标记以纠正发音。

在本文中我无法直接提供相关语音片段,因此感兴趣的朋友可以直接访问Polly Consolehttps://console.aws.amazon.com/polly)并亲自加以尝试。大家只需要输入文本内容并点击Listen to speech(听取语音)即可:

大家也可以将生成的音频保存在MP3文件并将其运用于您的应用程序当中。

以下为完全展开的语言与地区菜单:

技术细节

通过Console使用Polly当然非常便利,不过大家也可以采取其它方式以实现更具动态的使用途径。大家可以在文本或者SSML当中调用SynthesizeSpeech API函数。大家可以直接将输出结果以流媒体形式直接交付至用户,或者生成MP3或Ogg文件以备需要时播放。Polly能够以MP3或者Vorbis格式生成高质量(最高采样率为22 kHz)音频,亦可以PCM格式生成电话质量级(8 kHz)音频。

大家也可以利用AWS命令行界面(CLI)生成音频。例如:

Polly会对全部闲置数据进行加密,并通过SSL连接进行音频传输。所提交文本与提交者间的关联将被移除,以加密形式存储最多6个月,并被用于维护及改进Polly功能。

价格与上线时间

大家每月可以利用Polly处理500万字而无需支付任何费用。在此之后,每个字的处理价格为0.000004美元,或者折合为音频生成约为每分钟0.004美元。本篇博文的语音转换价格约为0.018美元,而《哈克贝利-费恩历险记》全文的语音转换亦仅需约2.4美元。

Polly目前已经在美国东部(北弗吉尼亚州)、美国西部(俄勒冈州)、美国东部(俄亥俄州)以及欧洲(爱尔兰)服务区上线,大家可以从今天开始加以使用。

-Jeff

原文链接:

https://aws.amazon.com/cn/blogs/aws/polly-text-to-speech-in-47-voices-and-24-languages/

 

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

尽管能够“说话”的计算机确实令人振奋,但学会了倾听与回应的计算机无疑更加出色!如果大家曾经使用过Amazon Echo,一定体会过在Alexa服务支持下的交互模式是多么简单、实用和强大。

今天,我们利用与Amazon Alexa相同的深度学习技术(ASR,即自动语音识别;NLU,自然语言理解),为大家带来能够在您的对话应用程序内生效的新服务。大家可以利用Amazon Lex服务构建聊天机器人及其它类型的Web与移动应用程序,其将带来逼真的对话交互能力。您的聊天机器人能够提供信息、支持应用程序、简化工作行为,或者为其它机器人、无人机乃至玩具提供控制机制。

Amazon Lex的设计目标在于帮助大家快速实现上述目标。大家首先可在Lex Console中设计您的对话,即为Lex提供某些示例性短语以构建自然语言模型。在此之后,您即可公布自己的Amazon Lex机器人并利用其处理来自您用户的文本或者语音对话内容。Amazon Lex是一项全托管服务,因此大家无需为其配套基础设施的设置、管理或者规模伸缩而费心。

您的聊天机器人目前可接入Facebook Messenger; 面向Slack与Twilio的整合工作正在进行当中。在AWS方面,Amazon Lex可与AWS Lambda、AWS Mobile Hub以及Amazon CloudWatch进行协作。您也可在代码中使用Amazon DynamoDB、Amazon Cognito以及其它服务。

Amazon Lex允许大家利用AWS Lambda函数以实现聊天机器人的业务逻辑,其中包括接入您的企业应用及数据。配合刚刚公布的、适配于AWS Mobile Hub的SaaS集成能力,大家可以使用自己构建的企业生产力机器人为客户、联系人、领导层,以及存储于其它SaaS应用程序内的企业数据提供对话界面。

综合上述内容,大家现在能够利用全部相关组件来构建全面集成化解决方案。Amazon Lex可由移动应用为起点,并可逐步推进至逻辑实现层面。

Amazon Lex概念

下面我们将对Amazon Lex的各项基本概念加以阐述:

机器人 –  一个包含了所有对话组件的聊天机器人。

意图 –  意图代表使用这个机器人的用户所希望达成的目标(包括购买机票、安排预约或者获取天气预报信息等)。

话语 –  话语指的是以语音或者文本形式表达的短语。每个话语会调用一项意图。“我想预订酒店”或者“我想预订鲜花”就是两条简单的话语。

槽位 – 每个槽位代表着满足用户意图所对应的数据片段。槽位内容拥有具体类别; 差旅机器人一般使用的槽位包括城市、州或者机场。

提示 –  提示表现为问题,用于要求用户提供某些数据(以填充槽位)来表述其意图。

实现 –  实现代表的是能够达成用户意图的业务逻辑。Lex支持利用Lambda函数作为实现手段。

机器人、意图以及槽位具备版本控制机制,因此大家可以在多开发者环境当中,在诸如开发、测试、分段以及生产等流程间设定明确的边界。大家可以为机器人创建多种别称,并将其映射至各组件的特定版本当中。

构建一套机器人

大家可以通过Lex Console定义Lex机器人并为其设置全部组件。作为起步,大家可以首先使用我们提供的样例或者直接创建您理想中的定制化机器人:

您可在下一页面中定义您的话语及其配套槽位:

而后利用以下设置对机器人进行自定义:

您可以通过交互进行机器人测试并随时调整,直到其反应与预期相符:

此后,您可以生成一条回调URL以将其应用在Facebook(或者其它支持平台)当中:

在本届re: Invent大会结束后,我将拿出更多时间对这项服务的相关细节进行深入阐述。

价格与上线时间

Amazon Lex目前已经在美国东部(北弗吉尼亚州)服务区提供预览版本,大家可以马上开始利用其构建自己的对话应用!

在登录之后,您每月可以发出1万条文本请求与5千条语音请求,且首年之内无需支付任何费用。在此之后,每1千条语音请求收费4美元,而每1千条文本请求收费0.75美元。

-Jeff

原文链接:

https://aws.amazon.com/cn/blogs/aws/amazon-lex-build-conversational-voice-text-interfaces/

Amazon Rekognition – 深度学习支持下的图像检测与识别服务

看到这张图片时,你的大脑是如何理解它的呢?

你可能看到一只动物、一只宠物、一只狗或者更为具体——一只金毛犬。图像与这些标签之间的联系并非硬性嵌入您的大脑,而是在看过成百上千张这样的图片之后,你的大脑才能够直接给出正确的解读。通过多个不同层面的认知,我们学会了如何区分动物与植物,猫与狗,以及其它犬种与金毛犬间的差异。

深度学习之于图像检测

然而,事实证明:为计算机赋予和人类同等水平的理解能力是一项相当困难的任务。在数十年的研究过程中,计算机科学家们尝试利用各种方法来解决这一难题。时至今日,计算机科学领域已经达成广泛共识——即解决该问题的最佳途径为深度学习。深度学习利用特征抽象化与神经网络相结合的方法输出结果。这一方法甚至曾被伟大的科幻作家Arthur C. Clarke评论为“简直与魔法无异”。

然而,深度学习仍然需要投入相当高昂的成本。首先,大家需要耗费可观的精力与时间进行训练。从本质角度讲,这意味着我们需要为学习网络提供范围极广的已标记示例(“这是一只狗”、“这是一只宠物”等等),从而确保其能够将图像中的特征性内容与标签联系起来。这个阶段需要占用可观的计算资源,特别是考虑到神经网络自身的实际规模以及多层级属性。训练阶段完成之后,成熟的网络即可更为轻松地评估其它新型图像。其结果通过传统置信水平(0%至100%)表现,而非直接给出不容置疑的事实。如此一来,大家将能够决定自己的应用适合搭配怎样的精度。

Amazon Rekognition介绍

今天,我将向大家介绍Amazon Rekognition。我们的计算机视觉小组多年以来一直致力于开发深度学习方案,并以此为基础推出了这项完备的服务,其目前每天已经能够分析数十亿张图片。该服务利用成千上万对象及场景进行训练,因此现在可供大家的应用程序直接使用。如果大家对此抱有兴趣,那么不妨在着手深入研究并编写代码以利用Rekognition API之前,访问下面的网址:

https://console.aws.amazon.com/rekognition/home

查看我们提供的相关演示。

Rekognition在设计初期就充分考虑到了规模化使用需求,能够识别场景、物品以及面部图像。在获取图像之后,Rekognition能够返回一份标签列表。对于那些包含一张或者多张面孔的图像,它会为每张面孔返回范围框及其属性。下面让我们来看看其如何分析文章开头的这幅金毛犬图片(顺带一提,这只小美女名叫Luna):

如大家所见,Rekognition以高置信水平将Luna标记为一只动物、一只狗、一只宠物以及一只金毛犬。必须强调的是,这些标签相互独立,这意味着该深度学习模型并没有明确理解各标签之间的关系,例如狗与动物。其只是之前Rekognition训练时使用的素材恰好将这两个标签与以狗为中心的内容加以关联。

下面再来看Rekognition如何分析我和妻子两人的合照:

Amazon Rekognition找到了我们的面部位置,并用框体将其圈出,同时告知我妻子的表情非常幸福(这张照片拍摄于她生日当天,能让她感到幸福也是我发自内心的期许)。

大家也可以利用Rekognition比较不同面孔,并询问其是否在给定照片中找到了其它面孔。

这一切强大的处理能力皆可通过一组API函数进行访问,大家可以利用控制台(https://console.aws.amazon.com/rekognition/home)进行快速演示。举例来说,大家可以调用DetectLabels从而通过编程方式重现我给出的第一个示例,或者调用DetectFaces以重现我的第二个示例。大家可以对进行多次调用IndexFaces,从而帮助Rekognition作好识别面部信息的准备。每一次对IndexFaces进行调用,Rekognition都会从图片中提取出部分特性(被称为面部矢量),存储这些矢量并丢弃该图像。大家可以创建一套或者多套Rekognition收集库,并在每套库内存储多个相关面部矢量组。

Rekognition能够直接将处理图像保存在Amazon简单存储服务(简称S3)当中。事实上,大家亦可以利用AWS Lambda函数处理任意规模的新近上传图像。大家还可以利用AWS身份与访问管理(简称IAM)服务对指向Rekognition API的访问加以控制。

Rekognition的实际应用

那么,大家能够利用Rekognition做什么有趣的事?我个人倒是有很多想法。

如果大家已经拥有大量图像,则可利用Amazon Rekognition对其进行标记与索引。由于Rekognition属于一项服务,因此大家能够每天处理数百万张图像,而无需为底层基础设施的设置、运行以及规模伸缩费心。大家可以随时运用视觉搜索、标签浏览以及一切交互式发现模式。

大家也可以利用Rekognition配合多种不同验证及安全背景。大家可以对摄像头上显示的面孔与存档照片进行比较,从而判断是否允许对方进入安全区域。大家也可以执行视觉监控,即从照片中找出那些值得关注或者追踪的对象或者人物。

大家可以构建“智能化”营销公告牌,利用其收集观看人员的相关统计数据。

已经上线

Rekognition服务目前已经在美国东部(北弗吉尼亚州)、美国西部(俄勒冈州)以及欧洲(爱尔兰)服务区上线,大家从今天开始即可使用。作为AWS免费层的组成部分,大家每月可利用其分析最多5000张图像并存储最多1000个面部矢量,免费周期为一年。在此之后(或者您需要对处理容量进行扩展),大家需要以分层方式根据分析图像以及所存储面部矢量的具体数量付费。

还想了解更多信息?我们将于美国中央时区时间12月14日星期三的上午4:00到5:00召开网络研讨会,感兴趣的朋友可以访问:

https://publish.awswebcasts.com/content/connect/c1/7/en/events/event/private/23850344/41359021/event_registration.html?connect-session=graysonbreezdndrpkw7uwmhrgxc&sco-id=55023367&campaign-id=JB&_charset_=utf-8

进行注册。

中国区的AWS用户也不用着急,我们将会很快举办一场AWS re:Invent 2016的回顾活动,全面为大家介绍此次发布的新功能与新服务。敬请期待!

-Jeff

原文链接:

https://aws.amazon.com/cn/blogs/aws/amazon-rekognition-image-detection-and-recognition-powered-by-deep-learning/

 

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

前言

近几年来,深度学习得到了长足的发展,伴随着深度学习的发展,深度学习框架也变得越来越为人们所熟知。TensorFlow是谷歌开源的深度学习框架,自开源以来得到了业界的认可和支持,特别是在TensorFlow分布式版本发布以后,更多的深度学习专业人士开始使用TensorFlow进行分布式的深度学习研究。

深度学习框架底层需要硬件资源的支持,特别需要GPU实例的支持,而AWS云端弹性的GPU实例无疑是深度学习从业人员手中最灵活的资源。

本文将介绍在AWS上使用GPU实例安装配置分布式TensorFlow的过程,希望可以让读者快速搭建自己的深度学习环境,尽快深入到自己的生产应用中或者是研究领域中。

环境准备

首先我们需要为TensorFlow安装准备基础环境,其中包括AWS账号的创建,IAM用户的创建,VPC的划定等工作。有关这些具体工作的细节在本文就不详细讲述了,这些方面的细节请参考相关博文或者技术文档。

准备好账号之后就需要启动两台GPU实例进行设置,考虑到启动实例后需要进行一些软件部署,建议先启动一台GPU实例,安装设置好TensorFlow之后创建实例的AMI镜像,然后通过镜像启动第二台GPU实例,这样比较节省时间。

本文以Ubuntu作为基础环境,所以在启动实例的时候选择操作系统时选择Ubuntu镜像,本例选择的是。

进一步需要做的是选择实例类型,在AWS上的GPU实例有G2和P2两种大的类型。

P2使用了NVIDIA的K80 GPU,实例的具体配置如下:

G2使用了NVIDIA的K520 GPU,实例具体配置如下:


选择你希望使用的实例类型,然后按照EC2启动向导启动该实例。关于EC2启动的不同选项请参考相关文档,这里需要留意的是“置放组”选项,如果我们启动多个EC2实例运行TensorFlow并进行分布式计算,把这些实例放在一个“置放组”内会有效提高实例间的网络通讯效率。

实例启动后通过ssh工具连接到该实例上开始安装过程。

安装TensorFlow

准备好EC2实例后,通过ssh工具连接到实例上,开始以下安装工作。

因为TensorFlow安装需要较长时间,所以建议连接到EC2实例上以后通过screen命令或者tmux命令启动session管理,这样安装过程中出现ssh连接中断也可以继续完成安装工作。

首先需要安装相关的依赖包,具体命令如下:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y build-essential git python-pip libfreetype6-dev libxft-dev libncurses-dev libopenblas-dev gfortran python-matplotlib libblas-dev liblapack-dev libatlas-base-dev python-dev python-pydot linux-headers-generic linux-image-extra-virtual unzip python-numpy swig python-pandas python-sklearn unzip wget pkg-config zip g++ zlib1g-dev
sudo pip install -U pip

安装完依赖包以后接着安装CUDA包,本例中我是直接下载了CUDA 8.0的本地deb包进行安装,安装命令如下,读者在参考使用以下命令时注意修改对应的URL链接和版本号:

wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64-deb -O cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb
 
sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb
sudo apt-get update
sudo apt-get install cuda
CUDA安装比较简单,主要时间消耗在下载CUDA安装包上。安装了CUDA包以后,可以通过nvidia-smi命令查看本地的GPU设备情况,一方面检查GPU硬件情况,一方面也可以确认CUDA安装是否成功。

在我的G2.xlarge实例上安装CUDA并执行nvidia-smi命令后输出如下:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 367.57                 Driver Version: 367.57                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GRID K520           Off  | 0000:00:03.0     Off |                  N/A |
| N/A   33C    P0     1W / 125W |      0MiB /  4036MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
 
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
安装了CUDA后接着安装CuDNN,安装CuDNN需要到NVIDIA网站上注册,注册以后才能下载。这里略去注册过程,读者可以自行到以下网站注册:

https://developer.nvidia.com/rdp/cudnn-download

我下载的是cudnn-8.0-linux-x64-v5.1.tgz文件,下载后的安装命令如下:

tar -zxf ./cudnn-8.0-linux-x64-v5.1.tgz
 
sudo cp -R cuda/lib64/* /usr/local/cuda-8.0/lib64
 
sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/

然后我们需要设置一些环境变量,我将以下配置加入~/.bashrc文件中,并用source ~/.bashrc命令让配置生效。

export CUDA_HOME=/usr/local/cuda-8.0
export CUDA_ROOT=/usr/local/cuda-8.0
export PATH=$PATH:$CUDA_ROOT/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_ROOT/lib64

安装了NVIDIA的相关组件后我们还需要安装bazel,为了安装bazel,我们需要先安装java8,具体命令如下:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

安装java8会有图形化向导,按照向导指引安装就好了。

安装了java8以后执行以下命令安装bazel:

echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install bazel
sudo apt-get upgrade bazel

经过以上准备,相关的软件都安装配置好了,可以开始编译TensorFlow了。

首先把TensorFlow项目克隆到本地:

git clone --recurse-submodules https://github.com/tensorflow/tensorflow

接着进入tensorflow目录并运行configure命令为编译做准备,注意要加上sudo,否则会出现权限的问题。

cd tensorflow
 
sudo ./configure

执行./configure会出现文本配置界面,在选择不同选项时几乎可以都使用缺省值,当然在选择是否有GPU支持时要选择Y,然后就是要注意“Cuda compute capability”一项,如果你选择的实例类型是G2,这里需要输入3.0,因为G2实例使用的GPU是K520,只能支持Cuda compute capability 3.0。如果你选择的机型是P2,因为使用的GPU是K80,可以使用缺省的Cuda compute capability,本例使用的TensorFlow版本缺省的是3.5。

具体选项请参考以下截图:

如果你为G2实例类型选择了3.5或者更高版本,运行TensorFlow时会出现以下错误信息:

Ignoring visible gpu device (device: 0, name: GRID K520, pci bus id: 0000:00:03.0) with Cuda compute capability 3.0. The minimum required Cuda capability is 3.5.

配置好以后通过bazel命令编译,注意使用sudo命令:

sudo bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

编译需要一段时间,编译完成后使用buildpippackage命令为python构建pip包,以下命令中的/tmp/tensorflow_pkg目录是pip包输出的临时文件,可以根据你自己的环境进行调整:

sudo bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

构建了pip包以后使用pip命令进行安装,注意以下命令中的/tmp/tensorflow_pkg/tensorflow-0.11.0-cp27-cp27mu-linux_x86_64.whl是上一个命令生成的whl包文件路径,其中包括了具体的版本号,在你自己编译的时候需要留意这个版本号是否有变化:

sudo pip install /tmp/tensorflow_pkg/tensorflow-0.11.0-cp27-cp27mu-linux_x86_64.whl

以上命令执行完以后就成功安装了TensorFlow了,可以开始测试了。

测试与分布式部署

神经网络的测试经常使用mnist数据集进行,TensorFlow中自带了mnist的样例,安装好TensorFlow以后通过以下命令可以进行测试:

python tensorflow/tensorflow/models/image/mnist/convolutional.py

一切正常的话,很快convolutional.py命令就可以执行完成,结束后会输出准确率。

测试结束后,进一步需要做的事情就是分布式部署。如开篇讲到的,在AWS上可以使用镜像(AMI)简化新实例启动过程中的安装工作。

基本做法就是选中以上步骤配置的EC2实例,然后选择“”操作执行镜像创建的操作。当我们需要启动第二台GPU实例时,选择刚创建的镜像进行启动就好了。

启动第二台实例时注意选择第一台实例使用的子网,减少其它因素的干扰。如果对网络性能有特别要求,还可以将两台实例放在同一个“置放组”中,提高两台GPU实例之间的网络通讯速度。

另外,如下文所示,TensorFlow不同进程启动的时候会使用不同的端口,本例使用的是2222和2223端口。为了让两个GPU实例可以通过这些端口通讯,需要设置两个GPU实例所使用的安全组,开放2222,2223,2224的入站访问。

在tensorflow的源代码目录中有个分布式样例文件叫:./tensorflow/tools/dist_test/python/mnist_replica.py,是已经写好的分布式代码。

该python程序通过–pshosts指定参数服务的IP和端口,通过–workerhosts指定工作进程的IP地址和端口。

本例中使用的两台GPU实例的ip地址分布是172.31.24.117和172.31.30.43,我在172.31.24.117上运行参数服务器进程,命令如下:

python ./tensorflow/tools/dist_test/python/mnist_replica.py --ps_hosts=172.31.24.117:2222 --worker_hosts=172.31.24.117:2223,172.31.30.43:2223 --job_name=ps --task_index=0 

注意这里的参数–job_name=ps用于指定本进程的角色。

接着在172.31.24.117上起第一个worker进程,命令如下:

python ./tensorflow/tools/dist_test/python/mnist_replica.py --ps_hosts=172.31.24.117:2222 --worker_hosts=172.31.24.117:2223,172.31.30.43:2223 --job_name=worker --task_index=0 

这个命令和第一个启动参数服务器的命令几乎一样,差别就是–job_name=worker这个参数。

接着在172.31.30.43上启动第二个worker进程,命令如下

python ./tensorflow/tools/dist_test/python/mnist_replica.py –ps_hosts=172.31.24.117:2222 –worker_hosts=172.31.24.117:2223,172.31.30.43:2223 –job_name=worker –task_index=1
因为都是启动worker进程,所以两个启动worker进程的命令都是用的 –jobname=worker 参数,关键在于第一个worker进程使用taskindex=0 参数,而第二个worker进程使用task_index=1 参数。

执行以上命令后稍等片刻两个worker进程就会开始mnist数据集的训练,从日志输出上可以看出两个worker进程分别负责了部分样本的训练。

结语

以上就是AWS上编译安装TensorFlow并执行分布式训练的过程,完成以上环境搭建以后就可以开始你自己的分别式神经网络训练了。

作者介绍:

邓明轩

亚马逊AWS解决方案架构师,拥有15年IT 领域的工作经验,先后在IBM,RIM,Apple 等企业担任工程师、架构师等职位;目前就职于AWS,担任解决方案架构师一职。喜欢编程,喜欢各种编程语言,尤其喜欢Lisp。喜欢新技术,喜欢各种技术挑战,目前在集中精力学习分布式计算环境下的机器学习算法。

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

知识补充:

什么是AWS Lambda?

AWS Lambda在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量预置和自动扩展、代码监控和记录,只在需要时执行您的代码并自动缩放,从每天几个请求到每秒数千个请求,其提供了AWS基础设施的高可用性,高安全性,高功能性和高可扩展性。

具体可参考:

https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/welcome.html

什么是Alexa Skills Kit?

Alexa是Echo内置的语音助手,通过它能够唤醒Echo。Alexa的优点在于,它基于云端,因此我们可以随时对其进行改进。Alexa Skills Kit (ASK)是一个由自服务API、工具、文件和实例代码的集合,可轻松构建你自定义的Alexa skills,然后发布。

具体可参考:

https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit

1. 打开链接https://aws.amazon.com/,申请亚马逊AWS账号。登录控制台,选择AWS Lambda服务,创建Lambda Function。

2. 选择Alexa Skills Kit

3. 下载需要用到的代码,解压,打开index.js文件,修改文件中的开发者账号ID,如下:

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/RecipeTemplate.zip

修改完成之后,然后打成Zip包上传(注意,这里的打包不需要文件夹,直接把.js文件打包成RecipeTemplate.zip)

接着点击“Create function”

到这里,Lambda 创建成功。

4. 进入https://developer.amazon.com/,创建Alexa Skills Kit。

选择ALEXA

5. 选择“Alexa Skills Kit”

6. 点击“Add a new Skill”

7. 填写Name: Solution Helper,Invocation Name: solution helper

8. 填写Intent Schema,样例代码下载:

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/IntentSchema.json

9. 填写Sample Utterances,样例代码下载:

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/SampleUtterances.txt

10. 点击“Save”后会报错,这个时候点击“Add Slot Type”添加。样例代码下载

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/LIST_OF_ITEMS

11. 然后再点击“保存”,这个时候看到Successfully updated the interaction model

12. 此时,点击“Next”,选择Lambda的ARN地址,例如:

arn:aws:lambda:us-east-1:556776719183:function:LambdaAlexaSkillsKit

复制Lambda ARN地址

13. 点击“Next”,即将进入到Test阶段,如下图所示。

14. 然后在Enter Utterance中输入“How can I build a map”,点击“Ask Minecraft Helper”,能看到Lambda Response的结果。

15.(选做)如果是测试用的话这步可以不进行。

接下去会上传两张图片,这两张图片是特定尺寸的,而且是必须要上传的,你可以自定义。或者用两张我已经做好的图片:

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/AWS+Logo+108.png

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/AWS+Logo+512.png

16.(选做)如果是测试用的话这步可以不进行。

17. 使用Web版Alexa Skill Testing Tool进行测试 https://echosim.io/,注意,这里需要用之前的Amazon账号登录。用鼠标点击进行语音。

18. 当输入语音之后,打开Alexa的测试页面,点击Home,可以看到录音识别的效果。http://alexa.amazon.com/spa/index.html#cards

比如我语音输入:

Alexa, Ask solution helper how can build a map

Echo回答:

A map can be crafted by placing a compass in the middle square and eight pieces of paper surrounding it.


也可以进行自定义语音设置,比如我语音输入:

Alexa, Ask solution helper how can I get summit ticket

Echo回答:

Hello, if you want to attend beijing summit, please connect to aws china inside sales team.

19. 搞定,完成!

作者介绍:

毛郸榕

亚马逊AWS中国助理解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,毕业于北京航空航天大学云计算专业,硕士,毕业后直接加入亚马逊AWS中国。在大规模后台架构、企业混合IT和自动化运维等方面有着丰富的实践经验。目前在集中精力学习新一代无服务器架构设计。