bt365体育投注.主頁欢迎您!!

    <acronym id="zvmrr"></acronym>
    <td id="zvmrr"></td>
  • <tr id="zvmrr"><label id="zvmrr"></label></tr>
  • <acronym id="zvmrr"></acronym>
  • AWS_AI开发者社区

    AWS_AI开发者社区 查看完整档案

    北京编辑  |  填写毕业院校亚马逊通技术服务(北京)有限公司  |  AI 开发者 编辑 amazonaws-china.com/cn/ 编辑
    编辑

    AWS_AI 开发者社区是专注于人工智能领域,开发者交流与互动的平台。在这里,你可以分享和获取一切有关人工智能的相关技术和前沿知识,也可以与同行或爱好者们交流探讨,共同成长。
    进入 AWS 开发人员中心:https://amazonaws-china.com/c...,深入了解 AWS 并构建您的首个 Web 应用程序!

    个人动态

    AWS_AI开发者社区 发布了文章 · 1月22日

    案例分享:在生产中持续使用Amazon CodeGuru Profiler进行程序优化

    image

    本文由 Atlassian 高级软件工程师 Behrooz Nobakht、工程技术经理 Matthew Ponsford 以及高级软件工程师 Narayanaswamy Anandapadmanabhan 联手撰写。

    全球范围内,有成千上万的团队正在使用 Atlassian 公司的 Jira 云性能团队所开发的 Jira 及 Trello 等工具。该团队致力于为用户创造出色的产品、实践与开放的工作成果。Jira 云性能团队是一个专项工作组,致力于让 Jira 与 Atlassian 团队能够更好地了解、监控并增强自有产品及服务的性能表现。

    背景介绍

    Atlasian 目前构建的产品有数百名开发人员负责进行开发,这些产品包括单体应用程序和微服务程序。当出现突发事件时,由于代码库中的代码变更很频繁,这样很难对问题进行快速根因诊断。

    通过代码剖析可以显著加快根因诊断,代码剖析是识别应用程序中的运行时问题和延迟问题的有效技术。如果不采用代码剖析,通常需要自定义代码和临时延迟检测,这种方式容易出错而且会引起其他副作用。Atlassian 一直有工具用于剖析生产中的服务,例如使用 Linux perf)或async-profiler,虽然这些工具非常有价值,但他们的方法仍有一些限制:

    • 需要人员(或系统)的干预,才能在正确的时间捕获配置文件,这意味着经常错过一些暂时性问题
    • 临时剖析,无法提供要与之前比较的基线信息
    • 出于安全性和可靠性的考虑,在生产环境中运行这些工具的情况并不多

    这些限制促使 Atlassian 研究持续剖析(Continuous profiling)。除了帮助诊断服务花费的 CPU 周期(或时间)外,他们还希望找到一种分析解决方案,提供火焰图等可视化效果,这些可视化效果对于后续问题诊断有很大的帮助,比如可以更快地通过调用路径理解复杂动态应用程序的调用关系,还可以用于帮助开发人员了解系统。

    Atlassian 现有的内部剖析的解决方案由与服务一起部署的脚本构成,这些脚本可以使用 Linux perf 或 async-profiler 生成剖析报告。一部分有权限的开发人员(和SRE)可以使用 AWS System Manager 在生产节点上运行这些脚本。Atlassian 使用 Linux perf 和 async-profiler 具有以下几个优点:

    • 可以可视化为火焰图(易于解释)的格式数据
    • 分析单个进程或整个节点的能力
    • 跨不同维度(如 CPU、内存和I/O)进行分析

    Atlassian 最初的连续剖析解决方案包括定期运行 async-profiler(或Linux perf)的预定作业,将原始结果发送给一个微服务,该微服务用于将数据转换为列式数据(Parquet),然后将结果写入Amazon 简单存储服务 (Amazon S3)中。然后在AWS Glue中定义了一个架构(Schema),允许开发人员使用Amazon Athena查询特定服务的性能剖析数据。Athena使开发人员能够通过编写复杂的SQL查询的方式,筛选一定时间范围内和堆栈帧等维度上的性能剖析数据。Atlassian还构建了一个UI来运行Athena查询,并使用SpeedScope将结果可视化为火焰图。

    即使已经为这个解决方案付出了努力,但是仍有大量工作要做,以构建最佳解决方案。同时,Amazon CodeGuru Profiler的发布引起了Atlassian的注意。该服务产品与需求高度相关,并且在很大程度上与现有的能力重叠。经过深入的评估后,Atlassian最终决定停止构建自己的解决方案,转而集成CodeGuru Profiler。为此,他们选择为每个较小的服务定义一个分析组(profiling group)。对于较大的服务,将其被划分为多个分片(每个分片都有单独的自动缩放组),然后为每个分片创建一个分析组。

    大家可以通过两种可用模式集成Java Profiler:代理模式和代码模式。为了能够与现有的性能剖析功能集成,同时更好的控制代理,Atlassian决定使用代码模式,从应用程序代码中启动代理。这使他们能够通过现有的功能标志机制控制何时启动(或停止)代理。至此,Atlassian在平台级别集成了CodeGuru探查器,使任何Atlassian服务团队都能够轻松利用此功能。

    检查和延迟

    Atlassian使用CodeGuru Profiler的第一种场景是识别代码调用路径,这些代码调用路径可以直观的看到CPU利用率或延迟方面的问题。在采集的性能数据中查找不同的形式的同步调用,一个有趣的事情是由Collections.synchronizedMap构成的EnumMap类。以下截图显示此部分代码在24小时中的堆栈帧线程状态监控。

    image

    尽管所涉及的堆栈跟踪消耗的运行时间不到0.5%,但当进一步观察线程状态的延迟时,可以看到它在BLOCKED状态下花费的时间是RUNNABLE状态的两倍。为了增加在RUNABLE状态下花费的时间比例,我们从使用EnumMap转向使用ConcurrentHashMap的实例。提示:如果大量线程处于BLOCKED,说明CPU一直在等待一些资源的释放才能继续处理,这样造成了CPU的浪费,比如EnumMap由Collections.synchronizedMap构成,它是通过同步的方式实现的,这样会产生大量的锁从而引起线程的BLOCKED。这里我们将其替换为ConcurrentHashMap类来实现,ConcurrentHashMap是通过分段式锁来实现的,相较于Collections.synchronizedMap更高效。

    下面的截图显示了类似的24小时内的性能数据。实现更改后,相关的堆栈跟踪现在全部处于RUNABLE状态。

    image

    建议报告

    CodeGuru Profiler还为每个分析组提供了相关的建议报告,从性能角度识别常见的反模式(anti-patterns),并给出已知的建议解决方案。我们收到的一份这样的报告(见下面的截图)强调了我们如何使用JacksonObjectMapper。

    image

    收到此报告后,我们能够快速的识别问题,并对代码问题进行解决。

    结论

    通过与CodeGuru Profiler的集成,对我们来说是向前迈出的重要一步,使Atlassian内部的每个开发人员都具备了发现和处理应用性能问题的能力。自启用 CodeGuru Profuler以来,我们已获得以下收益:

    • 任何Atlasian开发人员都可以从任何时间点查找性能状况,从而快速的了解生产中进行的调用路径,以便分析和发现线上的问题。这有助于开发人员了解复杂的应用程序,并在调查性能问题时帮助我们。
    • 大大减少了诊断生产中性能问题的时间,同时我们的开发人员在诊断问题时不再需要注入自定义检测代码。
    • 整个组织中性能监测数据的开放,有助于提高开发人员自行处理性能优化的主动性。

    我们对CodeGuru Profiler团队构建的功能感到兴奋,并期待他们接下来将构建的探查技术和功能。

    image

    查看原文

    赞 1 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 1月21日

    案例分享 | 通过个性化在线体育内容提升用户参与度

    image

    本文为 Pulselive公司 Mark Wood 的客座文章。援引文中表述,“Pulselive公司来自英国,是体育界众多知名品牌的最佳数字合作伙伴。”

    背景介绍

    在Pulselive公司,我们为体育爱好者们带来的体验已经成为体育赛事中不可或缺的组成部分:从板球世界杯官方网站,到英超联赛专属 iOS 与 Android 应用。

    对我们来说,衡量客户体验的一大关键因素,在于粉丝群体在视频等数字内容层面的参与度。但就在不久之前,每一位粉丝所能看到的视频内容还仅仅只是对最新赛事的简单复制 —— 没有任何个性化元素可言。

    体育机构正在努力了解粉丝群体的身份定位,以及他们最希望看到怎样的内容。只有弄清这两个问题,才能真正从爱好者身上收集成规模的数字行为数据、理解他们的不同喜好并揣摩他们对体育内容进行互动的具体方式。随着可用数据的增加以及机器学习(ML)技术的发展,客户要求 Pulselive 提供更多量身定制的推荐内容。

    在本文中,我们将分享自身经验,聊聊如何将 Amazon Personalize 作为新型推荐引擎添加至平台当中,并借此将视频观看量提升达20%。

    采用 Amazon Personalize

    在开始之前,我们先来了解 Pulselive 面临的两大核心挑战:其一,我们没有任何数据科学家,因此需要一套成熟的解决方案,保证即使是对机器学习一无所知的工程师也能够理解其运作方式、并带来可以量化的成果产出。我们也考虑过使用外包企业提供协助,但成本过高只能作罢;与之相对,Amazon SageMaker 与 Amazon Personalize 等工具凭借着易于学习且成本低廉的优势吸引到我们的目光。

    我们最终选择了 Amazon Personalize,具体原因包括:

    1. 这项服务的技术与经济入门门槛都比较低。
    2. 我们可以快速进行 A/B 测试,借此证明推荐引擎的实际价值。
    3. 我们可以建立简单的概念验证(PoC)项目,保证将对现有站点的影响降至最低水平。
    4. 我们其实对 Amazon Peronalize 的底层实现原理并不关注,真正重要的是它能带来怎样的影响、特别是改善效果。

    与其他新业务一样,我们首先需要保证的是新方案的引入不致对原有日常运营产生不利影响。同时,我们还需要确保新的解决方案对于当前业务环境切实有效。为此,我们决定在概念验证阶段中进行A/B测试,借此建立一轮能够在几天内启动并顺利执行的前期试验。

    通过与 Amazon Prototyping 团队开展合作,我们将首轮集成的范围缩小到几乎无需对网站进行更改,且易于进行A/B测试的程度。在全面筛查了用户观看视频的各具体位置之后,我们认为对视频列表进行重组排列,应该是实现内容个性化的最快方法。对于这套原型方案,我们使用 AWS Lambda 函数,并由 Amazon API Gateway 提供新的 API。此 API 负责捕获相关视频推荐,并使用 Amazon Personalize GetPersonalizedRanking API 对其进行重新排序。

    为了证明调整是否成功,我们要求此轮试验必须在视频总观看次数或者视频观看完成率等方面具有统计学意义上的显著改善。为了达成这个目标,我们需要设定足够长的测试周期,以保证验证流程能够同时涵盖大赛日以及暂无赛事活动的常规日期。我们希望测试不同的使用模式,借此消除近期赛事活动对概念验证结果造成的重大影响。我们最终决定将试验周期设定为两周,在此期间收集初始数据。所有用户都将被纳入实验范围,且以随机方式被分配至对照组或者测试组当中。为了尽可能降低试验难度,我们还将所有站内视频都划入测试范围。下图所示,为这套解决方案的基本架构。

    image

    在起步阶段,我们首先构建了一套Amazon Personalize解决方案作为本次试验的起点。要实际定义解决方案并生成面向用户的视频推荐列表,Amazon Personalize要求我们提供一套用户 - 视频交互数据集。我们为此创建了一个CSV文件,其中包含几个星期之内各视频视图的时间戳、用户ID以及视频ID等元数据。在将交互历史记录轻松上传至Amazon Personalize之后,我们即可在AWS管理控制台上测试推荐结果。为了完成模型训练,我们使用的数据集内包含30000条近期用户交互记录。

    为了比较视频的总体观看次数与视频完成度百分比指标,我们还构建了另一个 API,用于记录 Amazon DynamoDB 中的所有视频交互活动。这个API负责通过 PutEvents API 向 Amazon Personalize 告知新的交互操作,借此帮助 ML 模型始终保持更新。

    我们还跟踪了视频的总观看次数,以及在试验阶段向用户展示的推荐视频视图。这部分视频展示包括直接链接(例如社交媒体)、网站内链接以及视频列表提供的链接。每当有用户观看视频页面时,系统都会向其展示原有视频列表或者经过 Amazon Personalize 重新排序的新列表 —— 具体取决于用户归属于对照组还是测试组。我们首先将总用户中的5%纳入测试组,并在确认新方案不会产生意外问题时(即视频观看量未出现明显下降,API 错误也没有增加),将测试比例逐步提升至50%—— 其余用户作为对照组 —— 并开始收集数据。

    从试验中汲取经验

    经过为期两周的 A/B 测试,我们提取了由 DynamoDB 收集的 KPI,并比较了这两种解决方案在多个项目上的 KPI 结果。由于只是初始试验,因此初步 KPI 的选择较为简单,大家在实际应用中可能会选择不同的 KPI。

    我们的第一项 KPI 为每项会话中每位用户的视频观看次数。我们的初步假设是,由于只是对推荐视频列表进行重新排序,因此不大可能出现显著的观看次数影响;但通过统计,我们发现每位用户的平均观看次数增加了20%。下图所示,为各组用户的视频观看次数。

    image

    除了总观看次数之外,我们还希望保证用户能够从头到尾看完视频内容。为此,我们将视频内容划分为四段,每隔25%发送一项事件以进行观看跟踪。在这方面,我们发现无论是使用 Amazon Personalize 提供的新列表,还是原始推荐视频列表,平均完成率都没有出现太大变化。结合视频的总观看次数,我们得出结论,在向每位用户展示个性化推荐视频列表时,其总观看时长确实有所增加。

    我们还跟踪了各视频在用户「推荐视频」列表中的具体位置,以及用户实际选择了哪段推荐视频。以此为基础,我们得以比较个性化列表与原有固定排序的推荐效果,并发现二者之间并没有太大的区别。这表明我们的用户更倾向于直接选择当前屏幕中显示的推荐视频,而非向下滚动以查看完整的推荐列表。

    在对结果进行分析之后,我们向客户展示了分析结论,并建议启用 Amazon Personalize 以作为后续推荐视频的默认排序方法。

    经验与教训

    在整个试验过程中,我们总结出以下经验教训供大家参考:

    1. 请认真为用户 - 视频交互收集历史数据;我们在训练中使用了约30000条交互记录。
    2. 关注近期历史数据。虽然视频网站一般不缺乏历史数据,但使用的交互数据越新,训练效果往往越好。如果您的历史交互数据集极为庞大,不妨过滤掉其中较为陈旧的部分,借此降低数据集体积以缩短训练时长。
    3. 确保使用单点登录解决方案或者生成会话 ID,为用户提供统一且唯一的 ID。
    4. 在您的站点或应用程序中找到理想位置,以此为基础运行 A/B 测试,或者对现有列表进行重新排序/直接显示原有推荐条目列表。
    5. 更新 API 以调用 Amazon Personalize,并获取新的推荐条目列表。
    6. 部署 A/B 测试,并逐渐增加实验组部分的用户百分比。
    7. 进行跟踪与量化,保证准确了解实验结果。

    总结与后续计划

    Amazon Personalize 为我们开启了新世界的大门,我们也对首次迈入 ML 领域感到无比激动。我们发现,将经过训练的模型纳入我们的工作流程其实非常简单易行。与使用 Amazon Personalize 相比,更耗费时间的反而是选择正确的 KPI 并捕捉必要数据,借此证明本轮试验的实际有效性。

    着眼于未来,我们还将开发出以下增强功能:

    1. 将 Amazon Personalize 更深入地整合至完整工作流当中,包括在一切涉及推荐列表的部分使用 Amazon Personalize。
    2. 在重新排序之外扩展更多其他用例,包括由 Amazon Personalize 生成全新推荐内容,借此帮助用户发掘他们可能感兴趣的旧有内容。
    3. 调整模型的重新训练频率 —— 向模型当中实时插入新的交互记录,是保持其始终紧跟最新趋势的好办法。事实上,将重新训练设定为模型的日常运营组成部分,将极大提升其运行效果。
    4. 探索如何与全体客户一道使用 Amazon Personalize,包括以各种方式推荐相关度最高的内容,借此提升体育爱好者们的参与度。
    5. 使用推荐过滤器扩展每项请求中的可用参数范围。我们还将尽快定位其他选项,例如通过筛选为您提供专属于特定选手的精彩视频。

    image

    查看原文

    赞 0 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 1月18日

    怎样从文档中提取自定义实体

    image

    一张纸质文档上的文字内容如何提取出来?拍照,对照片使用光学字符识别(OCR)软件进行识别,很容易就可以搞定。

    然而,同样一张纸质文档上的文字,如何让计算机程序理解其中所包含的内容?单凭OCR就不行了,这时候需要用到自然语言处理和实体提取技术。

    Amazon Textract是一项机器学习(ML)服务,能够轻松从各类文档扫描件中提取文本与数据。Textract超越了简单的OCR来识别表单中的字段内容和表中存储的信息。基于此,大家可以使用Amazon Textract即时「读取」几乎任何类型的文档,并在无需任何人工或代码编写的前提下准确提取其中的文本与数据。

    Amazon Textract在各个领域中拥有诸多实际应用。例如,人才管理企业可以使用Amazon Textract对候选人的技能集进行自动化提取,医疗保健组织则可从文档中快速提取患者信息以满足医疗需求等。

    在组织处理各类文档时,往往要求我们从文档中的非结构化文本处提取实体。例如,合同文档中可能包含大量文本段落,其中的名词与合同条款以自然语言形式直接列出,而非如表格数据般具有清晰的键/值或表单结构。Amazon Comprehend是一项自然语言处理(NLP)服务,能够从非结构化文本当中提取关键性短语、地点、名称、组织、事件以及情感等。使用自定义实体识别,大家可以将并未预先受到支持的新实体类型划归至预设的通用实体类型当中,借此根据特定业务提取实体以满足实际需求。

    在本文中,我们将展示如何使用Amazon Textract与Amazon Comprehend从文档扫描件中提取自定义实体。

    用例概述

    在本文中,我们将对Resume Entities for NER数据集中的简历文档进行处理,提取其中的实体,并尝试以自动化方式实现整个流程以获得多种洞察见解,例如候选人掌握的具体技能等。我们使用Amazon Textract从这些简历中提取文本,并使用Amazon Comprehend自定义实体功能,将AWS、C以及C++等技能识别为自定义实体。以下截屏所示,为示例输入文档。

    image

    以下截屏所示,为使用Amazon Textract与Amazon Comprehend生成的相应输出。

    image

    解决方案概述

    下图所示,为一套无服务架构解决方案。该架构能够处理传入文档,使用Amazon Textract进行自定义实体提取,并使用Amazon Comprehend对自定义模型进行训练。在将文档上传至Amazon Simple Storage Service (Amazon S3) 存储桶时,即会触发对应的AWS Lambda函数。该函数将调用Amazon Textract DetectDocumentText API以提取文本,并使用提取到的文本内容调用以进一步检测其中的自定义实体。

    image

    整个解决方案分为两个部分:

    • 训练:
    • 使用Amazon Textract从PDF文档中提取文本
    • 使用Amazon SageMaker Ground Truth标记结果数据
    • 使用Amazon Comprehend配合标记数据进行自定义实体识别训练
    • 推理:
    • 向Amazon Textract发送文档以进行数据提取
    • 将提取到的数据发送至Amazon Comprehend自定义模型以进行实体提取

    启动AWS CloudFormation堆栈

    在本文中,我们将使用AWS CloudFormation堆栈部署解决方案,并创建方案中所需要的各项资源,具体包括S3存储桶、Amazon SageMaker实例以及必要的AWS身份与访问管理(AWS Identity and Access Management,简称IAM)角色。关于各栈的更多详细信息,请参阅演练:堆栈更新

    或者也可以直接选择Launch Stack以启动该栈。

    • 在Create Stack页面上,选择Upload a template file并上传我们之前下载完成的CloudFormation模板。
    • 选择Next。
    • 在下一页面中,为该堆栈输入名称。

    image

    • 其他各项皆保留默认设置。
    • 在Review页面中,选择I acknowledge that AWS CloudFormation might create IAM resources with custom names(我已知悉AWS CloudFormation可能使用自定义名称创建IAM资源)。
    • 选择Create stack。

    image

    • 等待该堆栈完成运行。

    大家可以在Events选项卡的堆栈创建流程部分,检查各类事件。堆栈创建完成之后,请查看Resources选项卡以查看AWS CloudFormation模板创建的所有资源。

    • 在CloudFormation栈的Outputs选项卡部分,记录Amazon SageMaker实例URL。

    image

    在Jupyter notebook上运行工作流

    要运行工作流,请完成以下操作步骤:

    • 打开在上一步中保存的Amazon SageMaker实例URL。
    • 在New下拉菜单中,选择Terminal。
    • 在终端内,克隆GitHub cd Sagemaker; git clone URL。

    到这里,将看到如以下截屏所示的文件夹结构。

    image

    • 打开Textract_Comprehend_Custom_Entity_Recognition.ipynb。
    • 运行各Notebook单元。

    代码演练

    将所有文档上传至S3存储桶。

    image

    现在各PDF已经准备就绪,可供Amazon Textract执行OCR处理。通过StartDocumentTextDetection异步API调用启动处理流程。

    image

    在本文中,我们受篇幅所限,仅展示两份PDF格式的简历。如果需要,可以使用全部220份简历。我们已经将所有简历处理完成,供您直接参考。

    要使用Amazon Comprehend训练自定义实体识别模型,那么与任何模型训练工作一样,训练数据都是必不可少的前提条件。在本文中,我们使用Ground Truth标记我们的实体。在默认情况下,Amazon Comprehend能够识别诸如人员、职务以及组织之类的实体。关于更多详细信息,请参阅检测实体。为了展示自定义实体识别功能,我们将重点关注简历中的候选人技能实体。Ground Truth已经提供充足的标记数据,大家可以通过GitHub repo直接获取这部分数据(详见enity_list.csv文件)。关于标记数据的操作说明,请参阅使用Amazon SageMaker Ground Truth与Amazon Comprehend开发NER模型

    现在,我们已经掌握了原始数据与标记数据,可以开始训练模型了。要启动此流程,可使用create_entity_recognizer API 调用。提交训练作业之后,可以在Amazon Comprehend控制台上看到正在训练的识别器。

    image

    在训练过程中,Amazon Comperhend会保留一部分数据作为测试素材。在识别器训练完成之后,大家还可以查看各实体的识别性能以及识别器自身的整体性能水平。

    image

    我们准备了部分文本样本,用于测试刚刚训练完成的自定义实体识别器。我们通过相同的步骤执行OCR,而后将Amazon Textract输出上传至Amazon S3,并启动自定义识别器作业。

    image

    在提交作业后,可以在Amazon Comprehend控制台的Analysis Jobs之下查看分析进度。

    image

    分析作业完成后,可以下载输出并查看结果。在本文的示例中,我们将JSON结果转换为表格形式以提高可读性。

    image
    总结

    机器学习与人工智能能够极大提升组织的敏捷水平,将原本只能手动完成的任务转为自动化流程,借此增强执行效率。在本文中,我们演示了一套端到端架构,可通过Amazon Textract与Amazon Comprehend提取候选人技能等自定义实体。本文还将大家讲解了如何使用Amazon Textract进行数据提取,以及如何使用Amazon Comprehend通过自有数据集训练自定义实体识别器,并借此实现自定义实体识别。这一流程可以广泛应用于各个行业,例如医疗保健与金融服务等。

    要了解关于Amazon Textract提供的各项文本与数据提取功能的更多详细信息,请参阅Amazon Textract工作原理解读

    image

    查看原文

    赞 0 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 1月15日

    如何为基于NLP的实体识别模型设置人工审查?

    image

    目前,各个行业的组织都有大量非结构化数据,供决策团队通过评估获得基于实体的洞察见解。此外,大家可能还希望添加自己的专有业务实体类型,例如专有零件编号或行业特定术语等。然而为了创建基于自然语言处理(NLP)的模型,我们首先需要根据这些特定实体进行数据标记。

    Amazon SageMaker Ground Truth能够帮助大家轻松构建起用于机器学习(ML)的高精度训练数据集,Amazon Comprehend则为模型训练作业快速选择正确的算法与参数。最后,Amazon Augmented AI(Amazon A2I)使我们能够审计、核对并扩充得出的预测结果。

    本文将介绍如何使用Ground Truth命名实体识别(Named entity recognition,简称NER)进行特征标记,借此为自定义实体构建起标记数据集;并将介绍如何使用Amazon Comprehend训练一套自定义实体识别器,以及如何使用Amazon A2I提供的人工审核机制对置信度低于特定阈值的Amazon Comprehend预测进行复核。

    我们将使用一套示例Amazon SageMaker Jupyter notebook,在演练中完成以下步骤:

    1. 预处理输入文件。
    2. 创建一项Ground Truth NER标记作业。
    3. 训练Amazon Comprehend自定义实体识别器模型。
    4. 使用Amazon A2I设置人工审核循环,借此检测低置信度预测结果。

    先决条件

    在开始之前,请通过以下步骤设置Jupyter notebook:

    确保Amazon SageMaker notebook拥有Notebook中先决条件部分所提及的必要AWS身份与访问管理(AWS Identity and Access Management,简称IAM)角色及权限。

    • 在Notebook处于活动状态时,选择Open Jupyter。
    • 在Jupyter仪表上选择New, 而后选择Terminal。
    • 在终端内,输入以下代码:
    cd SageMaker
    git clone “https://github.com/aws-samples/augmentedai-comprehendner-groundtruth”
    • 在augmentedai-comprehendner-groundtruth文件夹中选择SageMakerGT-ComprehendNER-A2I-Notebook.ipynb以打开该Notebook。

    现在,我们可以在Notebook单元中执行以下操作步骤。

    预处理输入文件

    在本用例中,大家正在查看聊天消息或几份提交的工单,希望弄清它们是否与AWS产品有关。我们使用Ground Truth中的NER 标记功能,将输入消息中的SERVICE或VERSION实体标记出来。之后,我们训练Amazon Comprehend自定义实体识别器,借此从推特或工单注释等文本当中识别出对应实体。

    样本数据集可通过GitHub repo中的data/rawinput/aws-service-offerings.txt处获取。以下截屏所示,为本次演练中使用的数据集示例。

    image

    通过对文件进行预处理,我们将生成以下文件:

    • inputs.csv – 使用此文件为Ground Truth NER标记生成输入manifest文件。
    • Train.csv与test.csv – 使用这些文件作为自定义实体训练的输入。我们可以在Amazon Simple Storage Service (Amazon S3) 存储桶中找到这些文件。

    关于数据集生成方法,请参阅Notebook中的步骤1a与1b部分。

    创建一项Ground Truth NER标记作业

    我们的目标是对输入文件中的句子进行注释与标记,将其归类于我们的各自定义实体。在本节中,大家需要完成以下步骤:

    • 创建Ground Truth所需要的manifest文件。
    • 设置标记工作人员。
    • 创建标记作业。
    • 启动标记作业并验证其输出结果。

    创建一个manifest文件

    我们使用在预处理过程中生成的inputs.csv文件创建NER标记特征所需要的manifest文件。我们将生成的manifest文件命名为prefix+-text-input.manifest,用于在创建Ground Truth作业时进行数据标记。详见以下代码:

    # Create and upload the input manifest by appending a source tag to each of the lines in the input text file.
    # Ground Truth uses the manifest file to determine labeling tasks
    manifest_name = prefix + '-text-input.manifest'
    # remove existing file with the same name to avoid duplicate entries
    !rm *.manifest
    s3bucket = s3res.Bucket(BUCKET)
    with open(manifest_name, 'w') as f:
     for fn in s3bucket.objects.filter(Prefix=prefix +'/input/'):
     fn_obj = s3res.Object(BUCKET, fn.key)
     for line in fn_obj.get()['Body'].read().splitlines(): 
     f.write('{"source":"' + line.decode('utf-8') +'"}n')
    f.close()
    s3.upload_file(manifest_name, BUCKET, prefix + "/manifest/" + manifest_name)

    NER标记作业需要将输入manifest位于{"source": "embedded text"}中。下列截图展示了从input.csv生成的input.manifest文件内容。

    image

    创建专有标记工作人员

    在Ground Truth中,我们使用专有工作人员创建一套经过标记的数据集。

    大家可以在Amazon SageMaker控制台上创建专有工作人员。关于具体操作说明,请参阅使用Amazon SageMaker Ground Truth与Amazon Comprehend开发NER模型中的创建专有工作团队部分。

    或者也可以按照Notebook中的指导分步操作。

    在本演练中,我们使用同一专有工作人员在自定义实体训练完成之后,使用Amazon A2I标记并扩充低置信度数据。

    创建一项标记作业

    下一步是创建NER标记作业。本文将重新介绍其中的关键步骤。关于更多详细信息,请参阅使用Amazon SageMaker Ground Truth添加数据标记工作流以实现命名实体识别

    • 在Amazon SageMaker控制台的Ground Truth之下,选择Labeling jobs
    • 选择Create labeling job。
    • 在Job name部分,输入一个作业名称。
    • 在Input dataset location部分,输入之前创建的输入manifest文件所对应的Amazon S3存储位置(s3://_bucket_//_path-to-your-manifest.json_)。
    • 在Output Dataset Location部分,输入带有输出前缀的S3存储桶(例如s3://_bucket-name_/output)。
    • 在IAM role部分,选择Create a new Role。
    • 选择Any S3 Bucket。
    • 选择Create。
    • 在Task category部分,选择Text。
    • 选择Named entity recognition。

    image

    • 选择Next。
    • 在Worker type部分,选择Private。
    • 在Private Teams当中,选择所创建的团队。
    • 在Named Entity Recognition Labeling Tool部分的Enter a brief description of the task位置,输入:Highlight the word or group of words and select the corresponding most appropriate label from the right。
    • 在Instructions对话框中,输入:Your labeling will be used to train an ML model for predictions. Please think carefully on the most appropriate label for the word selection. Remember to label at least 200 annotations per label type。
    • 选择Bold Italics。
    • 在Labels部分,输入希望向工作人员展示的标签名称。
    • 选择Create。

    启动标记作业

    工作人员(或者是由我们亲自担任工作人员)将收到一封包含登录说明的电子邮件。

    • 选择the URL provided and enter your user name and password.

    随后将被定向至标记任务UI。

    • 通过为词组选择标签以完成标记任务。
    • 选择Submit。

    image

    • 在对所有条目进行过标记之后,UI将自动退出。
    • 要检查作业状态,请在Amazon SageMaker控制台的Ground Truth之下,选择Labeling jobs。
    • 等待,直至作业状态显示为Complete。

    image

    验证注释输出

    验证注释输出,请打开S3存储桶并前往_<S3 Bucket Name>/output/<labeling-job-name>_/manifests/output/output.manifest。我们可以在这里查看Ground Truth创建的manifest文件。以下截屏所示,为本次演练中的示例条目。

    image

    训练一套自定义实体模型

    现在,我们可以使用经过注释的数据集或者之前创建的output.manifest Ground Truth训练一套自定义实体识别器了。本节将引导大家完成Notebook中提及的具体步骤。

    处理经过注释的数据集

    大家可以通过实体列表或者注释,为Amazon Comprehend自定义实体提供标签。在本文中,我们将使用Ground Truth标记作业生成注释内容。大家需要将经过注释的output.manifest文件转换为以下CSV格式:

    File, Line, Begin Offset, End Offset, Typedocuments.txt, 0, 0, 11, VERSION

    运行Notebook中的以下代码以生成此annotations.csv文件:

    # Read the output manifest json and convert into a csv format as expected by Amazon Comprehend Custom Entity Recognizer
    import json
    import csv
    # this will be the file that will be written by the format conversion code block below
    csvout = 'annotations.csv'
    with open(csvout, 'w', encoding="utf-8") as nf:
     csv_writer = csv.writer(nf)
     csv_writer.writerow(["File", "Line", "Begin Offset", "End Offset", "Type"])
     with open("data/groundtruth/output.manifest", "r") as fr:
     for num, line in enumerate(fr.readlines()):
     lj = json.loads(line)
     #print(str(lj))
     if lj and labeling_job_name in lj:
     for ent in lj[labeling_job_name]['annotations']['entities']:
     csv_writer.writerow([fntrain,num,ent['startOffset'],ent['endOffset'],ent['label'].upper()])
     fr.close()
    nf.close() 
    s3_annot_key = "output/" + labeling_job_name + "/comprehend/" + csvout
    upload_to_s3(s3_annot_key, csvout)

    下图所示,为该文件的具体内容。

    image

    设置一套自定义实体识别器

    本文在示例中使用API,但大家可以选择在Amazon Comprehend控制台上创建识别与批量分析作业。关于具体操作说明,请参阅使用Amazon Comprehend构建自定义实体识别器

    • 输入以下代码。在s3_train_channel当中使用我们在预处理阶段生成的train.csv文件,借此进行识别器训练。在s3_annot_channel当中,使用annotations.csv作为标签以训练您的自定义实体识别器。
    custom_entity_request = {
     "Documents": {
     "S3Uri": s3_train_channel
     },
     "Annotations": {
     "S3Uri": s3_annot_channel
     },
     "EntityTypes": [
     {
     "Type": "SERVICE"
     },
     {
     "Type": "VERSION"
     }
     ]
    }
    • 使用CreateEntityRecognizer创建实体识别器。该实体识别器使用最低数量训练样本进行训练,借此生成Amazon A2I工作流中需要的部分低置信度预测结果。详见以下代码:
    import datetime
    id = str(datetime.datetime.now().strftime("%s"))
    create_custom_entity_response = comprehend.create_entity_recognizer(
     RecognizerName = prefix + "-CER",
     DataAccessRoleArn = role,
     InputDataConfig = custom_entity_request,
     LanguageCode = "en"
    )
    

    在实体识别器作业完成之后,我们将获得一款附带性能分数的识别器。如前所述,我们使用最低数量的训练样本进行识别器训练,借此生成Amazon A2I工作流中需要的部分低置信度预测结果。我们可以在Amazon Comprehend控制台上找到这些指标,具体参见以下截屏。

    image

    • 创建一项批量实体检测分析作业,用以检测大量文件中的相应实体。

    使用Amazon Comprehend StartEntitiesDetectionJob操作以检测文件中的自定义实体。关于使用自定义实体识别器创建实时分析端点的具体操作说明,请参阅启动Amazon Comprehend自定义实体识别实时端点以执行注释任务

    要使用EntityRecognizerArn进行自定义实体识别,我们需要为识别器提供访问权限以进行自定义实体检测。执行CreateEntityRecognizer操作即可通过响应结果获得此ARN。

    • 运行自定义实体检测作业,通过Notebook运行以下单元,对预处理步骤当中创建的测试数据集做出预测:
    s3_test_channel = 's3://{}/{}'.format(BUCKET, s3_test_key) s3_output_test_data = 's3://{}/{}'.format(BUCKET, "output/testresults/")
    test_response = comprehend.start_entities_detection_job( InputDataConfig={
    'S3Uri': s3_test_channel,
    'InputFormat': 'ONE_DOC_PER_LINE'
    },
    OutputDataConfig={'S3Uri': s3_output_test_data
    },
    DataAccessRoleArn=role,
    JobName='a2i-comprehend-gt-blog',
    EntityRecognizerArn=jobArn,
    LanguageCode='en')

    以下截屏所示,为本次演练中得出的测试结果。

    image

    建立人工审核循环

    在本节中,我们将为Amazon A2I中的低置信度检测建立起人工审核循环,具体包括以下步骤:

    • 选择工作人员。
    • 创建人工任务UI。
    • 创建一项工作人员任务模板创建器函数。
    • 创建流定义。
    • 检查人员循环状态,并等待审核人员完成任务。

    选择工作人员

    在本文中,我们使用由为Ground Truth标记作业创建的专有工作人员。使用工作人员ARN为Amazon A2I设置工作人员。

    创建人工任务UI

    使用liquid HTML中的UI模板创建人工任务UI资源。每当需要人工循环时,皆需要使用这套模板。

    以下示例代码已通过测试,能够与Amazon Comprehend实体检测相兼容:

    template = """
    <script data-original="https://assets.crowd.aws/crowd-html-elements.js"></script>
    <style>
     .highlight {
     background-color: yellow;
     }
    </style>
    <crowd-entity-annotation
     name="crowd-entity-annotation"
     header="Highlight parts of the text below"
     labels="[{'label': 'service', 'fullDisplayName': 'Service'}, {'label': 'version', 'fullDisplayName': 'Version'}]"
     text="{{ task.input.originalText }}"
    > 
     <full-instructions header="Named entity recognition instructions">
     <ol>
     <li><strong>Read</strong> the text carefully.</li>
     <li><strong>Highlight</strong> words, phrases, or sections of the text.</li>
     <li><strong>Choose</strong> the label that best matches what you have highlighted.</li>
     <li>To <strong>change</strong> a label, choose highlighted text and select a new label.</li>
     <li>To <strong>remove</strong> a label from highlighted text, choose the X next to the abbreviated label name on the highlighted text.</li>
     <li>You can select all of a previously highlighted text, but not a portion of it.</li>
     </ol>
     </full-instructions>
     <short-instructions>
     Select the word or words in the displayed text corresponding to the entity, label it and click submit
     </short-instructions>
     <div id="recognizedEntities" style="margin-top: 20px">
     <h3>Label the Entity below in the text above</h3>
     <p>{{ task.input.entities }}</p>
     </div>
    </crowd-entity-annotation>
    <script>
     function highlight(text) {
     var inputText = document.getElementById("inputText");
     var innerHTML = inputText.innerHTML;
     var index = innerHTML.indexOf(text);
     if (index >= 0) {
     innerHTML = innerHTML.substring(0,index) + "<span class='highlight'>" + innerHTML.substring(index,index+text.length) + "</span>" + innerHTML.substring(index + text.length);
     inputText.innerHTML = innerHTML;
     }
     }
     document.addEventListener('all-crowd-elements-ready', () => {
     document
     .querySelector('crowd-entity-annotation')
     .shadowRoot
     .querySelector('crowd-form')
     .form
     .appendChild(recognizedEntities);
    
     });
    </script>
    
    """

    创建一项工作人员任务模板创建器函数

    此函数属于对Amazon SageMaker软件包方法的高级抽象,用于创建人工审核工作流。详见以下代码:

    def create_task_ui():
     '''
     Creates a Human Task UI resource.
     Returns:
     struct: HumanTaskUiArn
    '''
     response = sagemaker.create_human_task_ui(
     HumanTaskUiName=taskUIName,
     UiTemplate={'Content': template})
     return response
    # Task UI name - this value is unique per account and region. You can also provide your own value here.
    taskUIName = prefix + '-ui'
    # Create task UI
    humanTaskUiResponse = create_task_ui()
    humanTaskUiArn = humanTaskUiResponse['HumanTaskUiArn']
    print(humanTaskUiArn)
    

    创建流定义

    我们可以在流定义中指定以下内容:

    • 作为任务接收方的工作人员
    • 工作人员收到的标记指示

    本文使用API,但也可以选择在Amazon A2I控制台上创建这项工作流定义。

    关于更多详细信息,请参阅如何创建流定义

    要设置触发人工循环审核的条件,请输入以下代码(可以设置CONFIDENCE_SCORE_THRESHOLD阈值,借此调整触发人工审核的具体置信度):

    human_loops_started = []
    import json
    CONFIDENCE_SCORE_THRESHOLD = 90
    for line in data:
     print("Line is: " + str(line))
     begin_offset=line['BEGIN_OFFSET']
     end_offset=line['END_OFFSET']
     if(line['CONFIDENCE_SCORE'] < CONFIDENCE_SCORE_THRESHOLD):
     humanLoopName = str(uuid.uuid4())
     human_loop_input = {}
     human_loop_input['labels'] = line['ENTITY']
     human_loop_input['entities']= line['ENTITY']
     human_loop_input['originalText'] = line['ORIGINAL_TEXT']
     start_loop_response = a2i_runtime_client.start_human_loop(
     HumanLoopName=humanLoopName,
     FlowDefinitionArn=flowDefinitionArn,
     HumanLoopInput={
     "InputContent": json.dumps(human_loop_input)
     }
     )
     print(human_loop_input)
     human_loops_started.append(humanLoopName)
     print(f'Score is less than the threshold of {CONFIDENCE_SCORE_THRESHOLD}')
     print(f'Starting human loop with name: {humanLoopName} n')
     else:
     print('No human loop created. n')

    检查人工循环状态并等待审核人员完成任务

    要定义一项检查人工循环状态的函数,请输入以下代码:

    completed_human_loops = []
    for human_loop_name in human_loops_started:
     resp = a2i_runtime_client.describe_human_loop(HumanLoopName=human_loop_name)
     print(f'HumanLoop Name: {human_loop_name}')
     print(f'HumanLoop Status: {resp["HumanLoopStatus"]}')
     print(f'HumanLoop Output Destination: {resp["HumanLoopOutput"]}')
     print('n')
     if resp["HumanLoopStatus"] == "Completed":
     completed_human_loops.append(resp)

    导航至专有工作人员门户(为Notebook在上一步骤中的单元2输出结果),详见以下代码:

    workteamName = WORKTEAM_ARN[WORKTEAM_ARN.rfind('/') + 1:]
    print("Navigate to the private worker portal and do the tasks. Make sure you've invited yourself to your workteam!")
    print('https://' + sagemaker.describe_workteam(WorkteamName=workteamName)['Workteam']['SubDomain'])

    这套UI模板类似于Ground Truth NER标记功能。Amazon A2I显示从输入文本中识别出的实体(即低置信度预测结果)。而后,工作人员可以根据需要更新或验证实体标签,并选择Submit。

    image

    此项操作将生成更新的注释,其中包含由人工审核员高亮标注的偏移量与实体。

    资源清理

    为了避免产生不必要的费用,请在完成本演练后删除相应资源,包括Amazon SageMaker notebook实例、Amazon Comprehend自定义实体识别器,以及Amazon S3当中不再使用的模型工件。

    总结

    本文演示了如何使用Ground Truth NER为Amazon Comprehend自定义实体识别结果创建注释。我们还使用Amazon A2I以更新并改进Amazon Comprehend的低置信度预测结果。

    大家可以使用Amazon A2I生成的注释更新所创建的注释文件,并逐步训练自定义识别器以不断提升模型精度。

    关于视频演示、Jupyter示例Notebook以及更多与用例相关的详细信息,包括文档处理、内容审核、情感分析与文本翻译等,请参阅Amazon Augmeneted AI资源。期待大家在实际应用中扩展出更多解决方案,也欢迎您提供反馈与建议。

    image

    查看原文

    赞 0 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 1月12日

    案例分享 | 将Caffe2 计算机视觉流水线任务迁移至SageMaker中的Managed Spot Training

    image

    本文由来自SNCF和Olexya的客座作者联合撰写。

    本文将介绍法国国有铁路公司Société Nationale des Chemins de fer Fran?ais(SNCF)如何在技术合作伙伴Olexya的帮助下,运用AWS提供的ML服务,研究、开发与部署创新的计算机视觉解决方案。

    背景介绍

    SNCF成立于1938年,目前拥有超过27万名员工。SNCF Réseau为SNCF旗下子公司,负责铁路网络基础设施的管理与运营工作。SNCF Réseau及其技术合作伙伴Olexya部署了一整套创的解决方案,希望以协助基础设施运营的同时,对基础设施安全性与质量保持高水平。现场团队使用计算机视觉检测基础设施中出现的异常。

    SNCF Réseau的研究人员拥有丰富的ML经验,有一个团队已使用Caffe2深度学习框架开发出本地计算机视觉检测模型。接着,科学家们联系到SNCF Réseau的技术合作伙伴Olexya,他们帮助申请配置GPU资源来支持迭代模型。为了继续保持较低的运营开销与较高的生产效率,同时保持科学代码的全面灵活性,Olexya决定使用Amazon SageMaker编排Caffe2模型的训练与推理。

    整个流程涉及以下步骤:

    1. 创建自定义Docker。
    2. 通过Amazon Simple Storage Service (Amazon S3)数据通道配置训练数据读取。
    3. 通过Amazon SageMaker Spot GPU训练实现有成本效益的训练。
    4. 使用Amazon SageMaker训练API实现有成本效益的推理。

    创建自定义Docker

    该团队创建一个Docker镜像,其中打包有符合Amazon SageMaker Docker规范的原始Caffe2代码。Amazon SageMaker能够容纳多个数据源,而且与Amazon S3进行了高级集成。存储在Amazon S3中的数据集能够被自动提取至运行在Amazon SageMaker上的训练容器当中。

    为了顺畅处理Amazon S3中的可用训练数据,Olexya需要指定训练代码从关联的本地路径opt/ml/input/data/_<channel name>_处执行读取。相似的,模型写入位置必须设定为opt/ml/model。使用这种方式,在训练作业完成之后,Amazon SageMaker就能自动将训练完成的模型工件压缩并发送至Amazon S3。

    通过Amazon Simple Storage Service数据通道配置训练数据读取

    原始Caffe2训练代码通过详尽且灵活的YAML配置文件实现参数调整,所以研究人员能够直接更改模型设置,而无需更改科学代码。外部文件很容易被保留在外部并在训练时使用数据通道读取到容器中。这里所说的数据通道,是指在训练过程中传递至Amazon SageMaker SDK的Amazon S3 ARN,其会在训练开始时被添加至Amazon SageMaker容器当中。Olexya将数据通道配置为通过副本读取的形式(即副本模式),这也是Amazon SageMaker中的默认配置。我们也可以根据需求通过Unix管道(即Pipe模式)实现数据的流式传输。

    通过Amazon SageMaker Spot GPU训练实现有成本效益的训练

    该团队采用ml.p3.2xlarge GPU加速计算实例配置了训练基础设施。Amazon SageMaker ml.p3.2xlarge计算实例特别适用于深度学习计算机视觉类工作负载,其配备了一块有5120个核心的英伟达V100 GPU与16GB高带宽内存(HBM),能够快速训练大型模型。

    此外,Amazon SageMaker训练API被设置激活使用托管Spot实例,与Amazon SageMaker按需实例价格相比,Spot实例被报告节省了71%成本。Amazon SageMaker Managed Spot Training是Amazon SageMaker提供的功能选项,可使用Amazon Elastic Compute Cloud (Amazon EC2) Spot实例资源进行训练。Amazon EC2 Spot实例将处于闲置状态的冗余Amazon EC2计算容量以高折扣方式出售给客户。在Amazon SageMaker当中,Spot实例的实际使用由服务本身全面托管,用户可以设置两项训练SDK参数随时加以调用:

    • train_use_spot_instances=True,用于请求Amazon SageMaker Spot实例的资源使用量。
    • train_max_wait,用于设置以秒为单位的最大可接受等待时长。

    Amazon SageMaker训练API实现有成本效益的推理

    在本次研究计划中,最终用户可以接受推理中断与实例化延迟。因此,为了进一步优化成本,团队使用Amazon SageMaker训练API运行推理代码,在托管的Amazon SageMaker Spot实例之上同样可以用来推理。除了成本优势之外,使用训练API还能够降低学习曲线,因为在模型训练与推理周期之内使用相同的API。

    时间与成本节省效果

    通过以上四个步骤,Olexya成功将本地Caffe2深度计算机视觉检测模型移植到Amazon SageMaker当中,实现训练与推理。更令人印象深刻的是,该团队在约三周之内完成了工具学习,并将模型的训练周期由三天缩减至十个小时!该团队还进一步估计,与原有的本地可用GPU集群相比,Amazon SageMaker得以将总体拥有成本(TCO)降低71%。除此之外,其他优化技术能够进一步降低成本,例如使用Amazon SageMaker自动模型调优进行超参数智能搜索,并使用与之匹配的深度学习框架进行混合精度训练等。

    除SNCF Réseau之外,不少来自运输与物流行业的AWS客户也都在ML技术的帮助下,切实改善了自身业务运营与创新能力。具体案例包括:

    • 来自迪拜的物流公司Aramex使用ML技术解决了地址解析与运输时间预测问题。该公司使用了150个模型,每天执行45万项预测作业。
    • 新南威尔士州运输局使用云服务预测整个运输网络中的乘客数量,借此更好地规划劳动力与资产利用率,进而提升客户满意度。
    • 大韩航空使用Amazon SageMaker启动多个创新项目,旨在预测并提前对飞机机群进行维护。

    总结

    Amazon SageMaker支持从数据注释、到生产部署、再到运营监控的整个ML开发周期。正如Olexya与SNCF Réseau的工作所示,Amazon SageMaker具有良好的框架中立性,能够容纳各类深度学习工作负载及框架。除了预先为Sklearn、TensorFlow、PyTorch、MXNet、XGBoost以及Chainer创建配套Docker镜像与SDK对象以外,用户也可以使用自定义Docker容器,几乎任何框架,如PeddlePaddle、Catboost、R以及Caffe2。对于ML从业者,不要犹豫,请开始测试AWS SageMaker服务,并分享在构建中总结出的经验与心得!

    image

    查看原文

    赞 0 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 1月8日

    【月度文章集锦】2020年11-12月AWS人工智能精华内容一文速览

    image

    欢天喜地迎来2021年,你的各种大目标、小目标都该开始实施了吧。今年你打算学习哪些新知识?又打算在项目中应用哪些新技术呢?大步前进的同时,别忘了回顾一下之前的干货知识点,没准也能带给你一些启发。

    2020年11月和12月,我们照惯例与大家分享了大量有关AWS AI、机器学习、深度学习等内容的技术文章,现在就一起来回顾一下吧。

    机器学习

    众多AWS客户已经开始利用Amazon Lex机器人在电话及其他多种渠道上增强Amazon Connect自助服务的对话体验。借助Amazon Lex,呼叫方能够快速获取问题的答案,几乎不需要人工客服的介入。但这同时也给服务可用性提出了更高的要求,因此引发了新的问题:我们该使用哪种架构模式提升机器人可用性?其实我们可以通过一种跨区域方法,在多个区域中部署Amazon Lex机器人以提高服务可用性。详细方法请参阅:机器人客服你见得多了,不过高可用的机器人你会造吗?

    在使用机器学习技术进行预测时,最麻烦的问题莫过于数据缺失导致的预测结果不准确。但如果你的预测系统使用了Amazon Forecast,那就简单了,利用该服务自带的缺失补全功能,数据问题迎刃而解。本文将使用Forecast GitHub repo中的Notebook示例,向大家展示为相关及目标时间序列(TTS)数据集进行缺失值补全的功能。敬请阅读:数值缺失的情况下如何进行机器学习预测?Amazon Forecast帮你来补全

    Amazon SageMaker提供了一套全托管式解决方案,可用于构建、训练以及部署各种机器学习(ML)模型。在本文中,我们将演示如何使用Amazon SageMaker Processing Jobs配合开源项目Papermill执行Jupyter Notebook。Amazon SageMaker与Amazon CloudWatch、AWS Lambda以及整个AWS栈的结合,向我们提供了实时和按计划扩展作业所需模块化骨干。欢迎阅读:「工具人」何必彻夜守候,SageMaker帮你灵活调度Notebook

    欺诈用户与恶意账户每年可能给企业造成数十亿美元的营收损失。尽管不少企业已经在使用基于规则的筛选器防止系统中存在的各类恶意活动,但这类筛选器往往相当脆弱,而且无法捕捉到全部恶意行为。本文介绍了如何使用Amazon SageMaker与Deep Graph Library(DGL)训练GNN模型,进而检测恶意用户或欺诈事务。详见:面对「不讲武德」的骗子,我们这样对付Ta

    一般来说,开发出来的ML模型还需要不断地完善才能提供让人满意的结果。然而在很多场景,例如在电子商务应用等多种实际环境中,单靠离线评估并不足以保证模型质量,我们需要在生产期间对模型进行A/B测试,并据此做出模型更新决策。借助Amazon SageMaker,大家可以在端点之上运行多个生产模型变体,轻松对ML模型执行A/B测试。这些生产模型变体可以分别对应由不同训练数据集、算法以及ML框架训练而成的ML模型,再配合不同的云实例类型,即可建立起多种测试因素组合。具体做法请参阅:软件开发领域常用的A/B测试,也能用给ML模型啦

    Amazon SageMaker已经在全球各服务区域预装R内核。此项功能开箱即用,同时预安装有reticulate库。该库负责为Amazon SageMaker Python SDK提供R接口,允许大家直接从R脚本中调用Python模块。本文将介绍如何在Amazon SageMaker内置的R内核之上创建自定义R环境(内核),以及如何在会话之间实现环境持久化。此外还将介绍如何在R环境中安装新的软件包,如何在Amazon Simple Storage Service(Amazon S3)上保存这套新环境,以及如何使用它通过Amazon SageMaker生命周期配置创建新的Amazon SageMaker实例。详见:在SageMaker上玩转R环境,这些必会技巧你知道几个?

    深度学习

    尝试过的童鞋都知道,要想玩转深度学习,尤其是模型的训练,可得准备好性能足够强的电脑。CPU倒是无所谓,但GPU,越多越好,越快越好。可就算你不差钱,装备了最高端的AI专用GPU计算卡,面对复杂的模型,训练起来依然要花大量时间等等等等……老板和客户都等着你快点出结果,怎么提高训练速度?多找几台电脑,进行分布式训练吧,效果杠杠滴!具体怎么做?多征用几台电脑,今天我们一起玩玩多GPU分布式训练的深度学习

    GPU能够显著加快深度学习的训练速度,有望将训练周期由几个星期缩短至数小时。但要全面发挥GPU资源的强大性能,还需要考量很多问题。本文将重点介绍在Amazon SageMaker上进行训练时,能够切实提高I/O以优化GPU性能的通用型技术。这些技术方法具有良好的普适性,不对基础设施或深度学习框架本身做出任何要求。通过优化I/O处理例程,整个GPU训练中的性能提升最多可提升至10倍水平。敬请阅读:深度学习训练如何更快些?GPU性能的I/O优化你试过吗?

    人工智能

    有时候我们可能很难找到合适的词汇来描述自己想要寻找的东西。而正如俗语所言:「一图抵千言」,一般来说,展示真实示例或者图像,对于目标的表达效果确实要比纯文字描述好上不少。这一点,在使用搜索引擎查找所需内容时显得尤其突出。其实类似的能力在很多应用中都有,不过你是否想过自己该如何实现?如何快速上手从零开始构建一款视觉图像搜索应用程序,并且让其中包含用于提供视觉搜索结果的全栈Web应用程序?敬请阅读:「视觉搜索」,看似神奇,亲自试试其实没那么难

    卷积神经网络(CNN)的运作机制如同黑匣子,如果无法理解预测的推理过程,我们很可能在使用时遭遇问题。同样的,在模型部署完成之后,与专门用于模型训练的数据相比,用于推理的数据可能遵循完全不同的数据分布。这种现象通常被称为数据漂移(Data drift),有可能导致模型预测错误。在这种情况下,理解并解释导致模型预测错误的原因就成了冲出迷雾的唯一希望。本文将部署一套用于交通标志分类的模型,并设置Amazon SageMaker Model Monitor以自动检测与预期不符的模型行为,例如始终较低的预测得分或者对某些图像类别的过度预测。详见:SageMaker Model Monitor与Debugger神助攻,理解卷积神经网络这个「黑匣子」

    数据科学家们试图使用监督学习技术解决问题时,通常需要在着手建模之前整理出高质量的标记数据集。这可是个辛苦活。好在Amazon SageMaker Ground Truth的出现让每个人都能针对多种不同的任务(例如文本分类与对象检测),轻松地获得自己需要的数据集。Ground Truth还能帮助大家为用户自定义的任务构建自定义数据集,对其中的任意内容做出标注。具体做法可参阅:Angular x Ground Truth,数据集标记作业从未能如此简单

    对数据科学家来说,R语言无异于一个利器,可以非常方便直观地解决大量与数据分析有关的挑战。这样一个神器与SageMaker的机器学习能力相结合又能产生多大的威力?目前,已经有不少AWS客户开始将流行的开源统计计算与图形软件R全面引入大数据分析与数据科学领域。本文我们将了解如何在Amazon SageMaker notebook实例上使用R实现机器学习模型的训练、部署与预测结果检索。欢迎阅读:SageMaker支持R编程,数据科学家们,欢呼吧!

    各行各业的组织都需要处理大量纸质文件,其中又以发票类票据居多。以往,对于包含表格、表单、段落以及复选框的各类扫描文档,我们往往很难从中提取出有效信息。虽然目前不少组织已经通过人工、自定义代码或者光学字符识别(OCR)等技术解决了信息提取难题,但其中仍然需要借助完善的表单提取与自定义工作流模板。此外,在从文档中提取到文本或其他形式的内容之后,用户还希望从收据或发票中帮助最终用户整理出更多深层洞见。但这又需要构建起复杂的自然语言处理(NLP)模型,模型的训练又要占用大量训练数据与计算资源。机器学习模型的构建与训练往往既昂贵、又极为耗时。本文将向大家介绍如何使用AWS AI服务自动实现文本数据处理与洞见发现。借助AWS AI服务,我们可以设置自动化无服务器解决方案以满足上述要求。详见:年底忙着整发票的财务人员,这个好东西你可一定要试试

    AWS提供了一个名为Amazon Translate的机器翻译服务,支持全球各大主要语言的双向互译。除了把一种语言的文字内容复制粘贴到Amazon Translate中并翻译为指定的语言外,最近更新之后的Amazon Translate也开始支持对DOCX、PPTX以及XLSX格式的Office Open XML文档进行翻译。本文将介绍如何在AWS管理控制台上翻译文档。详见:海外客户发来的文档到底在说啥?不懂就问,Amazon Translate告诉你答案

    案例分享

    作为一家大型企业,思科旗下多个业务部门都在应用机器学习(ML)与人工智能(AI)技术。该公司中向CTO直接报告的思科AI团队主要负责在公司内部各业务部门中推广开源AI/ML最佳实践,同时也是Kubeflow开源项目与MLPerf/MLCommons的主要贡献者。该部门希望在机器学习领域开发出要同时供思科业务部门与客户使用的工件与最佳实践,并以参考架构的形式共享这些解决方案。那么他们是怎么做的?欢迎阅读:思科结合SageMaker与Kubeflow打造的混合机器学习工作流

    在机器学习领域,生成对抗网络(GAN)算法已经成为构建Deepfake的最流行算法。Deepfake算法所使用的底层技术,与电影及主机游戏中为我们带来逼真动画效果的方法完全相同。遗憾的是,恶意人士使用这些无辜的算法模糊了现实与虚假之间的区别。Deepfake视频的本质,在于使用人工智能操纵音频与视频,导致最终结果呈现出人物做出或说出了客观上并不存在的行为或语言。2019年10月,AWS与Facebook、微软以及Patnership on AI共同组织了首届Deepfake检测挑战赛。他们是如何运用AWS服务顺利举行本次活动的?敬请阅读:Amazon EC2助力Deepfake检测挑战赛

    面对激烈竞争,几乎每个零售商都在努力为客户提供量身定制的个性化体验。但在恰当的时间,通过恰当的渠道,将恰当的产品,以恰当的方式,推荐给恰当的客户…… 这真想做好谈何容易!来自美国底特律的初创公司StockX主要围绕运动鞋和街头潮牌服饰开展自己的业务,他们致力于通过独特的买卖双向报价革新现有电商销售模式。为了用更加个性化的体验吸引客户,他们经过广泛对比和评估,决定基于Amazon Personalize服务来打造自己的个性化推荐引擎。他们是如何实现这一切的?欢迎阅读:如何借助个性化推荐将客户整体参与度提高50%

    image

    查看原文

    赞 0 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 1月6日

    不用「拉人头」,营销活动这样办,大家当然会踊跃参加

    image

    今时今日,「流量」意味着一切……只要你能引来足够大的流量,无论是产品推广或是直播带货,这种事情做起来简直就是小菜一碟。然而对于企业营销人员来说,最惨的事情莫过于辛辛苦苦规划并举办的营销活动,到最后无人问津,所有努力都打了水漂……

    毕竟如今的营销服务商掌握多种客户交流渠道,而此时的重点在于:如何在正确的时间,以正确的渠道,向正确的客户,发出正确的信息!

    在数字化技术的帮助下,这个问题其实很好解决。本文将介绍如何将Braze(一套以AWS为基础,面向即时需求且强调持续联系的客户参与平台)与Amazon Personalize结合,尝试解决营销活动参与度难题,进而为客户提供充满惊喜的使用体验。

    Braze能够帮助营销人员轻松将客户组织为受众,并根据其行为及个人资料特征进行实时更新,进而创建消息交付宣传,通过电子邮件、短信及推送通知等渠道定位目标受众。我们也可以使用Braze Canvas设计出多步骤、多渠道参与流程。Campaign与Canvas可根据计划,甚至是客户的实际操作手动触发。当然,向客户发送个性化消息的实际效果,直接取决于客户个人资料中透露出的倾向性内容。大家需要根据每位客户在Web与移动端应用互动时表现出的偏好,据此组织产品与内容推荐,从而真正在每一条宣传消息中引入个性化元素。

    Amazon Personalize 是一项AWS服务,使用机器学习算法根据客户的行为数据创建推荐系统。这款推荐器为AWS账户专有,且仅根据所提供的数据进行内容生成。配合Braze Connected Content功能,我们可以将Braze接入用于在Web及移动端应用中提供推荐消息的同一套Amazon Personalize推荐器,借此通过Braze发送的消息准确反映受众的当前偏好与意图。

    解决方案概述

    在本文中,我们将介绍两套架构:其一使用Braze加Amazon Personalize进行实时推荐,其二则是牺牲一部分实时建议新鲜度以换取为更具成本效益的批处理方法。我们对于方法的具体选择,应该与受众宣传策略的目标以及消息传递的规模需求相适应。幸运的是,Braze与Amazon Personalize提供了丰富的功能与集成选项,能够满足我们对于运营灵活性的各种实际需求。

    实时集成

    首先从实时集成架构开始。下图所示,为电子商务应用程序中的各相关组件,大家将在其中使用Amazon Personalize提供的机器学习(ML)支持型推荐器,即本文中的解决方案。在构建这套解决方案时,主要涉及的数据为用户与各商品条目的交互历史。在电子商务应用程序中,还应包含具体事件,例如客户查看商品、将商品添加至购物车以及实际购买商品的行为。在拥有丰富的事件、条目与用户元数据可供使用时,大家即可对这些元数据加以合并,从而进一步提高推荐系统与推荐内容的相关性水平。

    元数据的具体内容可以涵盖多个层面,包括客户使用的设备类型、所在位置以及事件发生的时间(购物季)等;商品的类别、类型与价格区间;以及用户的年龄、性别与订阅倾向。在创建解决方案之后,只需单击几下,即可创建出被称为campaigns的自动扩展API端点,借此检索个性化推荐内容。

    后文还将介绍如何在AWS账户中部署这款应用程序。此应用程序还附带自助式研讨课程,我们可以借此了解如何使用Braze向客户发送个性化宣传邮件。

    image

    我们的示例电子商务应用程序将从Recommendations微服务中检索个性化建议,由此建议将Amazon Personalize提供的推荐商品ID附加至Products微服务当中以丰富产品信息。当用户与应用程序交互,并通过查看商品、将商品添加至购物车乃至购买商品以表达自己的兴趣时,与这些操作相关的事件将通过AWS Amplify JavaScript客户端库被流式传输至Amazon Personalize,再由后者自动根据用户的实时活动做出推荐调整。

    通过在应用程序当中内置个性化设置,我们可以将Amazon Personalize与Braze对接起来,通过电子邮件、短信以及推送通知等出向推广渠道为客户提供个性化推荐结果。

    大家还可以通过Braze创建消息模板。此类模板通过Liquid模板语言,使用客户个人资料乃至其他外部资源中的值以替换模板中的原始占位符。在实时架构中,我们使用的示例应用程序将Recommendations微服务作为外部资源,并使用Braze Connected Content功能检索个性化推荐,而后将适用的推荐内容包含在消息模板当中。在以下Connected Content Liquid标签(位于电子邮件开头部分)中,我们可以看到如何从Braze处调用Recommendations服务以为当前用户检索推荐信息。

    {% connected_content http://<RecommendationsServiceHostName>/recommendations?userID={{${user_id}}}&fullyQualifyImageUrls=1&numResults=4 :save result %}

    标签当中包含以下元素:

    • Liquid标签位于{%与%}当中,我们可以借此向消息模板中添加标签、表达式,甚至是文本或HTML。
    • 标签类型将在标签开始之后立即声明。在本用例中,标签类型为connected_content。关于所支持标签的完整列表,请参阅使用Liquid标签实现个性化设置
    • 接下来,我们需要为各用户定义一条由Connected Content进行调用的、指向对应HTTP资源的标准URL。请将其中的<RecommendationsServiceHostName>部分替换为Elastic Load Balancer的主机名称,用于在示例应用程序部署当中实现Recommendations服务。
    • Recommendations服务将为不同的个性化功能提供相应资源。我们可以通过/recommendations路径访问用户推荐资源。
    • 接下来是查询字符串参数。用户通过userID参数进行身份验证,而{{${user_id}}}表达式则用于指示Braze在每次服务调用中插入用户ID。
    • 最后两项查询字符串参数为fullyQualifyImageUrls=1与numResults=4,用于告知Recommendations服务必须保证商品图像URL正确可用,从而顺利显示在用户的电子邮件客户端当中。另外在本示例中,应仅返回前四条推荐商品。
    • :save result表达式用于告知Braze将来自Recommendations服务的JSON响应分配至名为result的模板变量。在响应保存完成后,我们可以使用模板中其余部分的Liquid标签访问该响应中的各项元素。

    以下代码所示,为来自Recommendations服务的响应格式:

    [
     {
     "product": {
     "id": "2",
     "url": "http://recs.cloudfront.net/#/product/2",
     "sk": "",
     "name": "Striped Shirt",
     "category": "apparel",
     "style": "shirt",
     "description": "A classic look for the summer season.",
     "price": 9.99,
     "image": "http://recs.cloudfront.net/images/apparel/1.jpg",
     "featured": "true"
     }
     },
     {
     "product": {
     "id": "1",
     "url": "http://recs.cloudfront.net/#/product/1",
     "sk": "",
     "name": "Black Leather Backpack",
     "category": "accessories",
     "style": "bag",
     "description": "Our handmade leather backpack will look great at the office or out on the town.",
     "price": 109.99,
     "image": "http://recs.cloudfront.net/images/accessories/1.jpg",
     "featured": "true"
     }
     },
     ...
    ]
    

    为了简便起见,以上代码仅显示前两款推荐商品。我们可以在Braze消息模板中使用多条商品属性以代表各项建议。要访问其中的数组或列表中的特定元素,则可在Liquid标签中使用数组下标符号。例如,以下标签会在响应当中插入第一款推荐商品的产品名称。对应之前的示例响应,标签解析后对应“Striped Shirt”:

    {{result[0].product.name}}

    在将来自Recommendations服务的个性化推荐响应信息与Liquid标签相结合之后,我们即可根据需求设计出无数种消息构建方式。以下代码所示,为在HTML电子邮件模板当中显示推荐商品。

    <table>
     <tr>
     <td>
     <a href="{{result[0].product.url}}" target="_blank">
     <img data-original="{{result[0].product.image}}" width="200" alt="{{result[0].product.name}}" />
     </a>
     </td>
     <td>
     <h2>{{result[0].product.name}}</h2>
     <p>{{result[0].product.description}}</p>
     <p>Only <strong>$ {{result[0].product.price}}</strong>!</p>
     <a class="button" href="{{result[0].product.url}}">Buy Now</a>
     </td>
     </tr>
    </table>

    批量集成

    批量集成架构使用Amazon Personalize批量推荐作业代替Braze Connected Content功能,专门负责将属性更新推送至Braze。批量推荐需要在Amazon Simple Storage Service (Amazon S3)存储桶内创建文件,其中包含作为推荐对象的用户。接下来,引用此文件以将作业提交至Amazon Personalize,由后者为文件内的各用户生成推荐,并将结果输出至选定的另一个Amazon S3文件处。我们可以使用批量推荐作业的输出结果,将个性化推荐与Braze中的用户个人资料共同关联为自定义属性。如此一来,我们在前一种架构的消息模板中看到的Liquid标签,将在这种架构内调整为通过用户个人资料(而非Connected Content响应)访问作为自定义属性的推荐结果。

    如前所述,大家在使用批处理方法时需要做出权衡,即通过牺牲实时推荐的新鲜度,以换取更具成本效益的解决方案。由于批量推荐不需要Amazon Personalize中的campaign作为支持,也就消除了各用户由Connected Content发往campaign的额外请求。对于体量庞大且包含众多细分受众类型的Braze campaign,这种方式能够大大减少请求总量。此外,如果不需要针对其他用途使用Amazon Personalize campaigns,或者打算创建专门用于邮件个性化的Amazon Personalize解决方案,也可以完全不创建任何campaign。

    下图所示,为设计这套批处理架构的一种可行方法。我们仍然可以在这里使用实时架构中的某些Web应用程序组件;但为了简洁起见,我们排除掉了所有与实时架构相重复的组件。

    image

    我们可以使用Amazon CloudWatch Events定期触发AWS Lambda函数,由此函数为Amazon Personalize批量推荐作业构建输入文件。批量推荐作业完成之后,将由另一项Lambda函数处理输出文件,使用丰富的商品信息进一步充实推荐条目,并在Amazon Kinesis Data Streams当中建立用户更新事件队列。最后,通过另一项新的Lambda函数使用流事件,并使用Braze User API更新用户个人资料。

    使用Kinesis数据流将带来一系列重要助益,包括将批处理作业与事务性Braze用户更新流程解耦开来,同时提供对用户更新事件的暂停、重新启动与重放等功能。

    实时集成演练

    大家可以通过Retail Demo Store示例电子商务应用体验如何实现实时集成。在本文中,我们将分步引导大家完成在AWS账户部署此项目的具体流程,并阐述如何启动应用程序当中绑定的自助式Braze研习课程。

    具体操作步骤如下:

    • 使用其中提供的AWS CloudFormation模板,将Retail Demo Store项目部署至AWS账户(需要25到30分钟)。
    • 构建Amazon Personalize解决方案,以及用于提供个性化推荐的campaigns(需要2小时)。
    • 将用户导入Braze,并使用Connected Content构建一项Braze campaign,借此从Amazon Personalize中检索个性化推荐内容(需要1小时)。
    • 清理资源。

    先决条件

    在本演练中,大家需要满足以下先决条件:

    • 一个AWS账户
    • AWS账户中须包含一个用户,且具备部署项目所需要的各项权限
    • 一个Braze账户

    如果还没有Braze账户,请联系Braze客户代表。此外,大家还至少需要完成Braze LAB的入门课程

    步骤1:将Retail Demo Store部署至AWS账户

    通过下表,我们应在选定的区域当中选择Launch Stack。这里提供的区域列表并不代表一定能够在其中部署项目,仅代表示例部署中对应的各个区域。

    区域启动
    美国东部(北弗吉尼亚州)Launch Stack
    美国西部(俄勒冈州)Launch Stack
    欧洲(爱尔兰)Launch Stack

    接受模板中的各项默认参数值,而后启动模板。项目的资源部署大约需要25到30分钟。

    步骤2:构建Amazon Personalize campaigns

    在提供个性化产品推荐之前,首先需要训练ML模型并在Amazon Personalize中配置推荐内容检索所需要的推理端点。步骤1中部署的CloudFormation模板中包含一个Amazon SageMaker notebook实例,该实例为Jupyter notebook提供了详尽的分步操作说明。Notebook的构建大约需要2个小时才能完成。

    • 登录至在步骤1中用于部署CloudFormation模板的AWS账户。
    • 在Amazon SageMaker控制台上,选择Notebook instances
    • 如果还没有看到RetailDemoStore Notebook实例,请保证确实处于项目部署所在的同一区域内。
    • 要访问该Notebook实例,请选择Open Jupyter或者Open JupyterLab。
    • 在为Notebook实例加载Jupyter Web界面后,选择workshop/1-Personalization/1.1-Personalize.ipynb。

    各Notebooks将以目录的形式进行结构组织,因此可能需要选择Workshop文件夹才能查看Notebook中的各子目录。

    • 在打开1.1-Personalize Notebook后,阅读并运行各个单元以爱步完成研习流程。

    我们也可以从Jupyter工具栏中选择Run,以依次运行各单元中的代码。

    image

    步骤3:由Braze发出个性化消息

    通过使用Amazon Personalize解决方案与campaigns生成个性化推荐。现在,我们可以将各用户导入自己的Braze账户,构建使用Braze Connected Content对Amazon Personalize推荐内容进行检索的消息传递模板,而后构建一项Braze campaign以将目标电子邮件发送给用户。

    与步骤1中的个性化研习课程类似,Braze消息传递研习课程也将逐步引导您完成整个流程。此Notebook大约需要1个小时才能运行完成。

    • 如有必要,请重复步骤1中的操作,通过Retail Demo Store部署中的Amazon SageMaker Notebook实例打开Jupyter或者JupyterLab浏览器窗口。
    • 在Notebook实例加载Jupyter Web界面后,选择workshop/4-Messaging/4.2-Braze.ipynb Notebook。

    与之前一样,我们可能需要选择Workshop文件夹以查看Notebook下的各子目录。

    • 打开4.2-Braze Notebook后,通过阅读并运行各个单元以分步完成研习流程。

    image

    步骤4:资源清理

    为避免产生不必要的费用,请删除Retail Demo Store项目中的各类资源,具体方法为删除我们在部署期间使用的CloudFormation模板。关于本文中所使用的源代码以及完整Retail Demo Store项目的更多详细信息,请参阅GitHub repo

    总结

    时至今日,营销人员正通过各类消息力争吸引到客户的注意力,这也意味着大家必须能够在正确的时间、以正确的渠道将正确的消息传递给明确定位的正确用户。Braze为前三项难题提供解决方案,而大家也可以将Braze Connected Content与Amazon Personalize集成起来以攻克最后一个挑战,真正整理出能够反映每一位客户当前偏好、具有高度个性化的产品与内容建议。

    image

    查看原文

    赞 3 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 2020-12-30

    机器人客服你见得多了,不过高可用的机器人你会造吗?

    image

    不知道从什么时候开始,当我们联系一些企业的客服时,越来越多的联系和支持工作都开始由AI机器人程序代为完成了。无论是电话下单,查询订单状态,咨询业务问题,或者其他什么类型的求助,这些机器人通常都能很好地完成,而一些比较「黑科技」的机器人,甚至在成功解决问题之后,我们都无法判断电话那头的到底是人还是程序……

    就是因为效果太好,很多企业甚至已经开始主要通过这种方式向用户提供服务,甚至开始缩减人工客服的岗位。那么这就可能产生一个问题:如果机器人客服的程序挂了,你的客户该由谁来提供服务?

    如果你的智能客服是基于Amazon Lex构建的,那么可以考虑创建高可用性的多区域机器人,这样就算一个区域的机器人故障,也可以自动交由其他区域来接待客户,从根本上解决这种问题。

    众多AWS客户已经开始利用Amazon Lex机器人在电话及其他多种渠道上增强Amazon Connect自助服务的对话体验。借助Amazon Lex,呼叫方(用Amazon Connect术语描述,即客户)能够快速获取问题的答案,几乎不需要人工客服的介入。但这同时也给服务可用性提出了更高的要求,因此引发了新的问题:我们该使用哪种架构模式提升机器人可用性?在本文中,我们将探讨一种跨区域方法,通过在多个区域中部署Amazon Lex机器人以提高服务可用性。

    架构概述

    在这套解决方案中,一旦Amazon Lex出现服务可用性问题,Amazon Connect流能够将中断影响控制在最低程度,借此实现业务连续性。此架构模式使用以下组件:

    • 两个Amazon Lex机器人,各自处于不同的区域内。
    • 两个机器人由负责区域检查的AWS Lambda函数进行触发,并集成至Amazon Connect流内。
    • 用于检查机器人运行状况的Lambda函数。
    • 为Amazon Connect区域中的主机器人创建一套Amazon DynamoDB表,并通过Lambda函数进行读取。
    • 使用DynamoDB表保存Amazon Connect与Amazon Lex之间的区域映射。由之前提到的运行状态检查函数负责更新此表。区域检查函数读取此表,以获取Amazon Connect与Amazon Lex的最新主区域映射。

    之所以要在两个区域内设置完成相同的Amazon Lex机器人,是为了能够随时在辅助区域中启动该机器人,进而在主区域发生故障时及时替换。
    image

    Amazon Lex的多区域模式

    随后的两节,主要描述集成有Amazon Lex机器人的Amazon Connect流如何在主区域发生服务故障或中断的情况下,快速实现恢复并使用辅助区域内的Amazon Lex正常响应客户呼叫。

    运行状况检查函数将根据TEST_METHOD Lambda环境变量对两个Amazon Lex运行时API之一进行调用(PutSession或PostText)。我们可以根据自己的喜好及用例要求选择其中一个。PutSession API调用不会产生任何额外的Amazon Lex关联费用,但无法测试Amazon Lex提供的自然语言理解(NLU)功能。PostTextAPI则允许我们检查Amazon Lex的NLU功能,且额外成本不高。

    运行状况检查函数会将通过测试的区域名称,更新至DynamoDB表(lexDR)中的lexRegion列。如果主区域正常通过运行状况检查,则lexRegion将被更新为主区域名称。如果运行状况检查失败,则该函数将基于辅助区域内的TEST_METHOD环境变量向相应的运行时API发出调用。如果测试成功,则DynamoDB表中的lexRegion列将被更新为辅助区域;如果测试仍然失败,则更新为err,代表两个区域皆已发生服务中断。

    在Amazon Connect收到的每项呼叫中,都会发出区域运行状况检测函数调用,借此获取当前Amazon Connect区域中的活动Amazon Lex区域。由区域运行状况检查函数返回的主区域将作为最新条目,由该检查函数写入至DyanmoDB表。由区域检查函数返回的可用区域内Amazon Lex机器人,将通过Get Customer Input Block配置接受Amazon Connect的调用。如果函数返回的是辅助区域,则Amazon Connect将调用辅助区域中的机器人。

    部署Amazon Lex机器人

    大家需要在主区域与辅助区域中创建相同的对话机器人。在本文中,我们将us-east-1作为主区域,us-west-2作为辅助区域。接下来,先使用主区域us-east-1创建机器人:

    • 在Amazon Lex控制台上点击Create。
    • 在Try a Sample部分,选择OrderFlowers,而后在COPPA中选择No。
    • 其他设置项皆保留默认值,点击Create。
    • 此机器人的创建与构建操作将自动进行。
    • 在机器人构建完成(约需1至2分钟)后,选择Publish。
    • 创建一个别名,名称为ver_one。

    对us-west-2区域重复上述步骤。现在,我们已经在us-east-1与us-west-2中建立起能够正常运行的Amazon Lex机器人。

    创建DynamoDB

    请确保当前处于us-east-1区域内。

    • 在DynamoDB控制台选择Create。
    • 在Table name部分,输入lexDR。
    • 在Primary key部分,输入connectRegion且类型为String。
    • 其他各项保留默认值,而后选择Create。
    • 在Items选项卡中,选择Create item。
    • 将connectRegion的值设置为us-east-1,而后Append一个类型为String、名称为lexRegion的新列,并将其值设置为us-east-1。

    image

    • 点击Save。

    image

    为Lambda函数创建IAM角色

    在此步骤中,我们将为两项Lambda函数创建一个AWS身份与访问管理(AWS Identity and Access Management,简称IAM)角色。

    • 在IAM控制台上,点击Access management并选择Policies。
    • 点击Create Policy。
    • 点击JSON。
    • 粘贴以下自定义IAM策略,此策略允许对DynamoDB表lexDR进行读取/写入访问。请将策略中的“xxxxxxxxxxxx”部分替换为我们的AWS账户编号。
    {
     "Version": "2012-10-17",
     "Statement": [{
     "Sid": "VisualEditor0",
     "Effect": "Allow",
     "Action": ["dynamodb:GetItem", "dynamodb:UpdateItem"],
     "Resource": "arn:aws:dynamodb:us-east-1:xxxxxxxxxxxx:table/lexDR"
     }]
    }
    
    • 点击Review Policy。
    • 将其命名为DynamoDBReadWrite,而后点击Create Policy。
    • 在IAM控制台上,点击Access management下的Roles,而后点击Create Role。
    • 为该服务选择Lambda,而后点击Next。
    • 附加以下权限策略:

      • AWSLambdaBasicExecutionRole
      • AmazonLexRunBotsOnly
      • DynamoDBReadWrite
    • 点击Next: Tags。接下来点击Next: Review以跳过Tags页面。
    • 将角色命名为lexDRRole,而后点击Save。

    部署区域检查函数

    我们首先需要创建一项Lambda函数,用于从DynamoDB表中读取记录,借此判断哪个Amazon Lex机器人与Amazon Connect实例处于同一区域当中。Amazon Connect或者使用此机器人的应用程序后续将调用此函数。

    • 在Lambda控制台上,选择Create function。
    • 在Function name部分,输入lexDRGetRegion。
    • 在Runtime部分,选择Python 3.8。
    • 在Permissions之下,选择Use an existing role。
    • 选择角色lexDRRole。
    • 选择Create function。
    • 在Lambda代码编辑器中,输入以下代码(下载自lexDRGetRegion.zip):
    import json
    import boto3
    import os
    import logging
    dynamo_client=boto3.client('dynamodb')
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    def getCurrentPrimaryRegion(key):
     result = dynamo_client.get_item(
     TableName=os.environ['TABLE_NAME'],
     Key = {
     "connectRegion": {"S": key }
     }
     )
     logger.debug(result['Item']['lexRegion']['S'] )
     return result['Item']['lexRegion']['S']
    def lambda_handler(event, context):
     logger.debug(event)
     region = event["Details"]["Parameters"]["region"]
     return {
     'statusCode': 200,
     'primaryCode': getCurrentPrimaryRegion(region)
     }
    
    • 在Environment variables部分,选择Edit。
    • 添加一项环境变量,其中Key为TABLE_NAME,Value为lexDR。
    • 点击Save以保存该环境变量。
    • 点击Save以保存该Lambda函数。

    image

    部署运行状况检查函数

    在us-east-1当中创建另一项Lambda函数,用以实现运行状况检查功能。

    • 在Lambda控制台上,选择Create function。
    • 在Function name部分,输入lexDRTest。
    • 在Runtime部分,选择Python 3.8。
    • 在Permissions之下,选择Use an existing role。
    • 选择lexDRRole。
    • 选择Create function。
    • 在Lambda代码编辑器中,输入以下代码(下载自lexDRTest.zip):
    import json
    import boto3
    import sys
    import os
    dynamo_client = boto3.client('dynamodb')
    primaryRegion = os.environ['PRIMARY_REGION']
    secondaryRegion = os.environ['SECONDARY_REGION']
    tableName = os.environ['TABLE_NAME']
    primaryRegion_client = boto3.client('lex-runtime',region_name=primaryRegion)
    secondaryRegion_client = boto3.client('lex-runtime',region_name=secondaryRegion)
    def getCurrentPrimaryRegion():
     result = dynamo_client.get_item(
     TableName=tableName,
     Key={ 
     'connectRegion': {'S': primaryRegion} 
     }
     )
     return result['Item']['lexRegion']['S']
    def updateTable(region):
     result = dynamo_client.update_item(
     TableName= tableName,
     Key={ 
     'connectRegion': {'S': primaryRegion }
     }, 
     UpdateExpression='set lexRegion = :region',
     ExpressionAttributeValues={
     ':region': {'S':region}
     }
     )
    #SEND MESSAGE/PUT SESSION ENV VA
    def put_session(botname, botalias, user, region):
     print(region,botname, botalias)
     client = primaryRegion_client
     if region == secondaryRegion:
     client = secondaryRegion_client
     try:
     response = client.put_session(botName=botname, botAlias=botalias, userId=user)
     if (response['ResponseMetadata'] and response['ResponseMetadata']['HTTPStatusCode'] and response['ResponseMetadata']['HTTPStatusCode'] != 200) or (not response['sessionId']): 
     return 501
     else:
     if getCurrentPrimaryRegion != region:
     updateTable(region)
     return 200
     except:
     print('ERROR: {}',sys.exc_info()[0])
     return 501
    def send_message(botname, botalias, user, region):
     print(region,botname, botalias)
     client = primaryRegion_client
     if region == secondaryRegion:
     client = secondaryRegion_client
     try:
     message = os.environ['SAMPLE_UTTERANCE']
     expectedOutput = os.environ['EXPECTED_RESPONSE']
     response = client.post_text(botName=botname, botAlias=botalias, userId=user, inputText=message)
     if response['message']!=expectedOutput:
     print('ERROR: Expected_Response=Success, Response_Received='+response['message'])
     return 500
     else:
     if getCurrentPrimaryRegion != region:
     updateTable(region)
     return 200
     except:
     print('ERROR: {}',sys.exc_info()[0])
     return 501
    def lambda_handler(event, context):
     print(event)
     botName = os.environ['BOTNAME']
     botAlias = os.environ['BOT_ALIAS']
     testUser = os.environ['TEST_USER']
     testMethod = os.environ['TEST_METHOD']
     if testMethod == 'send_message':
     primaryRegion_response = send_message(botName, botAlias, testUser, primaryRegion)
     else:
     primaryRegion_response = put_session(botName, botAlias, testUser, primaryRegion)
     if primaryRegion_response != 501:
     primaryRegion_client.delete_session(botName=botName, botAlias=botAlias, userId=testUser)
     if primaryRegion_response != 200:
     if testMethod == 'send_message':
     secondaryRegion_response = send_message(botName, botAlias, testUser, secondaryRegion)
     else:
     secondaryRegion_response = put_session(botName, botAlias, testUser, secondaryRegion)
     if secondaryRegion_response != 501:
     secondaryRegion_client.delete_session(botName=botName, botAlias=botAlias, userId=testUser)
     if secondaryRegion_response != 200:
     updateTable('err')
     #deleteSessions(botName, botAlias, testUser)
     return {'statusCode': 200,'body': 'Success'}
    • 在Environment variables部分,选择Edit,而后添加以下环境变量:

      • BOTNAME – OrderFlowers
      • BOT_ALIAS – ver_one
      • SAMPLE_UTTERANCE – I would like to order some flowers. (向机器人发送的示例话语。)
      • EXPECTED_RESPONSE – What type of flowers would you like to order? (机器人在收到以上示例话语后应做出的预期响应。)
      • PRIMARY_REGION – us-east-1
      • SECONDARY_REGION – us-west-2
      • TABLE_NAME – lexDR
      • TEST_METHOD – put_session或send_message

        • send_message:此方法将调用Lex运行时函数postText,该函数将提取语音并将其映射至训练得出的某一intent。postText将测试Lex的自然语言理解能力,每项请求的使用成本为0.00075美元,几乎可以忽略不计。
        • put_session:此方法将调用Lex运行时函数put_session,该函数为用户创建一个新的会话。put_session不会测试Lex的自然语言理解能力。
      • TEST_USER – test
    • 点击Save以保存此环境变量。
    • 在Basic Settings section当中,将Timeout的值更新为15秒。
    • 点击Save以保存此Lambda函数。

    image

    创建一条Amazon CloudWatch规则

    为了每5分钟触发一次运行状况检查函数,我们需要创建一条Amazon CloudWatch规则。

    • 在CloudWatch控制台的Events之下,选择Rules。
    • 选择Create rule。
    • 在Event Source之下,将选项切换为Schedule。
    • 将Fixed rate of设置为5 minutes。
    • 在Targets之下,选择Add target。
    • 选择目标Lambda function。
    • 在Function部分,选择lexDRTest。
    • 在Configure input之下,选择Constant(JSON text),而后输入{}。
    • 选择Configure details。
    • 在Rule definition之下的Name部分,输入lexHealthCheckRule。
    • 选择Create rule。

    现在,我们应该已经建立起lexHealthCheckRule CloudWatch规则,能够每5分钟调用一次lexDRTest函数。这项操作将检查主机器人的运行状况是否正常,并将结果对应更新至DynamoDB表。

    创建Amazon Connect实例

    随后我们需要创建一个Amazon Connect实例,借此在创建lexDRTest函数的同一区域之内测试机器人的多区域模式。

    • 如果还没有Amazon Connect实例,请首先创建一个
    • 在Amazon Connect控制台上,选择作为Amazon Connect传输流目标的实例别名。
    • 选择Contact flows。
    • 在Amazon Lex之下,从us-east-1区域中选择OrderFlowers机器人,而后点击Add Lex Bot。
    • 在us-west-2区域中选择OrderFlowers机器人,而后点击Add Lex Bot。

    image

    • 在AWS Lambda之下,选择lexDRGetRegion并点击Add Lambda Function。
    • 点击左侧面板中的Overview再点击登录链接,借此登录至Amazon Connect实例。
    • 点击左侧面板中的Routing,而后点击下拉菜单中的Contact Flows。
    • 点击Create Contact Flow按钮。
    • 点击Save按钮旁的向下箭头按钮,再点击Import Flow。
    • 下载联系流程Flower DR Flow。在Import Flow对话框中上传此文件。

    image

    • 在Contact Flow中,点击Inovke AWS Lambda Function部分,借此在屏幕右侧打开一个属性面板。
    • 选择lexDRGetRegion并点击Save。
    • 点击Publish按钮,发布当前联系流程。

    将电话号码关联至联系流程

    接下来,我们需要将电话号码关联至联系流程,借此调用并测试OrderFlowers机器人。

    • 点击左侧导航栏中的Routing选项。
    • 点击Phone Numbers。
    • 点击Claim Number。
    • 选择国家代码并选择电话号码。
    • 在Contact flow/IVR选择框中,选择我们在之前步骤中导入的联系流程Flower DR Flow。
    • 等待几分钟,而后呼叫该号码以与OrderFlowers机器人交互。

    测试集成效果

    要测试这套解决方案,可以执行以下操作以模拟us-east-1区域发生故障的场景:

    • 在us-east-1区域中打开Amazon Lex控制台。
    • 选择OrderFlowers机器人。
    • 点击Settings。
    • 删除机器人别名ver_one。

    在下一次进行运行状况检查时,解决方案将尝试与us-east-1区域的Lex机器人进行通信。由于机器人别名不存在,因此无法获得成功响应。因此,本示例随后会呼叫辅助区域us-west-2并收到成功响应。在收到响应后,示例将使用us-west-2更新lexDR以及DynamoDB表中的lexRegion列。

    接下来,所有指向us-east-1区域内Connect的后续呼叫都将与us-west-2区域内的Lex机器人进行实际交互。通过这一自动切换,可以证明当前架构模式确实能够在发生服务故障时保障业务连续性。

    在删除机器人别名到下一次运行状况检查之间的时段内,对Amazon Connect的呼叫都将失败。但在运行状况检查之后,系统将自动实现业务连续性保障。因此,每一轮运行状况检查之间的间隔越短,则停机时间越短。我们可以通过编辑Amazon CloudWatch规则lexHealthCheckRule以调整每次运行状况检查之间的间隔时长。

    要让us-east-1区域再次通过运行状况检查,请在us-east-1中重新创建OrderFlowers机器人的别名ver_one。

    资源清理

    为了避免产生不必要的额外成本,请删除本示例中创建的所有资源。

    • 创建在us-east-1与us-west-2当中的Amazon Lex机器人OrderFlowers
    • CloudWatch规则lexHealthCheckRule
    • DynamoDB表lexDR
    • Lambda函数lexDRTest与lexDRGetRegion
    • IAM角色lexDRRole
    • 联系流程Flower DR Flow

    总结

    配合Amazon Lex提供的自助服务,Amazon Connect将帮助我们轻松创建便捷直观的客户服务体验。本文提供一种跨区域形式的高可用性实现方法,保证能够在某一区域中的机器人或支持实现API不可用时,使用来自其他区域的资源以继续响应客户呼叫。

    image

    查看原文

    赞 6 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 2020-12-28

    在SageMaker上玩转R环境,这些必会技巧你知道几个?

    image
    很多童鞋可能已经知道,Amazon SageMaker已经在全球各服务区域预装R内核。此项功能开箱即用,同时预安装有reticulate库。该库负责为Amazon SageMaker Python SDK提供R接口,允许大家直接从R脚本中调用Python模块。之前我们曾经发布过一篇文章介绍这件事,欢迎点击这里回顾。

    如果你想进一步将这个功能发挥出更多价值,那么本文就值得关注了。

    下文,我们将介绍如何在Amazon SageMaker内置的R内核之上创建自定义R环境(内核),以及如何在会话之间实现环境持久化。此外还将介绍如何在R环境中安装新的软件包,如何在Amazon Simple Storage Service(Amazon S3)上保存这套新环境,以及如何使用它通过Amazon SageMaker生命周期配置创建新的Amazon SageMaker实例。本文也提供相应bash脚本,供大家在创建或启动Amazon SageMaker notebook实例时配置生命周期。

    背景介绍

    Amazon SageMaker中的R内核以IRKernel软件包构建而成,该软件包将在Jupyter环境中安装名为ir且显示名称R的内核。

    我们可以使用Conda管理这套环境,并安装特定的软件包与依赖项。但在默认情况下,从Notebook实例处安装的R内核无法持久至其他Notebooke实例的会话当中。每当启动及停止Amazon SageMaker实例时,R内核都会返回其默认环境。

    本文将引导大家使用以下资源在Amazon SageMaker中安装R软件包:

    • Anaconda Cloud
    • CRAN
    • Github

    在环境创建完成之后,我们可以将其保存在实例的Amazon Elastic Block Store(Amazon EBS)存储当中以实现持久化。我们也可以将该环境存储在Amazon S3上,并使用它为新的Amazon SageMaker实例构建自定义R环境。关于更多详细信息,请参阅使用生命周期配置脚本定制Notebook实例

    创建一个基于R内核的Amazon SageMaker notebook实例

    要创建一个基于R内核的Amazon SageMaker notebook实例,请完成以下操作步骤:

    在打开新的Notebook后,我们将在Notebook区域的右上角看到R徽标。

    关于创建基于R内核的Amazon SageMaker notebook实例的更多详细信息,请参阅在Amazon SageMaker notebook实例上使用R代码

    在Amazon SageMaker的R内核中安装软件包

    Amazon SageMaker R内核提供超过140种标准软件包。要获取已安装软件包的清单,可以在配合R内核的SageMaker notebook中运行以下脚本:

    installed.packages()

    如果需要安装其他软件包,则可以通过Anaconda Cloud、CRAN归档或者直接通过GitHub进行安装。

    通过Anaconda Cloud安装

    R软件包的首选安装方法,是从Anaconda Cloud存储库进行安装。我们可以通过这种方式访问不同的通道(例如R与Conda Forge),从而安装软件包的特定版本。如果使用R内核在Amazon SageMaker中执行此项操作,请使用system()命令以提交conda install命令。

    如果是在Amazon SageMaker Jupyter bash终端上进行安装,则可使用conda install,如下所示:

    conda install -n R -c conda-forge r-rjava

    但在Amazon SageMaker中,请输入以下代码:

    system("conda install -n R -c conda-forge r-rjava")

    上述代码使用conda-forge通道,此通道负责安装rJava的0.9_12版本(截至本文发布之时)。但如果使用以下代码(使用r channel),则将安装0.9_11版本(截至本文发布之时):

    system("conda install -n R -c r r-rjava")

    要搜索特定软件包名称并为版本选择正确的通道,请访问Anaconda Cloud网站并搜索对应软件包。R软件包的命名格式为“r-<package_name>”。

    image

    Conda是安装软件包的首选方法,而Anaconda Cloud则凭借接入Conda环境最稳定版本的取向成为最佳归档选项。

    通过CRAN归档安装

    作为Anaconda的替代方案,大家也可以使用综合R归档网络(CRAN)归档完成安装。CRAN归档是一套由FTP与Web服务器组成的网络,分布于世界各地,其中保存有相同的R代码以及说明文档的最新版本。我们可以使用此归档文件通过install.packages()在R中安装软件包,以保证安装的是软件包的最新版本。具体参见以下代码:

    install.packages(c('mlbench', 'MVar'),
     repo = 'http://cran.rstudio.com',
     dependencies = TRUE)

    使用以下代码将该软件包导入R代码:

    library(mlbench)

    Amazon SageMaker实例使用Amazon Linux AMI,这是一套从CentOS演变而来的发行版,可用于在Amazon Elastic Compute Cloud(Amazon EC2)实例当中运行Amazon SageMaker。如果打算直接通过源代码安装软件包,请保证选择正确的操作系统。大家可以在Amazon SageMaker Jupyter bash终端中使用以下脚本检查操作系统:

    sh-4.2$ cat /etc/os-release

    输出结果如下所示(截至本文发布之时):

    NAME="Amazon Linux AMI"
    VERSION="2018.03"
    ID="amzn"
    ID_LIKE="rhel fedora"
    VERSION_ID="2018.03"
    PRETTY_NAME="Amazon Linux AMI 2018.03"
    ANSI_COLOR="0;33"
    CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
    HOME_URL=http://aws.amazon.com/amazon-linux-ami/

    通过Github安装

    我们还可以使用devtools与install_github直接从软件包开发者的库中获取内容。具体参见以下代码:

    install.packages("devtools")
    devtools::install_github("malcolmbarrett/ggdag")

    上述代码将安装软件包及其依赖项。但请注意,我们不推荐将此作为Amazon SageMaker当中的首选软件包安装方法。

    在不同会话间实现自定义R环境持久化

    在默认情况下,每当我们停止及启动Amazon SageMaker实例时,Amazon SageMaker都会启动基础R内核。而在停止实例时,我们所安装的所有其他软件包都将丢失,且再次启动实例时又需要重新安装各软件包 —— 很明显,这种方式既费时又麻烦。解决方案是将环境保存在实例的EBS存储之上,并在启动时使用Amazon SageMaker生命周期配置脚本将EBS存储与自定义R内核相对接。更多信息请参阅使用生命周期配置脚本实现Notebook实例定制化

    本节将概述实现自定义R环境持久化的各个操作步骤。

    将环境保存在Amazon SageMaker EBS

    首先需要通过环境克隆操作,将当前环境保存在实例的EBS存储之上。我们可以在Amazon Sagemaker Jupyter bash终端中运行以下脚本:

    conda create --prefix /home/ec2-user/SageMaker/envs/custom-r --clone R

    这将在我们有权访问的实例EBS上的Amazon SageMaker文件夹下创建一个envs/custom-r文件夹,具体参见以下截屏内容。

    image

    如果希望稍后在同一Amazon SageMaker实例(注意,并非在其他不同实例中)中使用这套自定义环境,则可跳过生命周期配置部分内容,直接前往本文中的使用自定义R环境启动实例部分。

    在Amazon S3中保存环境以创建新的Amazon SageMaker实例

    如果需要在创建Amazon SageMaker实例时重复使用同一套自定义R环境(例如在开发团队内部),可以将该环境以.zip文件形式保存至Amazon S3,并在Create步骤中将其下载至实例当中。我们可以在Amazon SageMaker Juypyter bash终端内运行以下脚本:

    zip -r ~/SageMaker/custom_r.zip ~/SageMaker/envs/
    aws s3 cp ~/SageMaker/custom_r.zip s3://[YOUR BUCKET]/

    通过生命周期配置,使用自定义R环境创建新实例

    要创建新实例,并在该实例中使用已有的自定义环境,需要将.zip环境从Amazon S3引入当前实例。我们可以使用生命周期配置脚本在Amazon SageMaker控制台上自动执行此项操作。该脚本将.zip文件从Amazon S3下载至实例EBS上的/SageMaker/文件夹当中、解压该文件、重新创建/envs/文件夹,而后删除冗余文件夹。

    • 在Amazon SageMaker控制台的Notebook之下,选择Lifecycle configurations。
    • 选择Create Configuration。
    • 将其命名为Custom-R-Env。
    • Create notebook选项卡中,输入以下脚本。
    ## On-Create: Bringing custom environment from S3 to SageMaker instance
    ## NOTE: Your SageMaker IAM role should have access to this bucket
    #!/bin/bash 
    sudo -u ec2-user -i <<'EOF'
    aws s3 cp s3://[YOUR BUCKET]/custom_r.zip ~/SageMaker/
    unzip ~/SageMaker/custom_r.zip -d ~/SageMaker/
    mv ~/SageMaker/home/ec2-user/SageMaker/envs/ ~/SageMaker/envs
    rm -rf ~/SageMaker/home/
    rm ~/SageMaker/custom_r.zip
    EOF

    image

    • 点击Create Configuration。

    通过生命周期配置,使用自定义R环境启动实例

    无论是在同一实例中创建自定义R环境并将其克隆至./envs/文件夹,还是在创建实例时从Amazon S3上下载.zip文件,此步骤的具体操作都完全相同。

    此脚本将在./evns/文件夹(其中包含自定义R环境)与Anaconda Custom-R-Env环境之间创建一个链接,从而在Amazon SageMaker内核中列出该环境。

    • 在Amazon SageMaker控制台的Notebook下,选择Lifecycle configurations。
    • 选择Create Configuration。
    • 将其命名为Custom-R-Env(如果已经在之前的步骤中创建了该配置,则可直接从列表中选定配置并选择Edit)。
    • 在Start notebook选项卡上,输入以下脚本:
    ## On-Start: After you set up the environment in the instance
    ## then you can have this life-cycle config to link the custom env with kernel
    #!/bin/bash 
    sudo -u ec2-user -i <<'EOF' 
    ln -s /home/ec2-user/SageMaker/envs/custom-r /home/ec2-user/anaconda3/envs/custom-r
    EOF
    echo "Restarting the Jupyter server..."
    restart jupyter-server

    image

    • 点击Create Configuration(如果要编辑现有配置,则点击Update)。

    将生命周期配置指定给Amazon SageMaker实例

    在创建Notebook实例时,我们可以为其指定生命周期配置。关于更多详细信息,请参阅使用生命周期配置脚本定制Notebook实例

    要使用生命周期配置(Custom-R-Env)创建一个Notebook,需要在Additional Configuration部分将该脚本指定给当前Notebook。其他操作步骤与创建常规Amazon SageMaker实例相同。

    image

    使用自定义R环境

    在打开创建该自定义环境的现有实例时,我们会看到各相关文件、代码以及/envs/文件夹已经存在。

    但如果创建了一个新实例,并使用生命周期脚本从Amazon S3处提取该环境,则需要完成以下操作步骤:

    • 当实例状态显示为In Service时,打开Jupyter,可以看到Amazon SageMaker文件中存在一个/envs/文件夹,这就是我们的自定义环境。
    • 在New下拉菜单当中,选择conda_r_custom-r。

    image

    现在,我们已经拥有一个包含自定义R环境的Notebook。在此Notebook中,我们会在Jupyter环境的右上角看到R徽标,这代表当前内核为R内核,内核名称应为conda_r_custom-r。要测试这套环境,请导入自定义环境中包含的某一套库(例如rJava)。

    image

    现在,我们的自定义R环境已经启动并在实例中正常运行,可以使用reticulate软件包在R中进行编程了。

    结论

    本文引导大家为Amazon SageMaker notebook实例创建自定义持久R环境。关于Amazon SageMaker上的R notebook,请参阅Amazon SageMaker示例GitHub repo。关于创建基于R内核的Amazon SageMaker notebook实例的更多详细信息,请参考在Amazon SageMaker notebook实例上使用R代码博文。关于如何通过R使用Amazon SageMaker更多功能的详细信息,请访问Amazon SageMaker R用户指南。此外,大家可以参考AWS机器学习博客获取关于Amazon SageMaker的更多专业扩展资源。

    image

    查看原文

    赞 8 收藏 0 评论 0

    AWS_AI开发者社区 发布了文章 · 2020-12-25

    海外客户发来的文档到底在说啥?不懂就问,Amazon Translate告诉你答案

    image

    又到了年底节假日扎堆的时节,首先祝大家各种节日快乐~

    很多业务出海的企业日常可能会遇到一个比较麻烦的问题:和海外客户或合作伙伴交流,总会因为语言的隔阂造成很多不便。虽然网上有很多免费的文本甚至Office文档翻译服务,但平时随便用用也就罢了,真要涉及工作中一些机密文档,谁能放心让这些外部服务来翻译!请专职或兼职翻译吧,虽然效果很好,但速度往往很慢,还得公司「不差钱」才行……

    别头疼了,你应该知道,AWS云就提供了一个名为Amazon Translate的机器翻译服务,支持全球各大主要语言的双向互译,效果也许不如人工翻译那么好,但胜在速度够快,如果只是希望了解外文资料的大致意思,用这样的服务已经足矣满足大部分场景的需求。

    除了把一种语言的文字内容复制粘贴到Amazon Translate中并翻译为指定的语言外,最近更新之后的Amazon Translate也开始支持对DOCX、PPTX以及XLSX格式的Office Open XML文档进行翻译。作为一种全托管神经机器翻译服务,Amazon Translate能够高质量地以合理价格提供多达55种语言翻译服务。关于所支持语言的完整列表,请参见受支持的语言与语言代码。支持批量翻译的AWS区域,同时也支持文档翻译。请参阅异步批处理查看更多信息。

    在本文中,我们将逐步了解如何在AWS管理控制台上翻译文档。大家也可以通过AWS命令行界面(AWS CLI)或者AWS SDK访问Amazon Translate BatchTranslation API进行文档翻译。

    解决方案概述

    本文将引导大家完成以下步骤:

    创建IAM角色以访问S3存储桶

    在本文中,我们创建一个能够访问账户中所有S3存储桶的角色,用于翻译文档、电子表格以及演示文稿。我们将该角色提供给Amazon Translate,确保其能够访问S3输入与输出位置。关于更多信息,请参阅AWS身份与访问管理说明文档

    • 登录至个人AWS账户。
    • 在IAM控制台的Access management之下,选择Roles。
    • 选择Create role。

    image

    • 选择Another AWS account。
    • 在Account ID部分,输入ID。

    image

    • 前往下一页面。
    • 在Filter policies部分,搜索并添加AmazonS3FullAccess策略。

    image

    • 前往下一页面。
    • 为角色输入一个名称,例如TranslateBatchAPI。
    • 查看刚刚创建完成的角色。
    • 在Trust relationships选项卡中,选择Edit trust relationship。

    image

    • 输入以下服务主体:
    "Service": [
    "translate.aws.internal",
    "translate.amazonaws.com"
    ],

    具体示例,详见以下截屏:
    image

    对文档排序

    Amazon Translate批量翻译适用于存储在S3存储桶内文件夹中的各类文档。如果直接将文件保存在S3存储桶的根目录中,则批量翻译将无法工作。批量翻译也不支持翻译嵌套文件。因此,我们首先需要将待翻译文档上传至S3存储桶的一个文件夹内,而后对文档进行排序,使当前文件夹内只包含相同类型(DOCX、PPTX、XLSX)相同语言的文件。如果需要翻译多个包含不同文件类型的文档,请对文档进行排序,保证每个Amazon S3前缀只有相同语言的同一种文档格式。

    • 在Amazon S3控制台上,选择Create bucket。
    • 执行下列步骤创建存储桶。

    image

    在本文中,我们创建两个存储桶,分别为:input-translate-bucket与output-translate-bucket。
    image

    这些存储桶中分别包含以下文件类型的文件夹:

    • docx
    • pptx
    • xlsx

    image

    执行批量翻译

    要执行批量翻译,请完成以下步骤:

    image

    在本文中,我们翻译DOCX格式的文档。

    • 在Name部分,输入BatchTranslation。
    • 在Source language部分,选择En。
    • 在Target language部分,选择Es。
    • 在Input S3 location部分,输入s3://input-translate-bucket/docx/。
    • 在File format部分,选择docx。
    • 在Output S3 location部分,输入s3://output-translate-bucket/。
    • 在Access permissions部分,选择Use an existing IAM role。
    • 在IAM role部分,输入TranslateBatchAPI。

    由于这里执行的是异步翻译,因此实际翻译操作要等待机器资源分配完成之后才会正式开始,此过程最多可能需要15分钟。关于执行批量翻译作业的更多信息,请参阅启动批量翻译作业

    以下截屏是BatchTranslation作业的详细信息。
    image

    在翻译完成之后,我们可以在S3存储桶的文件夹内找到输出结果,参见以下截屏。
    image

    总结

    在本文中,我们探讨了如何通过异步批量翻译对DOCX格式的文档进行翻译。关于翻译电子表格与演示文稿,其过程与翻译DOCX文件相同。AWS提供的翻译服务Amazon Translate使用简单,且只需要根据翻译的每种格式的文档中的字符数(包含空格)进行付费。我们现在可以在支持批量翻译的所有区域内翻译Office文档。如果还不熟悉Amazon Translate,不妨先从Free Tier免费套餐起步。此套餐将从提交的第一项翻译请求开始,在随后的12个月内每月提供2百万个字符的免费翻译配额。

    image

    查看原文

    赞 5 收藏 0 评论 0

    认证与成就

    • SegmentFault 讲师
    • 获得 1209 次点赞
    • 获得 7 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 7 枚铜徽章

    擅长技能
    编辑

    开源项目 & 著作
    编辑

    (??? )
    暂时没有

    注册于 2020-04-24
    个人主页被 13.7k 人浏览

    bt365体育投注