AWS 认证机器学习—专业
关于如何准备和通过考试的提示和建议
穆罕默德·阿里·皮克在 Unsplash 上拍摄的照片
相信很多人都听说过 AWS 的这个认证。我了解到 AWS 认证机器学习—专业 是一个艰难的认证考试,我非常同意。
我上周 10 月 1 日参加了这次考试。在阅读和回答前几个考试问题时,我立即意识到这并不容易通过。但是不要沮丧,因为如果你付出努力并做好充分的准备,你一定能做到。相信自己,努力是有回报的。
经历并通过这次考试对我来说是一次伟大的学习之旅。
我很高兴我设法达到了这个里程碑。既满足又有收获。
关于考试
“AWS 认证机器学习-专业认证面向从事开发或数据科学工作的个人。它验证候选人针对给定业务问题设计、实施、部署和维护机器学习(ML)解决方案的能力”——来源: AWS
考试时间为 3 小时。总共有 65 个问题,这意味着您平均有大约 2.7 分钟的时间来回答每个问题。你会得到多项选择或多项回答问题。
这 65 个问题中,有 15 个是未评分的问题。AWS 使用它们来评估候选人的表现,以及将来是否将它们作为评分问题。可惜的是,考试上不公开。
结果以 100 到 1,000 的标度分数报告。最低及格分数是 750 分。
这项考试的费用是 300 美元。如果您之前通过了 AWS 认证考试,您可以从您的 AWS 认证帐户获得 50%的折扣券。
测试域
有 4 个领域的候选人将被测试。下图总结了这些领域及其权重。
AWS 认证机器学习的测试领域-专业。作者图片
对于每个领域的完整细节和范围,您可以从 AWS 下载的考试指南中阅读它们。下面是一个简短的总结:
- 数据工程 —了解存储介质(S3、EFS 等)、数据摄取(Kinesis 等)、数据转换(ETL、Glue、EMR、AWS Batch、Lambda)
- 探索性数据分析—涵盖数据准备(地面实况、牧马人等)、特征提取和工程(OHE、PCA 等)、分析和可视化(相关性、残差图等)
- 建模 —了解与监督/非监督学习、迁移学习、强化学习、类型(分类、回归、预测、聚类、推荐)、优化、超参数、正则化(L1/L2、辍学)、模型评估(欠拟合/过拟合)、度量(准确度、精确度、召回率、RMSE、F1 评分、AUC-ROC)、混淆矩阵等相关的各种算法。
- 机器学习实现&操作 —监控和日志(CloudTrail、CloudWatch)、ML & AI 服务(Lex、understand、Transcribe、Rekognition、Textract 等)、IAM、安全、带 API 网关的端点、批量转换、A/B 测试、BYOC、物联网 Greengrass、SageMaker Neo、增强 AI 等。
学习选项
考试前你可以选择很多学习方法。我已经在下图中列出了可用的可能性。
AWS 认证机器学习的学习选项-专业。作者图片
根据你的经验和知识水平,你可能需要也可能不需要全部。我将在下一节解释每一个问题。
📑 1.AWS 示例问题
首先,我会推荐你从 AWS 下载样题。它由 10 个带答案的问题组成。还提供了每个答案背后的解释和理由。
试着不看答案回答这些问题。然后,对照提供的答案检查您的答案。这会让你感觉到问题的难度。它还能让你大致判断自己的状况,你是否做得很好,或者需要进一步的培训和学习。
💡 2.机器学习认证课程
如果你觉得你需要更多的培训和学习,你可以在 Udemy,Whizlabs,A Cloud Guru 等网站上找到几个 AWS 机器学习认证课程。
我参加了钱德拉·林根的 Udemy 课程 AWS 认证机器学习专业(MLS-C01) 。这是一门 AWS SageMaker 实践课程,包括模拟测试。除此之外,它还涵盖了许多基本的机器学习概念和重要的算法。
我对这门课程的质量印象深刻。我特别喜欢展示具体概念或实现的许多动手实验和用例。讲师还积极维护和更新课程材料。我实际上在今年 3 月下旬完成了课程,但我推迟了参加考试的计划。当我在 9 月份再次浏览该课程时,我惊讶地发现增加了新的主题,我发现这些主题都是相关和有用的。
根据学生们的说法,这位老师反应很快,很有帮助。甚至还有有组织的团体直播问答环节。简而言之,这是一门不容错过的精彩课程。
📚 3.AWS 资源和文档
您可以从 AWS 找到许多辅助学习材料和资源。AWS 为其所有服务和产品维护大量文档。我提供以下所有主要链接。
AWS 上的机器学习
这是 AWS 机器学习的主页,它包含了 AWS 人工智能服务、ML 服务、框架、基础设施、用例解决方案、博客、学习资源、客户故事等的所有链接。
AWS 文档
在这里,您可以找到用户指南、开发人员指南、API 参考、教程和项目、SDK 和工具包。
亚马逊 SageMaker 开发者指南特别有用。它包含关于 SageMaker 特性的非常详细的信息和教程,以及所有内置的算法。
AWS 白皮书
亚马逊 SageMaker 技术深潜系列
这个亚马逊 SageMaker 技术深潜系列在 YouTube 上有 16 个视频。了解如何使用 Amazon SageMaker 构建、培训、调整、部署和优化模型。
AWS 数字培训
通过 AWS 数字培训在自己的时间和计划内学习。从学习库中浏览并选择相关课程。
AWS 产品&技术常见问题解答
FAQ 是浏览特定产品或服务要点和功能的另一个很好的资源。
仅列举几个:亚马逊 SageMaker FAQ 、亚马逊 S3 FAQ 、 AWS Glue FAQ 、亚马逊 Kinesis 数据流 FAQ 、亚马逊 Kinesis 数据消防软管 FAQ 、 AWS 湖泊形成 FAQ 、亚马逊领悟 FAQ 、亚马逊 Rekognition FAQ 等。
💻 4.实践实验和练习
如果您没有使用 AWS 的经验,请尝试在 AWS 中进行动手实验,例如数据准备和转换,以及构建、调优和部署模型。
这一步是可选的,但它有一个额外的好处,可以帮助您熟悉 AWS 服务和产品,以及它们如何相互集成。
注册一个 AWS 帐户,你将能够探索、体验和开始构建 AWS。新账户持有人可以享受免费等级下的大部分产品和服务。查看 AWS 的免费等级产品,它们可以归入以下三个类别之一:短期免费试用、 12 个月免费或永远免费。
下面提供了示例笔记本、SDK 和 AWS CLI 的链接:
- 亚马逊 SageMaker 示例笔记本
- 亚马逊 SageMaker Python SDK 是一个开源库,用于在亚马逊 SageMaker 上训练和部署机器学习模型。
- Boto3 是用于 Python 的 AWS SDK,您可以使用它来创建、配置和管理 AWS 服务。
- AWS 命令行界面 (AWS CLI)是一个统一的工具,为与亚马逊 Web 服务的所有部分进行交互提供了一致的界面。
如果你感兴趣,你可以点击下面的链接来阅读我写的关于如何用 Amazon SageMaker 因子分解机构建和训练推荐引擎的文章。
https://pub.towardsai.net/building-a-product-recommendation-engine-with-aws-sagemaker-321a0e7c7f7b
📝记下自己的笔记
由于这次考试的覆盖范围非常广,我建议你在浏览学习资料的时候自己记笔记。
作者图片
开始时你可能觉得没有必要。随着你的进步,深入研究章节,查阅成堆的文献和阅读材料,你很快就会发现自己被信息过载所淹没,无法记住你之前学过的特征或东西。
如果你正在上课,它们通常会附带 PowerPoint 幻灯片。但是,自己做笔记会帮助你更好地记住对你来说重要的关键点和概念,并在期末复习时快速回忆起相关的想法和观点。
5.最后的准备
在你完成所有必要的主题和材料后,这个 考试准备:AWS 认证的机器学习-专业 课程是一个必须要做的。这是一门 4.5 小时的免费在线电子学习课程。你将学到宝贵的关键应试策略和翻译试题的技巧。
当面对你没有信心的问题时,你需要知道如何解决它们。你将学会识别重要的关键词,消除不相关或干扰选项,缩小到可能的答案选择。
因为大多数问题都是基于场景的,所以你也需要学会注意问题中指定的要求。例如,您可能会被要求"*选择最具成本效益的解决方案"*或"选择管理和开销最小的 解决方案"。
本课程将贯穿 4 个高级考试领域。对于每个领域,您将回答几个测验问题。
最后你还会发现另外 35 个学习问题。这些问题模拟了实际考试中出现的问题类型。但是,我还是觉得实际考试题的难度水平更高。但我也收到了一些简单的问题。
在最后阶段,尽可能多地做模拟测试或模拟问题。你需要这样做,以便熟悉问题的风格,并在规定的时间内自如地回答问题。
即使你觉得你已经准备好了,也要这样做。通常你会惊讶地发现,仍然有一两个问题需要你进一步研究才能找到答案!
同样,你可以在像 Udemy 这样的平台上找到练习测试,或者参加 AWS 的官方练习考试,费用是 40 美元。如果您之前已经通过了 AWS 认证考试,您可以利用您的 AWS 认证帐户中的练习考试优惠券免费参加 AWS 练习考试。
更新:AWS 取消了免费实践考试的福利。2021 年 11 月 19 日起,每个人都可以在 上免费访问 AWS 认证官方练习题集【AWS 技能构建器 】。如果您获得了免费的模拟考试作为考试福利,您仍然可以在 2022 年 6 月 30 日之前通过 PSI 申请、激活和使用模拟考试。
给你一点奖励,考试中出现的题目。这些是我能回忆起的一些零碎的东西,但并不详尽。作者图片
摘要
在这篇文章中,我简要介绍了 AWS 认证机器学习专业的考试形式和考试领域。
我介绍了在参加考试之前可以选择的各种学习方法。我还提供了各种 AWS 资源和文档的链接摘要,可以帮助您准备考试。
我建议你在浏览学习资料的时候自己做笔记。当你做最后几轮复习时,这些笔记会很方便。
为了做好最后准备,请参加 AWS 考试准备课程。学习应试策略至关重要。尽可能多地尝试模拟测试。
祝你学习愉快,考试顺利!
如果你喜欢我的帖子,别忘了点击 关注 和 订阅 获取邮件通知。
可选地,你也可以 注册 成为媒体会员,以获得媒体上每个故事的全部访问权限。
有兴趣了解变形金刚吗?我有以下的帖子给你。
AWS EC2 实例类型说明
了解 Amazon Web Services 上不同类型的 EC2 实例
Marcus Dall Col 在 Unsplash 上的照片
介绍
亚马逊弹性计算云(EC2)是一种提供云计算能力的 web 服务,是亚马逊 Web 服务中最受欢迎的产品之一。该服务允许用户租用虚拟机,在虚拟驱动器上存储数据,在不同的机器上分配负载,以及扩展服务。
AWS 提供了不同类型的 EC2 实例类型,这些实例类型经过了优化,以适应几种不同的用例。每种实例类型都提供了不同的内存、CPU、存储和网络组合,可以在不同的环境中使用,以适应特定的使用情形。
在今天的文章中,我们将讨论四种最基本的 EC2 实例类型,即通用、计算优化、内存优化和存储优化。此外,我们将给出每个实例类型最适合的几个示例用例。
通用
通用实例提供了计算、内存和网络资源的平衡,并且大多适用于各种不同的工作负载,例如代码库或 web 服务器。
计算优化
计算优化实例用于需要高性能处理能力的计算密集型任务。一些可能受益于计算优化实例的用例包括
- 科学建模和机器学习工作流
- 高性能计算(HPC)
- 批处理工作负载
- 高性能 web 服务器
内存优化
内存优化实例适用于需要快速性能的工作负载,以便处理内存中的大型数据集。受益于内存优化实例的一些用例包括:
- 关系和非关系数据库
- 内存数据库
- 对大量数据执行实时处理的任务
存储优化
最后,存储优化实例专为存储密集型任务而设计,这些任务需要对本地存储上的大型数据集进行高顺序读写访问。这些实例经过优化,能够为运行于其上的应用提供低延迟操作。受益于存储优化实例的几个使用案例是
- 关系数据库和 NoSQL 数据库
- 数据仓库应用
- 分布式文件系统
- 内存数据库的缓存
最后的想法
在今天的文章中,我们讨论了 Amazon Web Services 中提供的不同 EC2 实例类型。关于具体实例的更多细节,您可以参考 AWS 产品的相关章节。
EC2 有大量不同的 EC2 实例,有时在亚马逊网站上比较它们可能会很耗时。以下网站为比较 EC2 实例指标和定价提供了一种非常直观的方式,请务必查看。
成为会员 阅读媒介上的每一个故事。你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。
https://gmyrianthous.medium.com/membership
你可能也会喜欢
面向机器学习工程师的 AWS
探索 AWS 提供的一些关键服务,以解决数据驱动的挑战。
亚历克斯·库利科夫在 Unsplash 上的照片
介绍
随着越来越多的公司决定将内部数据中心转移到云提供商,过去几年中技术的一个关键趋势是对云计算的需求不断增长。2020 年,云计算市场规模相当于 3714 亿美元,预计到 2025 年将达到约 8321 亿美元[1]。截至 2021 年,按市场份额计算,AWS 目前是全球领先的云提供商[2]。
我最近完成了 AWS 机器学习专业考试(图 1),因此,我决定总结一个数据科学家在从事 AWS 项目时可能会用到的关键服务。
图 1: AWS ML 考试完成推文(图片由作者提供)。
如果您有兴趣了解关于云计算基础的更多信息,可以在我之前的文章“数据科学家的云基础”中找到更多信息。
AWS 服务
AWS 提供了 3 个不同的抽象级别,您可以使用它们来创建机器学习解决方案:人工智能(AI)服务、ML 服务、ML 框架和基础设施。
人工智能服务
在这个层面上,我们可以找到所有专注于易用性和快速上市的 AWS 人工智能服务。这些服务完全由 AWS 管理,只需对已经由 AWS 预训练的高性能模型进行 API 调用,就可以为您的产品添加机器学习功能。通过这种方式,任何人都可以利用人工智能服务,即使没有任何 ML 方面的经验。人工智能服务的一些例子是:
- **Amazon understand:**是一种自然语言处理(NLP)服务,旨在分析大量非结构化文本数据(例如,识别语言、文本中的关键事实、整体情感等。)
- Amazon Polly: 是一个支持深度学习的文本到语音服务,可用于创建基于语音的应用程序。
- **Amazon transcripte:**是语音转文本服务,用于将音频文件转换为文本文件。这种服务能够为批处理和实时流数据提供可靠的性能。
- **亚马逊翻译:**是基于深度学习的语言翻译服务。
- Amazon Rekognition: 是一项旨在从图像和视频中获得洞察力的服务(例如,对象/人物检测、内容审核等)。).
- Amazon Personalize: 是一个推荐系统,旨在根据用户交互轻松提供实时产品排名、定制营销和推荐。
下面是一个简单的例子,展示了开始使用 Amazon Rekognition 是多么容易(图 2)。
图 2:亚马逊 Rekognition 演示(图片由作者提供)。
ML 服务
ML Services 专注于为数据科学家和研究人员提供托管资源和服务,以便他们能够创建和部署机器学习模型,而不必花费太多时间来建立支持他们模型的架构。ML 服务的一些例子是:
- 亚马逊 SageMaker: 是一个完全托管的服务,旨在覆盖整个机器学习工作流程,从数据准备到部署和监控(图 3)。Amazon Sagemaker 中一些最有趣的选项有: Data Wrangler (一个基于 GUI 的数据准备工具),一个内置的功能库, Autopilot (AWS 自动 ML 服务), Pipelines (用于编排自动化工作流)等。如果您有兴趣了解有关 Sagemaker 及其功能的更多信息,请点击链接。
- **亚马逊 SageMaker 地面真相:**是一项服务,旨在为机器学习任务创建数据集标签。使用这项服务,可以选择人工智能驱动的自动标签工具,或者将您的数据发送给人工劳动力进行人工标签。此外,还可以让服务自动标记它具有高可信度的实例,并将剩余的实例发送给人工(从而节省时间和成本)。目前,Ground Truth 能够支持不同类型的数据,如文本、图像和视频。
- 亚马逊 SageMaker Neo: 一旦经过训练,就可以在任何地方(在云端或物联网边缘设备上)部署机器学习模型。SageMaker Neo 通过采用在任何主要的 ML 框架(如 Keras、PyTorch、、ONNX )中训练的模型,然后将其转换为优化的二进制表示,从而减少用于对模型进行推理的内存量,从而使这一点成为可能。
- **亚马逊增强人工智能:**是一项服务,旨在创建生产 ML 模型,使人类保持在循环中。对于一些应用,如金融或医学,ML 模型做出的预测可能非常重要,并具有长期的影响。使用增强的人工智能,我们可以创建工作流,使人类有可能检查模型预测,并在必要时改变它们,以便向模型提供反馈(用于潜在的重新训练),同时提高性能。
图 3:亚马逊 Sagemaker 仪表盘(图片由作者提供)。
ML 框架和基础设施
该级别旨在使机器学习专家能够使用传统的开源框架(如 PyTorch、TensorFlow 和 AWS 上的 Apache MXNet)创建他们的模型。AWS 提供了不同的机器映像,旨在运行高性能的机器学习工作流,如深度学习 AMI 和深度学习容器(它们都带有已经安装的不同 ML 框架)。这样,ML 从业者就不必再担心与库依赖和有限计算能力的冲突了。
结论
总体而言,AWS 提供了一套令人印象深刻的服务,可用于在分析生命周期的任何阶段使用数据(例如,数据接收、数据存储、数据处理、数据分析等)。如果你有兴趣了解更多关于其他人工智能云提供商服务的信息,比如微软 Azure,更多信息可以在我之前的文章“人工智能驱动的微软工具简介”中找到。
联系人
如果你想了解我最新的文章和项目,请在 Medium 上关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:
文献学
[2] Statista,亚马逊引领着价值 1500 亿美元的云市场。访问:https://www . statista . com/chart/18819/world wide-market-share-of-leading-cloud-infra structure-service-providers/
AWS Lambda 是 SQS 和 Kinesis 之间的纽带
使用 Lambda 作为桥梁,使数据从帐户 X 中的 SQS 队列流向帐户 Y 中的 Kinesis 数据流
让我们看一下这里使用的不同的 AWS 服务。
AWS 简单队列服务 : 简单队列服务(SQS)是一个托管的分布式队列服务,允许在应用程序或服务之间发送和接收消息[并可选地持久化]。
AWS Kinesis 数据流 : AWS 以 Kinesis 数据流的形式提供数据流服务,可用于实时收集数据并提供给下游消费者进行进一步处理。
AWS Lambda**😗*Lambda 是一种无服务器计算服务,可用于执行一段代码,该代码在其他 AWS 服务的指定触发下处理数据。
AWS 身份&访问管理 : 身份&访问管理(IAM)服务使用户能够根据组或用户或角色以及附加到它们的策略使用权限来访问各种 AWS 服务。
问题陈述
在最近的一个项目中,我正在开发一个能够产生用户行为事件的产品,比如页面访问、点击流、播放的录音等。为了获取这些数据进行分析,我们使用特定的 API 订阅了相应的事件,这些 API 将这些事件发送到它在 AWS 服务帐户 X 中创建的相应的 SQS 队列,该帐户的 id 为 000000000000。这里的问题是让数据流向我们团队可以访问的 id 为 1111111111111 的帐户 Y。
我们怎样才能越过接收存在于另一个账户中的数据的障碍呢?
解决方案
首先,让我们看一下解决方案架构。
解决方案架构
本质上,需要在帐户 Y 中创建一个交叉帐户角色,并附加一组策略。角色为crossaccount_sqs_lambda_role
的 sqs_to_kinesis lambda 应该能够轮询(读取)和删除帐户 x 中 sqs 队列的消息。此外,该角色应该能够写入帐户 y 中的 kinesis 数据流
第一步:创建跨账户角色,附加需要的策略
在账户 Y 中,创建了一个 IAM 角色,名为“crossaccount_sqs_lambda_role”,我们用 ARN arn:aws:iam::111111111111:role/crossaccount_sqs_lambda_role
来说吧。该角色附加了一个自定义策略:
- *CustomLambdaAccess(内联策略):*该策略是 AWSLambdaFullAccess 和 AWSLambdaSQSQueueExecution 角色的变体的组合。而且,该策略包括了 Kinesis 定义的所有可以在所需的 Kinesis 流上执行的动作(这里是 PageVisitEventStream&clicked eventstream)。
**注意:**您可以在资源字段下添加所需的流 arn。此外,如果使用的 Lambda 位于 VPC 中,则必须提供 EC2 网络接口权限。
步骤 2:向 SQS 队列添加权限
假设 PageVisitEvent 队列 URL 为https://sqs.us-east-1.amazonaws.com/000000000000/PageVisitEventQueue
,ClickedEvent 队列 URL 为https://sqs.us-east-1.amazonaws.com/000000000000/ClickedEventQueue
。
具有跨帐户角色的服务应该能够执行ReceiveMessage
、DeleteMessage
和GetQueueAttributes
动作,因此,权限应该被添加到指定主体(这里是帐户 Y 的帐户 id)的队列中。
在账户 X 中,
- 在 AWS CLI 上执行以下命令:
$ aws sqs add-permission --queue-url https://sqs.us-east-1.amazonaws.com/000000000000/PageVisitEventQueue --label AllowedSQSPermissions --aws-account-ids "111111111111" --actions ReceiveMessage DeleteMessage GetQueueAttributes$ aws sqs add-permission --queue-url https://sqs.us-east-1.amazonaws.com/000000000000/ClickedEventQueue --label AllowedSQSPermissions --aws-account-ids "111111111111" --actions ReceiveMessage DeleteMessage GetQueueAttributes
https://docs.aws.amazon.com/cli/latest/reference/sqs/add-permission.html
- 现在,在 AWS 控制台中,打开 PageVisitEvent SQS 队列。转到 Permissions 选项卡并编辑策略,以便我们创建的特定 IAM 角色可以访问队列,而不是整个帐户,即将主体从
arn:aws:iam::111111111111:root
更改为arn:aws:iam::111111111111:role/crossaccount_sqs_lambda_role
。
访问策略的 YAML 应该如下所示:
步骤 3:创建运动流
在账户 Y 中,创建 Kinesis 数据流,您将能够从账户 x 中各自的 SQS 队列映射到这些数据流
在 AWS CLI 上执行以下命令:
$ aws kinesis create-stream --stream-name PageVisitEventStream --shard-count 1$ aws kinesis create-stream --stream-name ClickedEventStream --shard-count 1
类似地,可以根据您的要求创建其他流。
https://docs.aws.amazon.com/cli/latest/reference/kinesis/create-stream.html
除了这些流之外,还要创建一个 DLQ 流(在步骤 4 中提供了理由):
$ aws kinesis create-stream --stream-name DLQStream --shard-count 1
步骤 4:创建和部署 Lambda 函数
首先,在您的本地系统中,创建一个名为sqs_to_kinesis_mapping.json
的 JSON 文件,其中 SQS 队列的 ARN 将被映射到帐户 y 中的 Kinesis 流名称。将来,可能会有许多这样的事件被摄取,因此将它分离到一个配置文件中是一个更好的选择。
接下来,创建一个名为lambda_function.py
的 python 文件,内容如下:
让我解释一下代码中发生了什么。
首先,读取包含 SQS 队列到 Kinesis 流映射的 JSON 文件。接下来,为每个 SQS 队列 ARN 创建一个字典kinesis_records_all
,该包括一个Records
关键字,该关键字包含将被转储到相应的StreamName
中的字典列表。从event
字典中Records
键的每个记录中,提取所需的信息,这些信息是要推送到 Kinesis 流的实际数据。
每个 SQS 队列都可以配置一个死信队列(DLQ ),它本身就是一个接收在处理时导致异常/错误的消息的队列。不是维护必须在账户 X 中创建的单独的 DLQ,而是将所有不一致的消息作为一个整体来消费,并将它们推送到账户 y 中的动态流 DLQStream。这样做是为了避免关于维护来自账户 X 的 DLQ 的额外的复杂性层。可以在 DLQStream 上设置一个 CloudWatch 警报(请参考解决方案架构图),如果 GetRecords。记录度量值增加到某个阈值以上。此外,DLQStream 中的记录可以通过 Kinesis Firehose/Lambda/Spark 结构化流应用程序转储到 S3,以发现消息未在 Lambda 中得到处理的原因。这也确保了记录出现在 DLQStream 中的唯一原因是 Lambda 捕获的来自源(即 SQS 队列)的记录的格式不同于在其中执行的数据提取过程。
接下来,使用以下命令压缩这两个文件以创建一个 sqs_to_kinesis.zip 文件:
$ zip sqs_to_kinesis.zip lambda_function.py sqs_to_kinesis_mapping.json
在帐户 Y 中创建 Lambda 并部署它。
$ aws lambda create-function --function-name sqs_to_kinesis --zip-file fileb://sqs_to_kinesis.zip --handler lambda_function.lambda_handler --runtime python3.8 --role arn:aws:iam::111111111111:role/crossaccount_sqs_lambda_role
步骤 5:向 Lambda 添加触发器
当消息在源 SQS 队列中可用时,必须调用 Lambda 代码。为此,必须在 SQS 队列和 sqs_to_kinesis lambda 之间创建事件源映射。为此,在账户 Y 中的*,执行以下命令:*
*$ aws lambda create-event-source-mapping --event-source-arn arn:aws:sqs:us-east-1:000000000000:PageVisitEventQueue --function-name arn:aws:lambda:us-east-1:111111111111:function:sqs_to_kinesis$ aws lambda create-event-source-mapping --event-source-arn arn:aws:sqs:us-east-1:000000000000:ClickedEventQueue --function-name arn:aws:lambda:us-east-1:111111111111:function:sqs_to_kinesis*
*https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html
这将使 Lambda 函数能够轮询任何消息的 SQS 队列。一旦消息存在于队列中,lambda 就会对其进行处理,并根据代码是否能够成功提取所需的数据将消息发送到相应的流,然后从相应的 SQS 队列中将其删除。
步骤 6:在 CloudWatch 中为 Lambda 设置日志保留期
由于日志是在 Lambda 中打印的,因此必须为日志组设置一个保留期,以便在一段特定的时间后,将早于指定保留期的日志丢弃。这避免了日志占用大量的存储空间,尤其是当 Lambda 处理的事件数量很大时。
为此,在帐户 Y 中执行此命令 :
$ aws logs put-retention-policy --log-group-name /aws/lambda/sqs_to_kinesis --retention-in-days 7
或者,
- 转到帐户 Y 的 AWS 控制台
- 打开云观察
- 在导航窗格中选择日志组
- 搜索/aws/lambda/sqs_to_kinesis 日志组并单击它
- 转到操作下拉菜单→编辑保留设置。将保留期设置为 7 天(或根据需要)。
步骤 7:在 DLQStream 的 GetRecords 上添加 CloudWatch Alarm。记录指标
为了获得关于出现在 DLQStream 中的记录的通知,可以在 GetRecords 上创建一个 CloudWatch 警报。记录指标,每当最小(或根据您的要求的任何其他统计)记录数超过给定时间段的阈值时,将发送电子邮件。您可以转到 AWS 控制台,按如下方式进行设置。
CloudWatch 警报设置
接下来,您可以配置 SNS,以便在指标值超出给定阈值时接收通知。
[根据您的要求]步骤 8:从 Kinesis 流中消耗数据
有几种方法可以从 Kinesis 流中获取数据,根据您的需求,可以选择其中的任何一种:
- 使用 AWS Lambda 读取记录并转储到 AWS S3
- 使用消防软管将记录直接转储到 S3 自动气象站
- 开发一个 Spark 流应用程序,使记录可以从 Kinesis Stream 实时传输到 datalake。
- 其他方法可以在这里找到:
使用这种架构向前发展
如果将来对相同格式的事件有任何接收请求,可以通过实现以下步骤来使用该体系结构:
- 首先,执行步骤 2,将所需的权限添加到帐户 X 中的 SQS 队列
- 接下来,执行步骤 3,这将在帐户 Y 中创建一个新的 Kinesis 数据流
- 通过添加一个新条目来更新
sqs_to_kinesis_mapping.json
,该条目以 SQS 队列 ARN 为键,以 Kinesis 数据流名称为值。将更改部署到sqs_to_kinesis
lambda。 - 在 SQS 队列和 lambda 之间创建一个事件源映射(步骤 5)
就是这样!*
包装它
通过这篇博客,我们了解了如何在 AWS 上设置 Lambda 函数来获取跨帐户数据,以及各种其他服务,使模型能够轻松机动化。
我希望记录我在这个项目中获得的知识能让你在这种情况下占据优势。
干杯!
AWS Lambda 与雪花的集成
在 lambda 中执行 python 代码作为雪花中的外部函数
最近,我和 Supreeth Chandrashekar 合作了一项任务,我们希望对存储在雪花中的一些数据进行多重推理。我们利用外部函数触发 lambda,lambda 反过来从 AWS Sagemaker 端点(服务于不同的模型)获得推断。在这篇博客中,我们将讨论如何从雪花中调用 lambda。
解决方案概述
作者图片
工艺流程
- 雪花用户承担目标帐户中的角色
- 它使用角色调用 API 网关(API 网关资源策略只允许上述角色调用 POST 方法)
- API 网关将有效负载传递给 lambda
- Lambda 处理数据并将响应返回给 API Gateway
- API 网关向雪花发送回响应
AWS 设置
我的角色将由雪花承担
只需创建一个没有权限的空角色。我们稍后将添加跨帐户信任。
λ函数
创建一个 lambda 函数,它将响应 API 网关。使用下面的代码。这里要注意的重要事情是事件结构和响应结构。
雪花以 list 的形式发送事件,list 以 JSON 格式封装在名为data
的 key 中。它期望响应对象包含一个statusCode
键和一个带有 JSON 值的data
键。
API 网关
使用具有 lambda 代理集成的 POST 方法创建 API 网关。使用我们在上一步中创建的 Lambda ARN。在“方法请求”中添加 IAM 授权。
资源政策
替换以下 JSON 中的相关字段后,为 API 添加相同的资源策略。
最后,在 lambda 控制台中,您应该观察 API 触发的 Lambda 函数。
雪花设置
API 集成
我们在雪花中创建了一个 API 集成。该集成将创建一个用户,并允许该用户承担我们在 AWS 设置步骤 1 中创建的角色。此外,它记录了我们在 API 网关中创建的 API 的执行端点。
外部函数
我们通过使用上一步中创建的集成来创建一个外部函数。使用以下代码进行集成和外部函数创建。
一旦创建了集成。描述集成。您将得到与下图类似的结果。
作者图片
记下describe integration
命令输出的API _ AWS _ IAM _ USER _ ARN&API _ AWS _ EXTERNAL _ ID。在下面的策略中替换它,然后将它作为信任策略添加到开始时创建的“承担角色”中。
为了测试端到端功能,在雪花中运行该函数,您应该会看到 lambda 的响应。
添加从雪花内部执行 python 代码的功能,提供了雪花和云系统之间更好的集成。我们可以插入这些函数,并从雪花内部触发外部流程。
注意:lambda 上有 6MB 有效载荷的限制,所以来自雪花的触发不能太大。
快乐融入!!
AWS re:invent 2021 AI &机器学习发布会:你应该知道的 7 件事
你需要的唯一 re:invent AI/ML 发布摘要
作者插图
这是一年中最美好的时光——对云中的机器学习来说。AWS 本周在 re:invent 2021 上宣布了几项令人兴奋的人工智能和机器学习服务。在这篇文章中,我将为你逐个服务地分解所有的 ML 美味。我将所有有趣的人工智能/人工智能发布归类为 7 种不同的人工智能用例,因此您可以挑选与您的兴趣最相关的部分:
- ML 适合所有人
- ML 培训
- 最大似然推理
- ML 和数据科学工作流
- ML 数据处理和标记
- ML 硬件
- 面向非开发人员的 ML
听起来不错?我们开始吧!
1。每个人的 ML
亚马逊 SageMaker 工作室实验室
什么事?
亚马逊 SageMaker Studio Lab 是一项免费托管的 JupyterLab 服务,在这里您可以运行您的机器学习(ML)项目,而不需要 AWS 帐户、信用卡或云配置技能。你没看错,我说的是免费。如果您是开发人员、数据科学家、学生或初涉 ML 和数据科学的人,您将需要访问 CPU 和 GPU 计算资源。SageMaker Studio Lab 已经为您准备好了,只需创建一个帐户,您就可以访问云中的免费 ML 开发环境。就这么简单。
它是如何工作的?
你可以选择纯 CPU 或 CPU+GPU 后端。如果您选择纯 CPU 后端,您将获得 12 小时的计算时间,这对于 Pandas 的大量数据预处理和 sci-kit learn 或 XGBoost 的经典 ML 算法训练来说已经足够了。对于深度学习训练,选择 GPU 后端获得 4 小时的计算时间,这对于在较小的数据集上训练或微调模型来说足够了。达到开始新会话的时间限制后,您可以立即重新启动 Studio lab 项目。您的数据(包括训练检查点)将在会话之间保持不变。
GPU 支持是由英伟达 T4 GPU,我也会在亚马逊 EC2 G4 实例中找到。作者图片
是给谁的?你应该什么时候使用它?
像许多人一样,我在用学生预算购买的笔记本电脑上训练了我的第一个 ML 模型,并很快意识到我需要访问 GPU 来训练更复杂的深度学习模型。Studio Lab 是任何想要快速、轻松、无痛地访问机器学习计算资源的人。你可以使用 Studio Lab 来完成你的学校作业,参加 Kaggle 竞赛或者做 ML 研究。就我个人而言,我将首先使用 Studio Lab 制作模型原型,然后将其转移到 Amazon SageMaker 来运行更大规模的实验或在更大的数据集上进行训练。
AWS DeepRacer 学生& AWS AI & ML 奖学金项目
这是什么?
本次发布包括两个部分:
- 新的 DeepRacer 学生服务和 DeepRacer 学生联盟竞赛
- 为参加 DeepRacer 学生联盟的学生提供奖学金计划
AWS DeepRacer Student 是一项面向全球 16 岁以上高中和高等教育入学学生的新服务。申请人可以访问 50 小时的 AWS AI/ML 内容,并接受 10 小时的模型培训,以及每月 5 GB 的存储空间,以参加 AWS DeepRacer 学生联盟。
AWS 推出了 AWS AI & ML 奖学金计划,以帮助代表性不足和服务不足的高中和大学学生学习机器学习概念,并为他们在 AI/ML 领域的职业生涯做好准备。AWS AI & ML 奖学金计划每年为 2000 名学生提供 Udacity“用 Python 进行 AI 编程”纳米学位计划的奖学金。完成第一个纳米学位的前 500 名学生将有资格参加专门为 AWS AI & ML 奖学金获得者策划的第二个纳米学位项目。
它是如何工作的?
每个学生都可以注册并参与 AWS DeepRacer 学生计划,开始在排行榜中竞争。不需要 AWS 帐户。参加奖学金计划是可选的。要获得奖学金,您必须成功完成所有 AWS DeepRacer 学生学习模块,并在所有课程测验中取得至少 80%的分数,在学生联盟中驾驶 DeepRacer 赛车达到一定的单圈成绩,并提交一篇论文。奖学金获得者还可以从 Udacity 讲师那里获得长达 85 小时的辅导和指导。前往 http://student.deepracer.com/的开始吧!
是给谁的?
如果你是一名面临经济困难的学生,那么这个项目适合你。如果你是一名 16 岁以上的学生,自认为在技术领域服务不足或代表性不足,目前正在就读高中或全球认可的本科课程。你可能是科技行业中代表性不足的群体的一员,包括女性、残疾人、LGBTQ+人群以及有色人种。
2。ML 培训
亚马逊 SageMaker 培训编译器
是什么?
SageMaker Training 编译器是一款针对机器学习模型的优化编译器,旨在加快训练速度。它通过分析模型的计算图和寻找更好地利用 GPU 资源的机会来加速模型训练。最终结果是,您可以在不对培训脚本进行任何代码更改的情况下获得性能改进。
它是如何工作的?
模型的计算图提供了许多简化的机会。例如,当您在没有训练编译器的 GPU 上训练您的模型时,您的模型的计算图中的操作将作为单独的 GPU 内核函数调用来执行。这增加了每次额外内核调用的函数调用开销。优化编译器可以识别这种低效,因为它可以查看完整的图形,而不是框架解释器会看到的独立函数。然后,编译器可以融合或组合运算符,从而减少 GPU 上的内核函数调用。编译器还可以查看整个图形,以便在内存规划和张量布局转换方面做出更好的决策,从而进一步加快训练速度。
作者图片
是给谁的?你应该什么时候使用它?
如果你正在训练深度学习模型,你将受益于 SageMaker 训练编译器。在发布时支持的模型很少,包括大量的 HuggingFace 模型,并且您可以在不做任何代码更改的情况下获得一些免费的加速。编译模型的想法绝对不是新的,有几个模型编译器用于推理部署,如 SageMaker Neo、TVM 和 NVIDIA TensorRT。这是因为仅针对前向传递执行图形优化相对简单。在训练期间,你有向前传递和向后传递,这使得编译器的工作更加困难。我很高兴在 SageMaker 中看到训练编译器支持,并期待今天在 HuggingFace 模型上使用它,我将密切关注它将来支持的其他模型。
在 re:invent 2021 上还有其他与硬件培训相关的发布,我将在下面一个名为“ML 硬件”的专门章节中进行介绍。现在,让我们继续讨论 ML 推理服务的发布。
3.最大似然推理
亚马逊 SageMaker 无服务器推理[预览]
什么事?
Amazon SageMaker 无服务器推理是一个模型托管功能,允许您部署端点进行推理,根据流量自动启动和扩展计算资源。使用 SageMaker 无服务器推理,您不必管理实例类型,只需为预测请求和处理这些请求所花费的时间付费。
它是如何工作的?
如果您在 AWS 上使用其他无服务器服务,如 Lambda、Fargate、SQS 等,那么您应该可以在使用无服务器推理时获得类似的好处。借助无服务器部署,您无需根据需求和流量供应、管理或扩展 Amazon EC2 实例。SageMaker 无服务器推理将为您完成所有这些工作,使部署和扩展 ML 推理模型变得更加容易。
作者图片
是给谁的?你应该什么时候使用它?
如果您已经在使用 SageMaker 来托管推理端点,那么只需更新您的端点配置,就可以很容易地从实时端点切换到无服务器端点。如果您预计您的流量在本质上是零星的,例如在一天的不同时间请求的数量是可变的,并且您没有严格的响应延迟要求,那么您应该从 SageMaker 无服务器推断开始。如果无服务器推理端点处于空闲状态,它将经历一个冷启动期,因此,如果您有一个延迟关键型应用程序,在任何时间点都不能容忍更低的延迟,您应该切换到实时端点,这些端点由您选择的专用 ml CPU 或 GPU 实例类型支持。对于其他一切,无服务器推理是一个显而易见的选择。
亚马逊 SageMaker 推理推荐器
什么事?
Amazon SageMaker 推理推荐器加快了为您的模型部署找到正确的计算实例类型的过程,以最低的成本为您提供最高的性能。SageMaker 推理推荐器通过自动运行性能基准测试和跨 SageMaker ML 实例调优模型性能来实现实例类型发现过程的自动化。
它是如何工作的?
SageMaker 支持超过 60 种实例类型和数量,选择合适的实例来满足您的部署目标可能会很耗时。您可以使用 SageMaker 推理推荐程序来运行默认的推荐作业,或者在一组选定的实例上指定自定义性能基准,以模拟您的生产部署的性能。您可能有一个目标吞吐量、延迟,并且您可以指定这些以及一个示例负载来运行测试。这个过程通常需要几个小时或更长时间,这取决于模型和自定义选项,结果可以在 SageMaker Studio 中查看,或在 Studio notebook 中使用 Pandas 等流行的库进行分析。
推理推荐器希望您的模型被打包到模型注册中心。通过创建模型包组来注册模型的好处是,您可以包含额外的元数据,例如服务容器、模型域(计算机视觉、NLP 等。)、任务(分类、回归等。)、框架(TensorFlow、Pytorch)、框架版本样本有效载荷等。一旦模型被注册,推理推荐器将处理剩下的。
基准测试完成后,您可以查看结果,并从延迟、吞吐量、成本、计算使用和内存使用等多个方面评估不同端点配置的利弊。
作者图片
是给谁的?你应该什么时候使用它?
如果您目前有生产中的模型,您可能已经手动对多个 CPU 和 GPU 实例大小进行了基准测试,以确定满足您的目标延迟和吞吐量要求的正确实例,并计算每个实例上的部署成本,以选择最符合您预算的性能实例类型。如果这个人是你,那么亚马逊 SageMaker 推理推荐器将通过自动化过程为你节省几天甚至几周的时间。如果这个人不是你,那你也没必要变成那个人。使用亚马逊 SageMaker 推理推荐器,节省自己宝贵的时间。
4.ML 和数据科学工作流
Amazon SageMaker Studio 与 Amazon EMR 的集成
什么事?
Amazon SageMaker Studio 引入了与 Amazon EMR 的深度集成,使您不仅可以查看现有的 EMR 集群,还可以创建、监控和调试运行在 EMR 上的 Spark 作业,而无需离开您的 SageMaker Studio 界面。通过这种集成,您可以在 SageMaker Studio 界面中启动 Amazon EMR 集群,使用 SageMaker spark 库执行数据预处理,然后在 SageMaker 中训练和托管您的模型。在一个 SageMaker Studio 用户界面下,您得到的是端到端的数据预处理到部署工作流。
它是如何工作的?
典型的设置是使用 AWS 服务目录来定义和推出预配置的模板,允许 SageMaker Studio 用户直接从 Studio 创建 EMR 集群。在这个通常由 DevOps 管理员或才华横溢的数据科学家执行的初始设置过程之后,您的 Studio 环境就可以创建 EMR 集群,连接到它,使用 Spark UI 监控和调试 Spark 作业。要运行 Spark 作业,您可以使用 Sparkmagic,它允许您在 Jupyter Notebook 中针对您在 Studio 中创建的远程 EMR 集群运行 Spark 代码。Sparkmagic 还创建了一个自动 SparkContext 和 HiveContext。
作者图片
使用完集群后,您还可以在 Studio 界面中终止它。
是给谁的?你应该什么时候使用它?
如果你是一名数据工程师或数据科学家,使用运行在亚马逊 EMR 上的 Apache Spark、Hive 或 Presto 来做数据准备,并且还需要在亚马逊 SageMaker 中开发模型、训练、调优和部署它们,那么 SageMaker Studio 和亚马逊 EMR 之间的这种集成将使你的生活变得容易得多。我认为这离理想的完全集成的开发环境更近了一步,无论您是执行数据预处理还是模型部署,您都不必离开这个环境。
5.ML 数据标记
亚马逊 SageMaker 地面真相加
是什么?
Amazon SageMaker Ground Truth Plus 是一项数据标注服务,它使用 AWS 管理的工作人员来提供高质量的标注,而无需您构建标注应用程序和管理标注工作人员。启动 Amazon SageMaker Ground Truth Plus 项目将使您与 AWS 团队保持联系,他们将与您一起了解您的用例、标签量和时间线要求。在项目批准时,您的数据集将由训练有素的 AWS 管理的工作人员使用已经可用的 SageMaker Ground Truth 功能进行标记。这意味着您不必与多家贴标供应商合作或在内部建立贴标团队,您可以仅在需要对数据进行贴标时使用 Ground Truth Plus 服务,从而解放您的数据科学家和 ML 专家的时间,让他们专注于模型开发和部署。
它是如何工作的?
作为 SageMaker Ground Truth Plus 的用户,您负责定义您的项目目标并提供数据集,输出是您的 S3 桶中的高质量数据标签,您可以使用 Amazon SageMaker 等服务来构建、训练和部署机器学习(ML)模型。在幕后,SageMaker Ground Truth Plus 结合了 ML 辅助预标记、人工专家标记和 ML 辅助验证人工标签,以检测人工错误和低质量标签。SageMaker Ground Truth Plus 还为您提供了一个了解质量控制数据标签操作的窗口。您可以监控进度,在仪表盘上查看标注指标,并对输出数据集提供反馈。
作者图片
是给谁的?你应该什么时候使用它?
SageMaker Ground Truth Plus 适用于贵组织中负责生产 ML 团队使用的高质量标注数据集的人员。此人是数据领域和业务问题方面的专家,需要一个端到端的标签解决方案。在较小的团队或组织中,这可能是数据科学家,或者在较大的团队或组织中,这可能是专门的数据运营经理。无论您的角色是什么,您都不希望管理一年中不断变化的标签需求的标签工作人员,而是希望及时向您的 AI/ML 团队交付高质量的标签数据。
6.ML 硬件
由 AWS Graviton2 处理器支持的 Amazon EC2 G5g 实例
什么事?
Amazon EC2 G5g 是目前 AWS 上广泛可用的 GPU 实例列表中的最新成员。G5g 是第一个将 NVIDIA GPU 与 AWS Graviton2 CPU 配对的实例。
作者图片
是给谁的?你应该什么时候使用它?
EC2 G5g 实例是一个经济高效的机器学习推理部署选项,是基于英特尔 CPU 的 EC2 G4 和 EC2 G5 的替代方案。NVIDIA 在 AWS Marketplace 上提供深度学习亚马逊机器映像,它预配置了所有必要的 NVIDIA 驱动程序、库和依赖项,以便在 EC2 G5g 上运行支持 Arm 的软件。
亚马逊 EC2 Trn1 实例[预览]
这是什么?
亚马逊 EC2 Trn1 实例由 AWS Trainium 提供支持,这是一款由 AWS 设计的高性能 ML 训练芯片,用于加速训练工作量。Trn1 实例是首批网络吞吐量高达 800 Gbps 的 EC2 实例,是基于 GPU 的 EC2 实例的网络吞吐量的两倍。它们还支持加速器之间的超高速互连,以在云中提供最快的 ML 训练。
是给谁的?你应该什么时候使用它?
EC2 Trn1 基于 AWS Trainium 加速器,这是继 NVIDIA GPUs 和英特尔 Habana Gaudi 之后,AWS 上用于 ML 培训的第三种加速器类型。如果您现在正在使用 GPU,并且正在突破 P4d.24xlarge GPU 实例的极限,那么 Trn1 应该会在它退出预览时引起您的注意。Trn1 也是第二个包含 AWS 设计的芯片的实例类型,第一个是 Inf1 实例,带有为推理而设计的推理加速器。要在 Inf1 上加速您的模型,您需要使用 AWS Neuron SDK,而同一 SDK 也不支持用于训练工作流的 Trn1 实例。
总的来说,我很高兴看到这么多的加速器选择 ML 从业者。当它变得可用时,我很兴奋地测试它,你可以打赌,在它可用后不久,我将为你准备一个深入的博客帖子。
7.面向非开发人员的 ML
亚马逊 SageMaker 画布
什么事?
亚马逊 SageMaker Canvas 提供了一个可视化的点击界面,无需编写任何代码就可以创建机器学习模型并生成预测。它的 UI 为您提供了访问数据集、创建连接、选择目标变量列的选项。然后,它会自动训练多个模型,并让您直观地分析模型性能,生成预测。
它是如何工作的?
Canvas 支持从亚马逊 S3 或本地上传的 CSV 文件类型。您还可以从 Amazon Redshift 或 SnowFlake 导入,并选择执行连接和 SQL 查询,以便更好地控制导入过程。导入数据集后,您可以使用左连接、右连接、内连接和外连接来组合数据集。当您对数据集满意时,可以选择要预测的目标列。SageMaker Canvas 将自动确定 type 问题类型—二元或多类分类或回归。当你开始训练时,它将建立多达 250 个模型,并选择一个表现最好的。最佳是主观的,所以你可以预览模型,看看它的估计准确性,并使用它来生成新数据集的预测。
**注:**作为一名 ML 教育者和实践者,我有责任告诉你负责任地使用你训练过的模型。模型可能有偏差,数据集也可能有偏差。引用著名统计学家乔治·博克斯的话“所有的模型都是错的,有些是有用的”。不管训练模型有多容易,都要对它们的有用性做出最佳判断。
作者图片
是给谁的?你应该什么时候使用它?
读完这篇文章后,如果你的第一反应是测试 SageMaker Training 编译器,那么可以肯定 SageMaker Canvas 不适合你。SageMaker Canvas 可以简化数据分析和其他面向统计的工作角色的模型开发,这些工作角色需要构建预测模型,但不一定具备 python 编码或使用 SageMaker Studio 的技能。如果您具有解释数据集、理解数据分布和数据不平衡、识别好的和差的数据集以及缺失数据如何影响预测的技能,SageMaker Canvas 可以填补模型开发空白,因此您可以专注于成为数据和领域专家。
回复:cap
我发现这是 AI/ML 发布以来最激动人心的发明之一,原因如下。
我们得到了一个使用 SageMaker Canvas 非常简单的服务,我们得到了一个免费的服务,每个人都可以使用,包括 SageMaker Studio Lab 的学生。我们获得了一项服务,专家数据科学家可以依靠这项服务来加快 SageMaker 训练编译器的训练速度,我们还获得了一项服务来帮助数据科学家找出最佳实例来托管他们的 SageMaker 推理推荐器模型。我们得到了一个服务来托管模型,而不需要使用 SageMaker 无服务器推理来管理实例。我们为数据标注项目经理提供了一项服务,通过 SageMaker Ground Truth Plus 获得高质量的标注数据集。最后,我们用 Trn1 和 G5g 获得了新的训练和推理加速器,这意味着开发者有了更多的选择。我们为每个人提供人工智能/人工智能服务!
- ML for everyone: 亚马逊 SageMaker 工作室实验室,AWS DeepRacer 学生& AWS AI & ML 奖学金项目
- **ML 训练:**亚马逊 SageMaker 训练编译器
- **ML 推理:**亚马逊 SageMaker 无服务器推理,亚马逊 SageMaker 推理推荐器
- ML 和数据科学工作流程: Amazon SageMaker Studio 与 Amazon EMR 的集成
- **ML 数据处理和标注:**亚马逊 SageMaker Ground Truth Plus
- **ML 硬件:**亚马逊 EC2 G5g,亚马逊 EC2 Trn1
- **面向非开发者的 ML:**亚马逊 SageMaker Canvas
所有的东西都在这里了!如果你喜欢阅读这份总结,请随时在 medium、 twitter 和 LinkedIn 上关注我。在接下来的几周里,我将会忙于对这些服务进行更深入的研究,你不会想错过的。下一篇博文再见!
AWS SageMaker
在 Amazon SageMaker 上构建、训练和部署一个 ML 模型
亚历克斯·库利科夫在 Unsplash 上的照片
让我们从简单简短的 SageMaker 介绍开始,理解我们正在使用的是什么,稍后我们将深入 ML 教程!
什么是 AWS SageMaker?
亚马逊 SageMaker 是一个云机器学习平台{就像你的 jupyter 笔记本环境一样:),但在云上}帮助用户在生产就绪的托管环境中构建、培训、调整和部署机器学习模型。
使用 AWS SageMaker 的一些好处
- 高度可扩展
- 快速训练
- 保持正常运行时间—过程保持运行,没有任何中断。
- 高数据安全性
用 SageMaker 进行机器学习
SageMaker 附带了许多内置的优化 ML 算法,这些算法广泛用于训练目的。现在要建立一个模型,我们需要数据。我们可以自己收集和准备培训数据,或者我们可以从亚马逊 S3 桶中选择,这是 AWS SageMaker 内的存储服务(有点像你系统中的硬盘驱动器)。让我们看看如何利用这个服务来构建一个端到端的 ML 项目。
现在让我们开始在 SageMaker 上构建我们的模型
本教程的重点将是使用 SageMaker 和所使用的库。任何 ML 概念都不会有任何解释。
注意 : 你应该有一个 AWS 账户来执行这些任务。
1.创建笔记本实例
就像您在您的系统中创建一个 jupyter 笔记本一样,我们也将在我们的平台上创建一个 jupyter 笔记本。以下是执行相同操作的步骤:
- 登录 AWS SageMaker 控制台*。*
- 点击笔记本实例,然后选择创建笔记本实例。
作者图片
- 在下一页,将您的笔记本命名为,将实例类型和弹性推理保留为默认,并为您的实例选择 IAM 角色。
图片作者|从下拉列表中,选择创建一个新角色,并选择任何 S3 桶
IAM(身份和访问管理)角色:
简而言之,SageMaker 和 S3 水桶是由 AWS 提供的服务。我们的笔记本实例需要存储在 S3 桶中的数据来构建模型。在 AWS 中,一个服务不能直接访问另一个服务。因此,应该提供一个角色,以便笔记本实例可以从 S3 存储桶访问数据。您可以为您的例程提供特定的 S3 时段或所有的 S3 时段。
- 创建角色后,点击创建笔记本实例。
- 创建实例需要几分钟时间。之后点击 **jupyter,**选择你想要使用的笔记本环境。
图片作者|本教程我选择了 conda_python3
这就是了。您的笔记本已创建。
2.了解使用的库
在本次会议中,我们将研究执行该任务所需的所有库:
使用的库
正如我之前提到的,AWS 包含了很多我们可以使用的内置 ML 算法。为了使用这些算法,我们需要 sagemaker 库。所有这些内置算法都是图像容器的形式,因此 get_image_uri 帮助我们访问这些容器。
如果你正在使用 sagemaker,你需要 boto3 库。就像您使用 pandas 从您的本地系统读取数据一样, boto3 帮助我们访问 S3 存储桶中的数据,前提是提供对这些存储桶的访问权限(还记得我的角色吗?).现在,如果我们想使用 sagemaker 实例,我们必须创建会话来完成。会话库用于创建会话。
3.创建 S3 存储桶
图片作者|最初没有水桶
S3 桶可以手动创建,也可以使用 boto3 从我们的笔记本实例中创建。在本教程中,我们将使用 boto3 来创建一个。
创建 S3 桶的代码
在 AWS 中有多个区域,每个用户在自己的区域工作。默认情况下,存储桶是在美国东部(N. Virginia)地区创建的,因此,如果您所在的地区不是 US-East-1 ,您必须在创建存储桶时明确指定您所在的地区。
**my_region = boto3.session.Session().region_name** # this gives you your region
**s3.create_bucket(Bucket=bucket_name, CreateBucketConfiguration={ 'LocationConstraint': my_region })** # this is how you explicitly add the location constraint
存储桶名称是全球唯一的!如果您与一个已经存在的存储桶冲突,并且您指定了一个不同于已经存在的存储桶区域的区域,AWS 将向您提供“IllegalLocationConstraintException”错误。如果您碰巧猜出了现有 bucket 的正确区域,它会给出 BucketAlreadyExists 异常。
除此之外,在给它们命名时,还必须记住一些命名约定:
- 存储桶名称的长度必须在 3 到 63 个字符之间。
- 存储桶名称只能由小写字母、数字、点(。),以及连字符(-)。
- 存储桶名称必须以字母或数字开头和结尾。
- 存储段名称不得格式化为 IP 地址(例如,192.168.5.4)
- 桶名不能以
xn--
开头(2020 年 2 月以后创建的桶)。 - 存储桶名称在一个分区中必须是唯一的。分区是一组区域。AWS 目前有三个分区:
aws
(标准地区)aws-cn
(中国地区),以及aws-us-gov
(AWS GovCloud【美国】地区)。 - 与亚马逊 S3 传输加速一起使用的桶不能有点(。)在他们的名下。有关传输加速的更多信息,请参见亚马逊 S3 传输加速。
4.将数据加载到 S3
我们首先将数据分为训练和测试。然后我们会把它运到 S3。
使用 SageMaker 时要记住的一个重要步骤是,SageMaker 中的内置算法期望相关要素是我们数据集的第一列。因此,如果数据集的第一列不是依赖要素的第一列,请确保对其进行更改。
将训练和测试数据加载到 S3 存储桶中
s3_input_train 和 s3_input_test 包含 s3 存储桶中上传的训练和测试数据的路径,这些数据将在以后训练时使用。
5.构建和训练模型
模型
容器通过指定区域名来检索内置的 XGB 模型。估算器通过指定我们希望在 image_uri 下使用的算法来处理端到端的 Amazon SageMaker 培训和部署任务。s3_input_train 和 s3_input_test 指定了训练和测试数据在 s3 存储桶中的位置。我们在步骤 4 中确定了这些路径。
6.部署
**xgb_predictor = xgb.deploy(initial_instance_count=1,instance_type='ml.m4.xlarge')**
然后可以使用上面的代码行部署训练好的模型。 initial_instance_count 指定预测时应该使用的实例数量。实例数量越多,预测越快。
7.预言;预测;预告
上述代码可用于预测结果。
8.打扫
在这一步中,您将终止您使用的所有资源。终止当前未被使用的资源可以降低成本,并且是一种最佳做法。不终止您的资源将导致您的帐户收费。
# Delete your deployed end points
**xgb_predictor.delete_endpoint()
xgb_predictor.delete_model()**# Delete your S3 bucket
**bucket_to_delete = boto3.resource('s3').Bucket(bucket_name) bucket_to_delete.objects.all().delete()**
最后删除你的 SageMaker 笔记本:停下来,删除你的 SageMaker 笔记本。
- 打开 SageMaker 控制台。
- 在笔记本下,选择笔记本实例。
- 选择您为本教程创建的笔记本实例,然后选择“操作”、“停止”。笔记本实例需要几分钟才能停止。当状态变为“已停止”时,继续下一步。
- 选择操作,然后选择删除。
- 选择删除。
你有它!这就是如何使用 AWS SageMaker 构建一个端到端的 ML 模型
本教程的完整代码可以从我的GitHub中访问。
随时和我联系LinkedIn。
希望你喜欢这个教程。感谢阅读:)
AWS Sagemaker 气流工作流管理
实践教程
使用 Sagemaker 笔记本电脑和 Airflow DAGs 生产数据科学项目
在这篇文章中,我将谈谈我在 AWS Sagemaker 实例上使用气流调度数据科学项目笔记本的经验。我们已经使用网飞的 papermill 库运行 Jupyter 笔记本两年多了,每天都有数十个 Sagemaker 笔记本实例由气流精心编排,工作起来很有魅力。
你将读到这个系统的总体架构设计,工作方式是什么,团队之间的角色和职责是什么,以及你如何自己实现它。
本文原载于我的个人博客https://halilduygulu . com/blog/2021-12-11-managing-sage maker-workflows-with-air flow
问题
虽然在项目的早期阶段,这是一项简单的任务,但后来当一个较旧的项目必须修改以获得新功能或修复错误时,您每次都必须从 python 文件创建一个笔记本文件,或者在您的工作区中找到较旧的笔记本,并使用 python 文件上发生的更改来修改它。当您完成开发后,现在是时候将更改放入 python 文件中了,再次将您最近所做的更改复制粘贴到 python 文件中并测试它。在这种来回的复制粘贴过程或自动生成文件的过程中,经常会发生一些简单的错误,如忘记导入、漏掉一行修改、缩进错误等…有些错误是立即可见的,有些是在运行 spark 应用程序超过 3 个小时后才可见的。如果只有一个人在一个项目中工作,想象一下,多个数据科学家在同一个项目中使用多个笔记本文件,将函数或代码块从一个文件移动到另一个文件,这是一项非常复杂的工作,仅仅是解决 git 上的冲突。
使用笔记本进行开发、python 进行生产的另一个缺点是,对于在测试 airflow automation dag 期间发生的错误,您会得到许多“它正在我的开发环境中工作”的响应。而这些错误都是简单的编码错误,就像我上面提到的,缺失导入,硬编码值,开发时使用的额外导入,requirement.txt 文件中缺失库等等。所以本质上,项目的可维护性是一个痛点。
解决方案
当我开始在目前的公司工作时,我不想有同样的问题,并从一开始就寻找一种方法来建立数据科学和数据工程团队之间的可靠工作方式。这个想法是,数据科学家可以自由地在 Sagemaker 笔记本实例上开发他们的项目,只要他们在 git 存储库中交付这个项目,并在 requirements.txt 文件中运行笔记本文件和整个依赖项,当使用 Airflow 生产项目时。
因此,从数据工程的角度来看,我们只需要知道应该安装哪些依赖项,然后哪些笔记本文件必须用一组参数和笔记本文件的顺序(如果有多个)来执行。有了这些信息,任何数据工程师都可以准备一个 DAG,在生产流程中按照要求的时间表运行这个项目,因为几乎所有的数据科学项目都有通用而简单的代码作为抽象的结果。通过将项目级别的领域知识保存在笔记本文件中,并将常见任务抽象为 Airflow 操作符,我们已经将安排关于 Airflow 的数据科学项目任务作为配置流程,而不是开发工作。
现在我们已经讨论了工作方式,让我们深入系统架构和实现的细节。
作者图片
上面你可以看到 AI 平台的简化概览图。我们将在这里讨论的主要组件是 Airflow 和 Sagemaker,但让我简单解释一下其他一些工具。
我们主要使用 s 3 存储桶作为 data science 的输入源,每个帐户都有 3 个主要存储桶,位于许多其他 S3 存储桶之上,用于其他目的。
- 数据,一个只读桶,在一个类似于 Hive 文件系统的文件夹结构中包含拼花文件。我们还在这些文件之上提供了 AWS Athena 用于特殊查询。
- 中间,读/写桶,存储不重要的临时、短期文件。想象一下 spark 作业的 parquet 或 json 输出,它们将作为管道中下一步的输入。
- 输出,读写桶,应用最终产品的存储。因此,如果有必要,预测结果、经过训练的模型或工件会长期存储在这里。
我们还在大多数项目中使用 MLflow,它用于存储跨帐户的模型工件和度量。并且雪花是公司中的主要数据仓库,对于一些项目也用作输入数据源,对于许多项目雪花是 ML 模型的输出数据的目的地。将数据加载到雪花是通过气流完成的。
如果我们回到运行笔记本文件的 Airflow 和 Sagemaker 编排,我们可以从讨论笔记本和项目中的其他代码是如何部署的开始。如图所示,每个项目的代码照常存储在 Gitlab 中,部署任务实际上做了一件简单的事情,将这个项目中的全部代码复制到一个 S3 桶中,我称这个桶为automated-notebook
。与其他 S3 存储桶一样,该存储桶存在于每个名称带有后缀的 aws 帐户中。因此,当您在 gitlab pipeline 中单击 deploy to preprod 时,它实际做的是将项目内容复制到xx-automated-notebook-preprod
bucket 中,以便 Sagemaker 实例在运行笔记本时可以访问该分支中代码的最新部署版本。
好了,我们把代码放在了 Sagemaker 实例可以访问的地方,现在我们需要一个触发器,在我们的例子中是气流。正如我上面提到的,每个项目都有一个 dag,当 DAG 运行时,它为每个项目执行几乎标准的任务,例如;
创建一个 Sagemaker 实例https://halilduygulu.com/blog/2021-12-11-managing-sagemaker-workflows-with-airflow#create-a-sagemaker-instance
根据 DAG 的要求,我们可以在一个 sagemaker 实例中运行所有笔记本,也可以使用多个 sagemaker 实例并行运行它们。想象这样一个场景,您为每个国家训练一个模型,因此我们可以简单地同时为 20 个国家启动 20 个 sagemaker 实例,因为没有必要等待彼此训练完成后再启动下一个。我们通常这样做,并保持 dag 的总运行时间不变,即使国家的数量在不断增加。有时,您必须为每种类型的实例创建 AWS 限制增加支持票,以增加您的活动 Sagemaker 实例数。
获取 Sagemaker 实例的 IP 地址
由于我们每次都创建一个新的实例,这也意味着它们在 aws 私有子网中被分配了新的私有 ip 地址,我们需要这个 IP 地址才能 ssh 到这些实例中。虽然 AWS 没有在 boto3 的描述实例 api 响应中返回这个 IP,但是因为实例是在我们的子网中创建的,所以我们仍然能够在弹性网络接口(ENI)控制台中找到它们。因此,通过一些 boto3 api 调用技巧,我们现在能够获得 IP 并通过 Xcom 将其传递给 Airflow 中的下一个任务。
通过 Papermill 运行笔记本
为了运行 papermill 命令,我们将使用 Airflow SSHOperator 和几个链接在一起的命令。
- 将项目代码签入新创建的 Sagemaker 实例。这是一个从自动笔记本存储桶到本地磁盘的
aws s3 sync
命令。 - 激活本项目中使用的首选 conda 环境。
- 安装所需的 papermill 版本,因为不是每个 conda env 都有默认版本。
- 使用项目中的文件通过
pip install -r requirements.txt
安装项目依赖项。 - 最后,在其他一切准备就绪的情况下,我们运行 papermill 命令,该命令包含笔记本名称、输出目的地、内核和许多其他要传递给笔记本文件的自定义参数。
Papermill 是一个伟大的项目,我最喜欢它的两个特点。当然,第一个是注入参数。Papermill 使您能够将参数注入笔记本文件,如果您只是在 ipynb 文件中添加一个带有parameters
标签的单元格,如这里所述。我们使用此功能将一些标准参数传递给笔记本,如 aws 环境名称或 id、来自 airflow dag 的执行日期以及项目/模型特定参数。
papermill 的第二个功能是,您可以将每个笔记本运行文件与单元输出和注入参数等保存在一起。得救了。ipynb 文件看起来与您手动运行它时一样。这为我们提供了两件事情,使用详细的错误日志进行故障排除,以及保存每次计划的运行以供审计或保存历史记录。基本上每个自动运行的笔记本文件都作为一个单独的文件保存在 S3 上。
删除 Sagemaker 实例https://halilduygulu.com/blog/2021-12-11-managing-sagemaker-workflows-with-airflow#delete-sagemaker-instance
当所有笔记本文件都通过 Airflow dag 中的 SSHOperator 执行时,下一步是删除这个 Sagemaker 实例,因为我们不再需要它了。此 dag 和其他 Dag 的下一次运行将创建他们自己的 Sagemaker 实例来运行笔记本,这为我们提供了每个项目的临时和隔离运行时,以及项目的更多并发运行程序。AWS Sagemaker 管理 api 的限制是每秒 4 个请求,因此如果出现 api 错误,您需要处理这个问题。
交付结果https://halilduygulu.com/blog/2021-12-11-managing-sagemaker-workflows-with-airflow#delivering-results
由于此流程用于 ML 模型训练以及预测/推理,大多数情况下 Dag 会有一个最终步骤,我们将笔记本的输出加载到雪花或其他目的地。这些是基于项目需求的 json 或 parquet 文件,在我们的例子中,与 Snowflake 或其他第三方的交互比在笔记本文件中更容易。Airflow 几乎为我们已经集成的所有东西都提供了一个操作符或插件,因此我们选择不在数据科学项目笔记本中包含这一职责,以保持简单。
作者图片
上面,我用 Sagemaker 笔记本实例为一个典型的气流 DAG 添加了一个简单的流。每个笔记本都可能在其中进行非常复杂的 ML 模型训练或预测,但从数据工程的角度来看,这是一个简单的应用程序,通过带有参数的气流触发,与各种源数据系统交互,并产生将被传递到目标系统的输出。
此解决方案的优势https://halilduygulu.com/blog/2021-12-11-managing-sagemaker-workflows-with-airflow#benefits-of-this-solution
- 数据工程师不需要了解数据科学项目的细节就可以实现自动化。
- 数据科学家可以开发和测试没有硬编码参数的笔记本,并且知道相同的代码正在生产中运行,没有复制粘贴,没有临时代码行等。所有的代码变更和历史都在 git 仓库中。
- 应用程序运行时是相同且独立的。每个 sagemaker 实例安装项目需求,并且只运行一个项目。不存在会导致与库版本冲突或需要定期维护长期运行时。
- 您不必等待另一个项目完成,这样另一个项目就可以开始运行。
- 所有 Sagemaker 实例仅在应用程序运行时使用,稍后会终止。因此,闲散人员无需支付任何费用。
- 多个软件开发环境可用于测试或解决生产问题,因为所有实例都设置相同,并且具有来自 git 存储库的相同代码。
- 任何支持的语言或内核都可以在项目中使用,这只是 Airflow dag 中的一个参数。
- 可以保持历史记录的日志气流,也在 S3 从造纸厂输出。
- 不需要丰富的 docker 经验或 kubernetes 集群管理员。
- 不需要处理 EMR 集群设置以及随之而来的相关问题。
- 您受到最大 Sagemaker 实例类型的限制,目前为 96 个 cpu 和 768 GB 内存,但在我们的情况下,这已经足够了,作为回报,我们不必维护 EMR 集群或其他运行时来运行数据科学工作负载。如果需要,在使用其他优势的同时,还有其他解决方案可供使用。
链接
- 【https://aws.amazon.com/sagemaker/
- https://papermill.readthedocs.io/en/latest/
- https://netflixtechblog . com/scheduling-notebooks-348 E6 c 14 CFD 6
- https://jupyter.org/
AWS 系统管理器—远程管理服务器
丹尼尔·格雷瓜尔在 Unsplash 拍摄的照片
SSM 在多台主机上并行运行命令,不使用 SSH
最近,由于我们安全团队的一些更新,我们不得不在 AWS 帐户的所有主机上安装一个代理。我们在客户中运行了 1100 多个 EC2 实例。这些服务器有不同的操作系统(亚马逊 Linux、Fedora、CentOS、RHEL、Ubuntu、Windows、FreeBSD 等)。此外,这些服务器支持各种工作负载,如 EMR(各种版本)、EKS、ECS、Airflow、Tableau、Alation。其中许多是供应商配置的服务器,它们有自己的 ami。用代理为每种类型创建 ami 需要很长时间和巨大的努力。此外,有些服务器不能容忍重启(为了让用户数据脚本工作)。
AWS 有一个名为 System Manager 的服务,它允许我们在不需要 SSH 的情况下运行远程命令。运行 SSM 文档的基本要求是主机应该运行amazon-ssm-agent
,并且主机应该有一个能够访问 SSM(amazonsmsmanagedinstancecore)的 IAM 角色。下图总结了 SSM 运行命令的工作方式。
SSM 运行命令的高级流程|图片由作者提供
SSM 运行命令中的低级 API 调用:
- SSM 代理向 SSM 服务端点更新实例详细信息。这每 5 分钟发生一次(ssm:UpdateInstanceInformation)。此更新增强了运行命令实例的详细信息。
- 代理持续轮询(长时间)来自消息传递服务(ec2messages:GetMessages)的消息。
- 一旦它接收到预定的消息,它就发送一个确认(ec2messages:AcknowledgeMessage)。
- 它从 SSM 下载文档(ssm:GetDocument)
- 执行文档。
- 如果在此期间收到取消消息,它将取消文档执行。
- 将响应发送回消息传递服务(ec2messages:SendReply)。
幸运的是,我们在这些服务器上安装了 SSM 代理。我们为 SSM 和其他所需的访问权限创建了一个托管策略,并将该策略附加到主机的 IAM 角色。我们利用 boto3 让所有拥有 EC2 服务的 IAM 角色成为可信实体,并向角色添加托管策略。
一旦满足了先决条件,我们就利用系统管理器的文档和运行命令功能来安装代理。对于正在运行的实例,我们采用了基于标签的方法,并基于该标签运行文档。
现有服务器修补解决方案设计|作者图片
由于我们的平台使用了大量的自动伸缩,我们还需要在由 AWS 管理的自动伸缩运行的新服务器上放置代理。我们可以使用启动模板的用户数据,但是 EMR 管理的扩展组(实例组)没有用户数据,我们不想干扰现有的引导脚本。我们使用了 CloudWatch、Lambda、SQS 和 SSM 来处理这些问题。
现场安装解决方案设计|作者图片
- EC2 实例出现,它生成事件并将它们发送到 CloudWatch。
- CloudWatch 基于实例状态变化(正在运行)来挖掘事件。它将该事件发送到 SQS 队列。
SQS 队列在消息上增加了 3 分钟的延迟,然后在 3 分钟的窗口中对消息进行批处理。
递送延迟的 SQS 队列配置|作者图片
- AWS Lambda 批量接收消息。它过滤由 SSM 管理的实例。对于不由它管理的实例,将它发送到另一个数据库。SSM it 部门管理的所有实例都根据平台(Linux/Windows)进行分组。它调用 SSM 的相应文件。
Lambda |图片的 SQS 事件触发器(作者)
- SSM 文档向所有目标实例发送命令,并在服务器上安装代理。
SSM 文档样本
命令的 SSM 文档运行历史|作者的图像
这种方法使我们能够在 3 天内对所有的机器运行安装命令(我们分批执行以减小爆炸半径)。所有新机器都通过 lambda 自动打补丁。我们也可以使用 cli 发送命令。
aws ssm send-command \
--document-name "<Document_name>" \
--targets "Key=instanceids,Values=i-1234567890abcdef0" \
--timeout-seconds 300
尽管我们这样做是为了安装特定的代理,但是该解决方案可以扩展到各种用例(自动化就是其中之一)。我能马上想到的一个是替换**air flow . contrib . operators . ssh _ operator。**有了 SSM,我们不必创建 SSH 连接。一切都由 SSM 负责。解决方案中唯一的问题是 SSM 15 分钟的暂停。但是如果你跟着火走,却忘了接近,这将是一个很好的探索选择。
云计算快乐!!
Azure 认知服务:探索认知愿景
第 1 部分:Azure 认知视觉服务概述,用于处理和分类来自深度学习的计算机视觉领域的图像
戴维·特拉维斯在 Unsplash 上拍摄的照片
介绍
随着各种公共云提供商(如 Azure、AWS 或 Google Cloud)提供的各种预培训服务的出现,认知服务领域发展得太快了。这个领域已经变得越来越有前景,因为它覆盖了解决大多数跨行业领域的常见业务用例。
这篇文章将主要研究微软 Azure 提供的各种认知服务,值得讨论每种服务的能力以及它们可以提供的解决方案。这将是一系列的帖子,首先介绍这些服务:1)认知视觉,2)认知文本分析,3)认知语言处理,4)知识处理和搜索。
在这第一篇文章中,我们将简要了解微软 Azure 的认知愿景产品。
- 认知人脸 API
- 计算机视觉 API
- 定制视觉服务
- 媒体服务视频分析器
https://www.linkedin.com/in/p-jainani
视觉、图像和视频
Face API
该服务提供算法,公开为基于 REST 的 web 服务调用,用于检测、验证、识别和分析人脸。该服务可以提供面部匹配、面部属性和特征分析。该 API 还具有面部识别和辨认的能力。该服务还提供特定于面部的:标志(鼻子、眼睛)和属性(肤色、年龄、性别)。
人脸检测 API :人脸检测 API 提供关于图像中检测到的人脸的信息,但并不是为了识别或辨认特定的人脸而设计的。
人脸识别 API :它建立在面部检测 API 的基础上,通过分析两张或更多图片中的地标来确定是否存在同一张脸。这对于人脸验证和识别是有用的。
情感 API:Face API 可以通过检测方法情感属性返回一般的情感值。API 通过使用额外的方法和算法来检测人脸图像中丰富的情绪集,通过提供以下情绪的置信度来提供这些结果:愤怒、轻蔑、厌恶、恐惧、快乐、情绪缺失(中性)、悲伤和惊讶。
这里有一个快速入门指南,可以用你选择的任何语言和平台开始使用 Face API。
与大多数认知服务一样,Face API 需要使用订阅密钥(有时称为 API 密钥)进行授权。这个密钥应该保密,以确保其他人无法使用您的资源。您将为每个对 Face API 的调用包含订阅密钥
计算机视觉 API
计算机视觉 API 提供了处理图像的算法能力,并使用预先训练的模型 API 返回洞察力。它使你能够发现一个图像是否有淫秽内容,或者需要找到图像中的所有面孔。它还通过评估图像特征和颜色、图像内容分类以及使用内置的 API 功能生成图像描述来提供帮助。
用于图像分析的计算机视觉 API
API 的分析端点根据图像内容提取丰富的视觉特征。请求示例如下所示:
curl "https://<region>.api.cognitive.microsoft.com/vision/v2.0/**analyze**?**visualFeatures=Categories,Description&details=Landmarks**" \
-H "Ocp-Apim-Subscription-Key: $key" \
-H "Content-Type: application/json" \
-d "{'url' : '/images/mountains.jpg'}" \
| jq '.'curl "https://<region>.api.cognitive.microsoft.com/vision/v2.0/analyze?**visualFeatures=Adult,Description**" \
-H "Ocp-Apim-Subscription-Key: $key" \
-H "Content-Type: application/json" \
-d "{'url' : '/images/people.png'}" \
| jq '.'
有关
*analyze*
操作的更多信息,参见分析图像参考文件。
生成图像缩略图的计算机视觉 API
此外,计算机视觉 API 还可以使用缩略图端点:https://<region>.api.cognitive.microsoft.com/vision/v2.0/generateThumbnail
智能生成图像缩略图,以有效显示大图像。请求示例如下所示:
curl "https://<region>.api.cognitive.microsoft.com/vision/v2.0/**generateThumbnail**?width=100&height=100&smartCropping=true" \
-H "Ocp-Apim-Subscription-Key: $key" \
-H "Content-Type: application/json" \
-d "{'url' : '/images/dog.png'}" \
-o thumbnail.jpg
关于
generateThumbnails
操作的更多信息,参见获取缩略图参考文件。
计算机视觉 API 提取印刷文本
API 的ocr
操作检测图像中的打印文本并提取字符,然后将其转换为字符流供下游应用程序使用。请求的 URL 具有以下格式:https://<region>.api.cognitive.microsoft.com/vision/v2.0/ocr?language=<...>&detectOrientation=<...>
。请求示例如下所示:
curl "https://<region>.api.cognitive.microsoft.com/vision/v2.0/ocr" \
-H "Ocp-Apim-Subscription-Key: $key" \
-H "Content-Type: application/json" \
-d "{'url' : '/images/ebook.png'}" \
| jq '.'
有关
ocr
操作的更多信息,请参见 OCR 参考文档。
提取手写文本的计算机视觉 API
与 OCR 操作不同的是,recognizeText
操作从笔记、信件、白板、表格和其他来源中检测和提取手写的&书法文本。请求的 URL 具有以下格式:
https://<region>.api.cognitive.microsoft.com/vision/v2.0/recognizeText?mode=[Printed|Handwritten]
请求将输出转储到控制台:
curl "https://<region>.api.cognitive.microsoft.com/vision/v2.0/recognizeText?mode=Handwritten" \
-H "Ocp-Apim-Subscription-Key: $key" \
-H "Content-Type: application/json" \
-d "{'url' : '/images/handwriting.jpg'}" \
-D -
有关
recognizeText
操作的更多信息,请参见识别手写文本参考文档。
专业提示 : Azure 还提供了利用容器封装其认知服务产品的选项,这允许开发者跨平台快速部署他们的定制认知解决方案。快速参考此处。
定制视觉服务
Custom Vision 服务旨在创建图像分类模型,从您为特定领域提供的已标记图像中“学习”。例如,从给定的图像目录中识别狗的品种。
作为开发人员,要利用这项服务,您需要使用自定义视觉服务门户创建一个项目
自定义视觉服务门户:登录页
使用您的 Microsoft 帐户登录门户,并开始创建项目。它提供了在项目类型之间进行选择的能力,例如分类或对象检测、多标签或多类分类,以及预定义的域选择,即地标、零售、食品等…
媒体服务视频分析器
媒体视频分析器是一个 Azure 认知服务,用于从视频媒体中提取见解。它使用可以进一步定制和训练的机器学习模型。它支持从视频媒体文件中进行人脸识别、文本识别、对象标记、场景分割。
它还分析来自音频的内容,例如转录和情感检测。这些结果可用于改进搜索、提取剪辑和创建缩略图。
微软为此服务提供了一个单独的门户网站,即媒体门户网站的视频分析器
Azure Video Analyzer for Media 提供了几个上传视频的选项,最常见的是从 URL 上传、REST API 或以字节数组的形式发送文件。它还支持广泛的文件格式,如 WMV,MOV,MPG 和 AVI。视频上传后,索引过程会自动开始。完成后,您可以检查索引器结果。
由此产生的见解不仅限于:成绩单、OCR、面孔、品牌、情绪或情感。
此外,它支持关于视频的高级见解和关键方面,如场景、镜头和关键帧。它还支持搜索视频中的关键概念,并提供时间线建议。
为了在媒体 Azure 视频分析器上获得快速的动手练习,请遵循此 URL 或此处的中提到的步骤。全面的细节可通过 Azure 媒体视频分析器获得。
摘要
在这篇文章中,我们简要讨论了各种 Azure 认知服务,这些服务旨在解决需要计算机视觉能力的业务问题。这些服务在调配后即可立即使用,并且大多以随用随付的方式提供。
在下一篇文章中,我们将讨论 Azure 的语言和文本认知服务。
参考
[1] Azure 认知服务— 文档
**https://www.linkedin.com/in/p-jainani **
Azure Cosmos DB:用例与权衡
如何在 Azure Cosmos DB 中选择正确的数据模型?SQL,MongoDB,Cassandra,图还是表?
吉列尔莫·费拉在 Unsplash 上拍摄的照片
Azure Cosmos DB 是一个完全托管的、可弹性伸缩的全球分布式数据库,采用多模型方法,为您提供使用文档、键值、宽列或基于图形的数据的能力。
在这篇博客中,我们将深入探讨多模型功能,并探索可用于存储和访问数据的选项。希望它能帮助你在正确的 API 上做出明智的决定。
- 核心(SQL) API:结合了 SQL 查询功能的 NoSQL 文档存储的灵活性。
- MongoDB API :支持 MongoDB wire 协议,这样现有的 MongoDB 客户端可以继续使用 Azure Cosmos DB,就像它们运行在实际的 MongoDB 数据库上一样。
- Cassandra API :支持 Cassandra wire 协议,因此现有的符合 CQLv4 的 Apache 驱动程序可以继续与 Azure Cosmos DB 一起工作,就像它们是在实际的 Cassandra 数据库上运行一样。
- Gremlin API :用 Apache TinkerPop(一个图形计算框架)和 Gremlin 查询语言支持图形数据。
- Table API :为针对 Azure Table 存储编写的应用提供高级功能。
您可以进一步了解一些 的主要优势
使用 Azure Cosmos DB 的一些常见场景(无论如何不是一个详尽的列表)包括:
- 现代游戏服务需要提供定制和个性化的内容,如游戏内统计数据、社交媒体整合和高分排行榜。作为一个完全托管的产品,Azure Cosmos DB 需要最少的设置和管理,以允许快速迭代,并缩短上市时间。
- 电子商务平台和零售应用程序存储目录数据,并用于订单处理管道中的事件采购。
- 零售用例存储产品目录信息,这些信息在结构上可以是动态的。
…还有更多!
使用哪种 API,何时使用?
没有完美的公式!有时,选择是明确的,但是其他场景可能需要一些分析。
要考虑的一个相当明显的问题是,是否存在通过 wire 协议使用任何受支持的 API 的现有应用程序(例如 Cassandra 和 MongoDB)?如果答案是肯定的,您应该考虑使用特定的 Azure Cosmos DB API,因为这将减少您的迁移任务,并充分利用您团队中以前的经验。
如果您希望模式发生很大变化,您可能希望利用文档数据库,使 Core (SQL)成为一个不错的选择(尽管也应该考虑 MongoDB API)。
如果您的数据模型由实体之间的关系和相关元数据组成,那么您最好使用 Azure Cosmos DB Gremlin API 中的图形支持。
如果你目前正在使用 Azure Table Storage ,Core (SQL) API 将是一个更好的选择,因为它提供了更丰富的查询体验,并改进了 Table API 的索引。如果你不想重写你的应用,考虑迁移到 Azure Cosmos DB Table API 。
让我们看看每个 API 并应用其中的一些。
核心(SQL) API:两全其美
核心(SQL) API 是默认的 Azure Cosmos DB API。您可以使用 JSON 文档存储数据来表示您的数据,但是有几种方法可以检索它:
- SQL 查询:使用结构化查询语言(SQL)作为 JSON 查询语言编写查询
- 点读取:在单个条目 ID 和分区键上进行键/值样式的查找(这些比 SQL 查询更便宜、更快)
对于许多应用程序来说,半结构化数据模型可以提供他们所需要的灵活性。例如,具有大量产品类别的电子商务设置。您将需要添加新的产品类别和支持操作(搜索,排序等。)跨多个产品属性。您可以用关系数据库对此进行建模,但是,不断发展的产品类别可能需要停机来更新表模式、查询和数据库。
使用 Core (SQL ),引入新产品类别就像为新产品添加文档一样简单,无需更改模式或停机。Azure Cosmos DB MongoDB API 也适合这些需求,但是 Core (SQL) API 具有优势,因为它在灵活的数据模型之上支持类似 SQL 的查询。
考虑一个博客平台的例子,用户可以创建帖子,喜欢这些帖子并添加评论。
你可以这样表示一个post
:
{
"id": "<post-id>",
"type": "post",
"postId": "<post-id>",
"userId": "<post-author-id>",
"userUsername": "<post-author-username>",
"title": "<post-title>",
"content": "<post-content>",
"commentCount": <count-of-comments>,
"likeCount": <count-of-likes>,
"creationDate": "<post-creation-date>"
}
以及comments
和likes
:
{
"id": "<comment-id>",
"type": "comment",
"postId": "<post-id>",
"userId": "<comment-author-id>",
"userUsername": "<comment-author-username>",
"content": "<comment-content>",
"creationDate": "<comment-creation-date>"
}{
"id": "<like-id>",
"type": "like",
"postId": "<post-id>",
"userId": "<liker-id>",
"userUsername": "<liker-username>",
"creationDate": "<like-creation-date>"
}
为了处理喜欢和评论,您可以使用一个存储过程:
function createComment(postId, comment) {
var collection = getContext().getCollection(); collection.readDocument(
`${collection.getAltLink()}/docs/${postId}`,
function (err, post) {
if (err) throw err; post.commentCount++;
collection.replaceDocument(
post._self,
post,
function (err) {
if (err) throw err; comment.postId = postId;
collection.createDocument(
collection.getSelfLink(),
comment
);
}
);
})
}
如果你想了解更多,请参考 在 Azure Cosmos DB 中使用 JSON
从现有的 MongoDB 实例迁移
Azure Cosmos DB 为 MongoDB 实现了 wire 协议,它允许与原生 MongoDB 客户端 SDK、驱动程序和工具透明兼容。这意味着任何理解这个协议版本的 MongoDB 客户端驱动程序(以及 Studio 3T 等现有工具)都应该能够本地连接到 Cosmos DB。
例如,如果您有一个现有的 MongoDB 数据库作为采购订单处理应用程序的数据存储,以捕获不同格式的失败和部分订单、履行数据、运输状态。由于数据量不断增加,您希望迁移到可扩展的基于云的解决方案,并继续使用 MongoDB——使用 Azure Cosmos DB 的 API for MongoDB 是非常合理的。但是,您希望对现有应用程序进行最少的代码更改,并在尽可能短的停机时间内迁移当前数据。
借助 Azure 数据库迁移服务,您可以执行在线(最小停机时间)迁移,并根据您的需求灵活扩展为您的 Cosmos 数据库提供的吞吐量和存储,并且只需为您需要的吞吐量和存储付费。这导致了显著的成本节约。
参考https://docs.microsoft.com/azure/cosmos-db/mongodb-pre-migration?WT.mc_id=data-12713-abhishgu和 迁移后 指南。
一旦迁移了数据,您就可以继续使用现有的应用程序。下面是一个使用 MongoDB 的例子。网络驱动:
初始化客户端:
*MongoClientSettings settings = new MongoClientSettings();
settings.Server = new MongoServerAddress(host, 10255);
settings.UseSsl = true;
settings.SslSettings = new SslSettings();
settings.SslSettings.EnabledSslProtocols = SslProtocols.Tls12;MongoIdentity identity = new MongoInternalIdentity(dbName, userName);
MongoIdentityEvidence evidence = new PasswordEvidence(password);settings.Credential = new MongoCredential("SCRAM-SHA-1", identity, evidence);MongoClient client = new MongoClient(settings);*
检索数据库和集合:
*private string dbName = "Tasks";
private string collectionName = "TasksList";var database = client.GetDatabase(dbName);
var todoTaskCollection = database.GetCollection<MyTask>(collectionName);*
将任务插入集合:
*public void CreateTask(MyTask task)
{
var collection = GetTasksCollectionForEdit();
try
{
collection.InsertOne(task);
}
catch (MongoCommandException ex)
{
string msg = ex.Message;
}
}*
检索所有任务:
*collection.Find(new BsonDocument()).ToList();*
您还应该仔细考虑如何将 MongoDB 写/读问题映射到 Azure Cosmos 一致性级别、管理索引并利用更改提要支持。
请注意,如果不需要重用现有代码和从现有 MongoDB 数据库导入数据,那么核心(SQL) API 将是一个合适的选择。
用 Cassandra 处理实时数据
如果您的应用程序需要处理大量的实时数据,Apache Cassandra 是一个理想的选择。使用 Azure Cosmos DB Cassandra API,您可以使用符合 CQ v4 的现有 Apache 驱动程序,并且在大多数情况下,您应该能够通过更改连接字符串,从使用 Apache Cassandra 切换到使用 Azure Cosmos DB 的 Cassandra API。也可以继续使用基于 Cassandra 的工具,比如cqlsh
。
对于高级分析用例,您应该将 Azure Cosmos DB Cassandra API 与 Apache Spark 相结合。你可以使用熟悉的Spark connector for Cassandra来连接 Azure Cosmos DB Cassandra API。此外,您还需要来自 Azure Cosmos DB 的Azure-Cosmos-Cassandra-spark-helperhelper 库,用于定制连接工厂和重试策略等功能。
可以从Azure data bricks以及 Spark on YARN 使用 HDInsight 访问 Azure Cosmos DB Cassandra API
要连接到 Cosmos DB,您可以像这样使用 Scala API:
*import org.apache.spark.sql.cassandra._
import com.datastax.spark.connector._
import com.datastax.spark.connector.cql.CassandraConnector
import com.microsoft.azure.cosmosdb.cassandraspark.conf.set("spark.cassandra.connection.host","YOUR_ACCOUNT_NAME.cassandra.cosmosdb.azure.com")
spark.conf.set("spark.cassandra.connection.port","10350")
spark.conf.set("spark.cassandra.connection.ssl.enabled","true")
spark.conf.set("spark.cassandra.auth.username","YOUR_ACCOUNT_NAME")
spark.conf.set("spark.cassandra.auth.password","YOUR_ACCOUNT_KEY")
spark.conf.set("spark.cassandra.connection.factory", "com.microsoft.azure.cosmosdb.cassandra.CosmosDbConnectionFactory")spark.conf.set("spark.cassandra.output.batch.size.rows", "1")
spark.conf.set("spark.cassandra.connection.connections_per_executor_max", "10")
spark.conf.set("spark.cassandra.output.concurrent.writes", "1000")
spark.conf.set("spark.cassandra.concurrent.reads", "512")
spark.conf.set("spark.cassandra.output.batch.grouping.buffer.size", "1000")
spark.conf.set("spark.cassandra.connection.keep_alive_ms", "600000000")*
可以进行聚合,如average
、min/max
、sum
等。:
*spark
.read
.cassandraFormat("books", "books_ks", "")
.load()
.select("book_price")
.agg(avg("book_price"))
.showspark
.read
.cassandraFormat("books", "books_ks", "")
.load()
.select("book_id","book_price")
.agg(min("book_price"))
.showspark
.read
.cassandraFormat("books", "books_ks", "")
.load()
.select("book_price")
.agg(sum("book_price"))
.show*
使用 Gremlin (Graph) API 连接一切
作为个性化客户体验的一部分,您的应用程序可能需要在网站上提供产品推荐。比如“买了产品 X 的人也买了产品 Y”。您的用例可能还需要预测客户行为,或者将人们与具有相似兴趣的人联系起来。
Azure Cosmos DB 支持 Apache Tinkerpop 的图遍历语言(即 Gremlin)。有许多用例会产生与缺乏灵活性和关系方法相关的常见问题。例如,管理连接的社交网络、地理空间使用案例,如在一个区域内查找感兴趣的位置或定位两个位置之间的最短/最佳路线,或将物联网设备之间的网络和连接建模为图表,以便更好地了解设备和资产的状态。除此之外,您可以继续享受所有 Azure Cosmos DB APIs 共有的功能,如全球分布、存储和吞吐量的弹性扩展、自动索引和查询以及可调的一致性级别。
例如,您可以使用以下命令将产品的三个顶点和相关采购的两条边添加到图形中:
*g.addV('product').property('productName', 'Industrial Saw').property('description', 'Cuts through anything').property('quantity', 261)
g.addV('product').property('productName', 'Belt Sander').property('description', 'Smoothes rough edges').property('quantity', 312)
g.addV('product').property('productName', 'Cordless Drill').property('description', 'Bores holes').property('quantity', 647)g.V().hasLabel('product').has('productName', 'Industrial Saw').addE('boughtWith').to(g.V().hasLabel('product').has('productName', 'Belt Sander'))
g.V().hasLabel('product').has('productName', 'Industrial Saw').addE('boughtWith').to(g.V().hasLabel('product').has('productName', 'Cordless Drill'))*
然后,您可以查询随“工业锯”一起购买的其他产品:
*g.V().hasLabel('product').has('productName', 'Industrial Saw').outE('boughtWith')*
下面是结果的样子:
*[
{
"id": "6c69fba7-2f76-421f-a24e-92d4b8295d67",
"label": "boughtWith",
"type": "edge",
"inVLabel": "product",
"outVLabel": "product",
"inV": "faaf0997-f5d8-4d01-a527-ae29534ac234",
"outV": "a9b13b8f-258f-4148-99c0-f71b30918146"
},
{
"id": "946e81a9-8cfa-4303-a999-9be3d67176d5",
"label": "boughtWith",
"type": "edge",
"inVLabel": "product",
"outVLabel": "product",
"inV": "82e1556e-f038-4d7a-a02a-f780a2b7215c",
"outV": "a9b13b8f-258f-4148-99c0-f71b30918146"
}
]*
除了传统的客户端,你可以使用图形批量执行程序。NET 库在 Azure Cosmos DB Gremlin API 中执行批量操作。与使用 Gremlin 客户端相比,使用此功能将提高数据迁移效率。传统上,使用 Gremlin 插入数据将要求应用程序在需要验证、评估、然后执行以创建数据的时候发送一个查询。批量执行器库将处理应用程序中的验证,并为每个网络请求一次发送多个图形对象。以下是如何创建顶点和边的示例:
*IBulkExecutor graphbulkExecutor = new GraphBulkExecutor(documentClient, targetCollection);BulkImportResponse vResponse = null;
BulkImportResponse eResponse = null;try
{
vResponse = await graphbulkExecutor.BulkImportAsync(
Utils.GenerateVertices(numberOfDocumentsToGenerate),
enableUpsert: true,
disableAutomaticIdGeneration: true,
maxConcurrencyPerPartitionKeyRange: null,
maxInMemorySortingBatchSize: null,
cancellationToken: token); eResponse = await graphbulkExecutor.BulkImportAsync(
Utils.GenerateEdges(numberOfDocumentsToGenerate),
enableUpsert: true,
disableAutomaticIdGeneration: true,
maxConcurrencyPerPartitionKeyRange: null,
maxInMemorySortingBatchSize: null,
cancellationToken: token);
}
catch (DocumentClientException de)
{
Trace.TraceError("Document client exception: {0}", de);
}
catch (Exception e)
{
Trace.TraceError("Exception: {0}", e);
}*
虽然可以使用核心(SQL) API 作为 JSON 文档来建模和存储这些数据,但是它不适合需要确定实体(例如产品)之间关系的查询。
Azure 桌面储物系列!
如果你已经有了为 Azure Table storage 编写的应用程序,它们可以通过使用 Table API 迁移到 Azure Cosmos DB,而不需要修改代码,并利用高级功能。
将您的数据库从 Azure Table Storage 迁移到 Azure Cosmos DB,以较低的吞吐量,可以在延迟(一位数毫秒的读写)、吞吐量、全局分布、全面的 SLA 以及成本方面带来很多好处(您可以使用基于消耗的或供应容量模式。将表数据存储在 Cosmos DB 中会自动索引所有属性(没有索引管理开销),而表存储只允许对分区和行键进行索引。
Table API 具有可用于的客户端 SDK。例如,对于 Java 客户端,使用连接字符串来存储表端点和凭证:
*public static final String storageConnectionString =
"DefaultEndpointsProtocol=https;" +
"AccountName=your_cosmosdb_account;" +
"AccountKey=your_account_key;" +
"TableEndpoint=https://your_endpoint;" ;*
…并执行 CRUD(创建、读取、更新、删除)操作,如下所示:
*try
{
CloudStorageAccount storageAccount =
CloudStorageAccount.parse(storageConnectionString); CloudTableClient tableClient = storageAccount.createCloudTableClient(); CloudTable cloudTable = tableClient.getTableReference("customers");
cloudTable.createIfNotExists(); for (String table : tableClient.listTables())
{
System.out.println(table);
} CustomerEntity customer = ....;
TableOperation insert = TableOperation.insertOrReplace(customer);
cloudTable.execute(insert); TableOperation retrieve =
TableOperation.retrieve("Smith", "Jeff", CustomerEntity.class);
CustomerEntity result =
cloudTable.execute(retrieve).getResultAsType(); TableOperation del = TableOperation.delete(jeff);
cloudTable.execute(del);
}*
参考 表 API 哪里和 Azure 表存储行为不一样? 了解详情。
结论
Azure Cosmos DB supports 在 API 方面提供了许多选项和灵活性,并且根据您的用例和需求有其优缺点。虽然核心(SQL)非常通用,并且适用于广泛的场景,但是如果您的数据能够更好地用关系来表示,那么 Gremlin (graph) API 是一个合适的选择。如果您有使用 Cassandra 或 MongoDB 的现有应用程序,那么将它们迁移到各自的 Azure Cosmos DB APIs 提供了一条阻力最小且具有额外好处的路径。如果您想从 Azure 表存储中迁移,并且不想重构您的应用程序以使用核心(SQL) API,请记住,您可以选择 Azure Cosmos DB 表 API,它可以提供与表存储的 API 兼容性以及诸如保证高可用性、自动二级索引等功能!
Azure Data Factory CI-CD 简化版:使用 Azure DevOps YAML 管道构建和部署 ARM 模板
发布/部署 Azure 数据工厂工件的最简单方式
安德里亚斯·费尔斯克在 Unsplash 上的照片
如果你使用 Azure Data Factory,你可能会注意到这个工具的部署过程是独一无二的。它不同于 API 或网站部署,因为它生成 ARM 模板,并且在某些时候肯定会问“为什么部署它如此困难?”。嗯,不一定是…
数据工厂 CI/CD —旧的(有问题的)流程
Azure Data Factory 是大数据流程的优秀编排工具。它有许多集成和功能,使数据工程师的生活非常容易。
虽然当我们谈论部署时,有一些技巧,例如工作区内的发布按钮,这是生成要部署的 ARM 模板所必需的。此外,没有部署到开发环境中,因为您已经在那里作为一个编辑器工具工作。与其他“传统开发”相比,这个过程有点不同,这个手动步骤让开发人员不寒而栗:
从 Azure 数据工厂工作区部署—图片来自微软文档
它经常创建讨论和“变通办法”来处理这个手动步骤。在一些解决方案中,人们将生成 ARM 模板从 adf_publish 手动移动到 feature 分支,并创建新的提交。在其他情况下,有一个使用多个 repo 的集成,但是同样,启动部署应该是一个手动步骤。
在旧的方法上,从我的角度来看,最好的解决方案是使用 Azure Powershell 进行部署,但这增加了复杂性,因为您需要手动控制所有应该部署的元素,如链接的服务和管道。
数据工厂 CI/CD —新的(更好的)流程
幸运的是,有一种新的方法可以生成要部署的 ARM 模板,您不需要上面提到的变通方法。
在这种策略中,您基本上是验证您的数据工厂 JSON 文件并将其“构建”到准备使用的 ARM 模板中。为了让它工作,你需要创建一个构建管道并使用 ADFUtilities NPM 包。这样就干净多了,手动步骤也消失了:)。
部署新的 Azure 数据工厂流程——图片来自微软文档
更多信息,查看官方文档这里。
如何使用 IaC 创建 Azure 数据工厂
基础设施作为代码
在你的项目中使用 IaC 有很多理由,你可以在这里查看。其中之一是基础设施作为代码是实现您的环境的最简单快捷的方式。所以,既然我们想保持 ADF 部署简单,为什么不使用它呢:)?
在这个例子中,我将使用 Bicep 模板来部署我们的数据工厂。如果 Bicep 对你来说是新的,它基本上是一种 DSL(领域特定语言),让 ARM 模板用户更容易使用。
Bicep 对 VS 代码有很好的扩展——图片来自微软文档
在这篇文章中,您可以查看如何使用 git 集成为数据工厂创建 Bicep 文件,该文件将用于部署 ADF。
它将在你的 Azure 数据工厂和你的 git repo 之间创建一个链接(它在 Azure DevOps 和 GitHub 上工作),所以当你在你的数据工厂中创建一个管道时,它也将被版本化到 git repo 中。
Git 储存库
知识库结构
回购结构将取决于每个项目。最佳实践之一是在同一个 repo 中保留部署项目所需的所有代码。因此,我喜欢创建一个结构,其中有组件的名称,并且下面总是有一个“src”文件夹。在这种情况下,我们将把 src 文件夹作为 git 集成过程中的“根文件夹”。
存储库结构—按作者分类的图像
构建 ARM 模板所需的文件
一些文件是必要的,在我们的回购生成模板。这些文件需要添加到 src 文件夹中,在构建阶段会被引用。
在 src 文件夹中创建 package.json 文件,它包含将用于构建 ADF 工件的包的元数据。
在同一个文件夹中,创建包含以下内容的 publish_config.json 文件。这不会影响 ARM 模板的生成,但是运行构建是必要的:
最后一个文件是 ARM-template-Parameters-definition . JSON。我不会进入细节,因为它需要一个专门的职位。对于初始版本,您可以创建以下内容:
在创建 git integrate 和所有必要的文件之后,这就是你的回购看起来的样子:
Azure 数据工厂的存储库结构—按作者分类的图片
如何为 Azure 数据工厂创建构建 YAML 管道
毫无疑问,管道作为代码将是管道定义的未来,具有版本控制和可重用性的能力。
变量
第一个必要的配置是变量。它们将被用于以后的构建和发布。
构建阶段最重要的变量是:
- 这是 src 目录。必须有上面提到的所需文件。
- dataFactoryResourceId -用您的 ADF 的资源 Id 填充它。这是一个好主意,使其参数化,以在不同的环境中工作
构建和部署变量—按作者分类的图像
构建数据工厂
如上所述,我们需要在构建过程中使用 ADFUtilities NPM 包。
在前两个任务中,NodeJS 是在构建代理中配置的。注意我们在变量部分提到的 workingDir 变量。
在最近的两个任务中,我们调用 NPM 包来验证和“构建”我们的数据工厂,并生成 ARM 模板。在最后一个任务中,“工件”是相对输出目录。这意味着它将是 ARM 模板的输出目录。
为 Azure 数据工厂构建任务—按作者分类的图片
在接下来的任务中,我们将把 ARM 模板从输出复制到暂存目录,并将 bicep 文件“构建”到 ARM 模板中。这些将用于创建 Azure 数据工厂工作区。
为 Azure 数据工厂构建任务—按作者分类的图片
在运行构建管道之后,您将拥有将在部署阶段使用的工件:
Azure 数据工厂工件——作者图片
Azure 数据工厂 ARM 模板—作者图片
如何为 Azure 数据工厂创建发布 YAML 管道
为了部署数据工厂,我们使用运行一次策略。它将消耗在构建阶段创建的工件
发展
当在开发环境中启用 git 集成时,因为代码是在工作区中生成的,所以不需要在这个环境中发布。它将只部署使用基础设施作为代码模板的环境。它还包含构建阶段的依赖项。
开发环境—作者图片
UAT 和生产
在 UAT,我们依赖发展环境。在生产方面,依赖于 UAT。在这些阶段,我们需要部署基础架构和代码,我们将使用预部署和部署作业:
部署前阶段—作者提供的图像
部署阶段—按作者排列的图像
在运行时,它将首先在预部署阶段使用 Bicep 文件创建基础设施,然后部署在构建阶段生成的工件。这是最后的结果:
部署管道—按作者分类的图片
关键要点
部署 Azure Data Factory 的策略不止一种,我已经尝试了其中的大部分,它们工作得非常好,但在我看来,这是实现完全自动化部署的最简单、最干净的方法。
下面您可以查看用于部署它的完整 YAML。你也可以在我的 GitHub repo 中查看其他 Azure DevOps YAML 模板示例:devo psnights/azuredevops-YAML-quick start-Templates(github.com)
希望能有用!
基于容器映像构建的 AWS Lambda 的 Azure DevOps CI/CD 管道
Azure DevOps 中的 CI/CD 管道介绍,用于自动执行使用 docker 容器构建的 AWS Lambda 的构建过程。
Jean-Philippe Delberghe 在 Unsplash 上拍摄的照片
介绍
我最近的文章关注了 AWS 中一个相当新的功能,即通过容器映像构建 AWS Lambda。
来自 AWS 控制台的图像
这一新功能使得打包 AWS Lambda 所需的所有代码依赖项变得非常容易,而且就在 Lambda 的源代码旁边。这也消除了将代码从您最喜欢的 IDE 中复制并粘贴到 AWS 控制台中的倾向,并使事情变得无序。您的源代码现在成为部署到 AWS 中的所有代码的根,这使得事情变得非常顺利和有条理。
当我开始看到用容器映像构建我的 AWS lambda 的美妙之处时,我并不热衷于通过命令行进行维护,如果我对 docker 文件或包含 AWS lambda 代码的文件进行任何更改,这就是我最初维护代码部署的方式。所以,我开始研究 CI/CD 管道。
CI/CD 代表:
- CI-持续集成
- CD-连续部署
参见此文章了解更多信息。
有很多不同的工具可以用来构建 CI/CD 管道,但我决定使用 Azure DevOps,因为我对该工具很熟悉。自由层允许创建一个 CI/CD 管道。Jenkins是一个非常受欢迎的开源解决方案。Azure DevOps 与 AWS 合作创建了一个工具包,使得创建构建管道变得非常容易。
步骤 1:使用版本控制分发服务器组织您的代码
有许多不同的版本控制发行商。只要确保你有办法把你的代码连接到 Azure DevOps。出于本教程的目的,我们将构建一个 docker 文件,并更新已经内置在 AWS 中的 AWS Lambda。要跟进,请确保您已经完成了这些步骤。如果您在这些方面需要任何帮助,请随意阅读我之前的两篇关于如何构建 AWS Lambda 的文章。
步骤 2:创建 Azure DevOps 帐户
这里有一个开始使用的链接。这是免费的,如果你有一个 Github 帐户,你可以使用它来加快这个过程。
步骤 3:创建您的存储库
根据代码存储的位置和方式,这一步可能会因人而异。总体目标是在 Azure DevOps 中连接或建立代码存储库,以便您的管道可以访问构建过程所需的文件。
这可以在左侧面板的 Repos 部分找到。
来自 Azure DevOps 的回购部分
您可以从 Azure DevOps 的这个部分创建一个新的存储库、导入一个存储库并管理您的存储库。
Azure DevOps 中的存储库选项
第四步:创建新的管道
导航到左侧面板上的管道选项。选择底部的“使用经典编辑器”。
Azure DevOps 中的新管道构建
然后,您将选择代码所在的位置,以及您想要从哪个存储库和分支进行构建。
连接到 Azure DevOps 中的存储库
接下来,将提示您选择一个模板。选择顶部的“空工单”。
在这里,您将能够自动化构建 docker 映像、将其推送到 AWS ECR 以及基于更改更新 lambda 的整个过程。整个过程大约需要 4 分钟。
在 Azure DevOps 中创建管道
首先,我们将使用构建 docker 映像的模板来构建 docker 映像。单击代理作业 1 旁边的+。
Azure DevOps 中的 Docker 构建
添加完成后,点击即可开始。
Docker 图像说明
需要注意一些事情:
- 确保将任务版本更改为*0。
- 确保您拥有 docker 文件的正确路径。您可以使用输入旁边的省略号在 repo 中找到它。
- 在图像名称上,它必须与您在 ECR 中为标签使用的名称相匹配。在我以前的文章中,我将其标记为 lambda_dependencies。
AWS 中的 ECR 存储库名称
我们现在将通过单击代理作业旁边的+添加下一个任务。这一次,我们将添加一个作业,将新更新的 docker 映像推送到云中。
来自 Azure DevOps 的 ECR 推送
AWS 工具包使得使用所有 AWS 服务变得非常容易。您所要做的就是用您的访问令牌连接这两个服务
ECR 推送构建创建
在显示+New 的地方,您将添加您的 AWS 凭证。
Azure DevOps 中的 AWS 凭据
最后,我们将添加另一个作业并找到 AWS CLI 任务。这将用于用最新版本的 docker 映像更新我们的 lambda。
Azure DevOps 中的 AWS CLI 任务
AWS CLI 允许您调用您想要的任何命令和子命令。这只是完成工作的一个简单方法。
在 Azure DevOps 中设置 AWS CLI
需要对典型的 CLI 命令进行一点转换,比如从一开始就删除 AWS,并像命令/子命令/和参数一样进行拆分。
当你完成时,事情应该是这样的。
完成的管道
现在,您已经准备好对其进行测试,并通过点击 Save 和 Queue 来查看神奇的事情发生了。拿些爆米花。
步骤 5:测试构建管道
您可以通过保存编辑和排队来手动触发构建管道。Azure DevOps 在快速浏览构建方面做得很好。如果您单击代理作业 1,您可以看到幕后实际发生的情况。(魔术)
Azure DevOps 中的构建摘要
代理作业 1 将向您显示日志以及管道在其进程中所处的位置。整个过程大约需要 4 分钟。
构建日志
管道完成后,您的屏幕将显示作业进展情况的总体统计数据。
成功
此时,你应该庆祝一下!😃
步骤 6:决定什么应该触发构建管道
在管道创建面板中,有一个触发器部分。CI/CD 的目的是持续集成和部署,因此下面显示了如何实现这一点。您可以在 repo 中选择一个分支,以便在每次提交该分支时触发构建管道。还有一些其他选项,比如制定一个时间表,或者让它在不同的构建完成时触发。我的偏好,尤其是在云中工作时,是在每次提交后构建。它让我的代码在我的机器上和云中保持干净和最新。
Azure DevOps 中的触发器管道
第七步:坐下来,放松一下,下次再做承诺
每当我自动化一些东西时,我总是需要花一些时间放松和享受我的好工作。
结论
使用容器映像构建 AWS Lambda 函数的能力改变了游戏规则。将它与 CI/CD 配对可以确保您的包依赖项从 docker 文件同步到本地写到云中的 lambda 函数。我希望你喜欢这个教程,并且它可以让你在每次修改你的 lambdas 时,不用再通过命令行来维护你的 docker 镜像。
干杯。
面向机器学习工程师的 Azure
了解 Azure 提供的所有不同的人工智能服务,以及何时应该使用它们
马库斯·温克勒在 Unsplash 上的照片
介绍
随着越来越多的公司决定将其内部数据中心迁移到云中,云技能现在变得越来越重要。
2020 年,微软 Azure 被宣布为增长最快的云提供商[1],因此我决定挑战自己,了解更多关于他们的数据科学服务,并完成他们的 Azure 数据科学家认证。
https://www.credly.com/badges/a91b0677-0a13-433e-a19b-cb06add00a9a
在本文中,我们将介绍一些 Azure key 机器学习服务,以及它们如何相互比较,以创建完整的人工智能解决方案。如果您有兴趣了解更多关于云计算和大数据系统的基础知识,可以在我以前的文章“数据科学家的云基础”和“大数据分析:Spark 和 Hadoop”中找到更多信息。
Azure 服务
Azure 提供了 4 个不同的抽象级别,可以用来创建端到端的机器学习解决方案:
- Azure 应用人工智能服务
- Azure 认知服务
- Azure 机器学习
- 人工智能基础设施
Azure 应用人工智能服务
在这个层面上,Azure 提供了一套专门的人工智能服务,这些服务是根据特定的业务场景设计的。这些类型的服务建立在 Azure 认知服务 API 之上,以便为最终用户提供不同类型的预制模型,这些模型可以在特定的业务环境中使用,几乎没有任何形式的设置要求。应用人工智能服务的一些例子是:
- Azure Form Recognizer: 从文档集合中自动提取知识,并以结构化数据格式输出结果,该格式能够提供多条信息,例如:关系、边界框等。
- Azure Metrics Advisor: 执行时序数据的监控和异常检测,以便从数据中自动计算度量并驱动决策。
- Azure Cognitive Search: 使使用人工智能排名功能快速查找和探索大规模组织内可用的内容成为可能。
- **Azure Bot 服务:**利用预先构建的自然语言模型来快速构建对话机器人。Azure Bot Service Composer 另外提供了一个可视化界面,以便尽可能容易地创建和测试您的虚拟代理。
Azure 认知服务
认知服务是一个可定制的 API 集合,用于与视觉、语音、决策和语言相关的任务。利用这些 API,你就可以在你的应用中集成人工智能的能力,甚至不需要任何关于数据科学和机器学习的专业知识。可以通过使用许多不同的方法来利用 Azure 认知服务,例如:Azure 门户(主要的 Azure 用户界面)、Azure 命令行界面、SDK 库(用 C#、Java、JavaScript 和 Python 等语言)和 Azure 资源管理器模板。认知服务中可用能力的一些例子是:
- 语音到文本转换
- 语音翻译
- 说话人识别
- 异常检测
- 内容审核
- 使用 Bing 搜索新闻
- 物体识别
下面是一个简单的例子,展示了开始使用认知服务 API 是多么容易(图 1)。
图 1: Azure 认知服务计算机视觉应用编程接口(图片由作者提供)。
Azure 机器学习
Azure ML 是一个端到端的平台,可用于准备、构建、训练和部署您自己的机器学习模型和管道(而不是使用微软创建的预制模型)。为了使这成为可能,Azure 提供了图形界面(如拖放设计器和 AutoML 功能)和编码环境(如 Jupyter Lab ),以使用常见的开源库(如 Tensorflow、Keras、PyTorch、ONNX 等)开发您自己的模型
在同一环境中创建终端部署模型,可以遵循常见的 MLOps(机器学习→操作)实践,跟踪 ML 实验并监控它们在生产环境中的性能,以便在出现任何数据漂移时尽快做出反应。
Azure 机器学习提供的一些关键功能是:
- 数据标记
- 协作笔记本环境
- 用于时间序列预测、分类和回归的自动化机器学习工具
- 使用拖放工具创建 ML 管道
- 内置 MLOps 功能
- 内置模型可解释性可视化
下面是一个简单的例子,展示了 Azure 机器学习平台的不同部分(图 2)。
图 2: Azure 机器学习平台(图片由作者提供)。
人工智能基础设施
最后,Azure 还提供了不同的可扩展虚拟机,用户可以选择这些虚拟机来创建和运行他们的机器学习和数据科学项目。通过这种方式,用户能够完全控制他们的开发环境和他们想要使用的不同包。
此外,Azure 还提供特定于数据科学的虚拟机,这些虚拟机预打包了一些最常见的数据科学库(例如 TensorFlow、Keras、MLFlow 等)。
结论
总的来说,Azure 提供了一套完整的服务,可以用来在分析生命周期的任何阶段处理数据。除了微软的人工智能服务,Azure 还提供了一个市场,用户可以在这个市场上决定使用其他组织创建的人工智能服务,如 Azure Databricks(针对优化的 Apache Spark)、SAS Viya、DataRobot、Dataiku、H2O.ai 等
如果你有兴趣了解更多关于 AWS 等其他人工智能云提供商服务的信息,可以在我之前的文章“机器学习工程师的 AWS”中找到更多信息。
联系人
如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:
文献学
[1]微软 Azure 是目前发展最快的云平台。他们有你可以满足的关键需求。TheNextWeb。访问地址:https://then extweb . com/news/Microsoft-azure 是发展最快的云计算平台,而他们已经得到了你可以满足的关键需求
引擎盖下的 Azure 机器学习:组件和架构
来源: Unsplash
Azure 机器学习(ML)是一个端到端的工具,用于管理机器学习和深度学习管道。它可以跨大型计算资源池自动进行培训,并帮助您在生产中部署模型和管理生产应用程序的推理。
当您在组织中采用 Azure ML 时,更深入地理解它的结构和组件是一个好主意。这篇文章旨在展示 Azure 机器学习的内部工作原理。
在简要回顾了它的功能之后,我将继续描述它的关键组件,包括工作空间、计算、实验和快照,并描述系统在训练你的机器学习模型时所经历的工作流程。
什么是 Azure 机器学习?
Azure Machine Learning (ML)提供的工具旨在帮助数据科学家构建、部署和训练他们的机器学习算法。你可以使用 Azure ML 来训练任何类型的机器学习模型,包括传统的机器学习、监督算法和非监督机器学习。
Azure ML 支持多种语言,包括 Python 和 R,以及一系列 SDK。你也可以利用 Azure ML 的 studio,它为无代码或低代码 ML 和深度学习(DL)模型提供了一个工作空间。
Azure ML 为端到端机器学习操作提供了许多工具,包括:
- Azure ML 的设计师——(预览版)提供了构建实验和部署管道的拖放模块。
- Jupyter 笔记本 —让您使用预制的示例笔记本或创建自己独特的笔记本。
- R 脚本或笔记本——让您在编写自己的代码库时使用 R SDK,或者在设计器中使用 R 模块。
- 多模型解决方案加速器 —(预览)基于 Azure ML,该解决方案使您能够构建、训练和管理成百上千的 ML 模型。
Azure ML 提供了更多的功能,比如机器学习 CLI 和
Visual Studio 代码扩展。该平台与 TensorFlow、PyTorch、Ray RLlib 等开源框架协同工作,用于强化学习等。它还集成了各种各样的外部库,如 Git 和 MLFlow。
Azure 机器学习组件
让我们来看看 Azure 机器学习生态系统的基本组件。
工作空间
工作区是 Azure 中的中心资源,它保存着您的机器学习管道和所有相关资源。它是以下方面的焦点:
- 管理用于训练和部署机器学习模型的资源
- 存储 Azure 机器学习管道使用和创建的资产
工作区包括工作区使用的其他 Azure 资源:Azure 容器注册表(ACR);Azure 存储帐户,用作工作区的默认数据存储。Azure 应用洞察,用于监控;和 Azure Key Vault,它存储用于执行模型的秘密。
计算
Azure Machine Learning 不仅管理模型,它还提供计算资源,您可以使用这些资源在训练和推理模式下运行它们。Azure ML 提供两种类型的计算资源:
计算实例
包括机器学习工具和环境的预配置 Azure 虚拟机(VM)。计算实例通常用作开发机器-在模型开发的早期阶段,您可以启动实例并立即开始运行笔记本电脑。或者,它们也可以用于运行模型的训练和推理。
计算集群
具有自动扩展能力的虚拟机集群。这些适用于大型培训操作,以及在生产中运行模型。当您通过 Azure ML 提交作业时,集群会自动扩展以提供作业所需的资源。
数据集和数据存储
Azure 数据集使得访问和使用你的数据变得容易。Azure ML 创建对您的数据的引用,以及其元数据的副本。数据不会复制到 Azure ML 中,而是保留在原处,因此没有额外的存储成本,也没有数据完整性和安全性的风险。
模型
在最简单的情况下,模型是接受输入并产生输出的代码。机器学习模型通常包括算法、输入数据集和影响算法如何生成输出或预测的超参数。经过一轮或多轮训练后,模型已经从输入数据集中“学习”了它可以学习的内容,并可以根据看不见的数据生成预测。
你可以将之前训练过的模型导入 Azure ML,或者引入新模型的代码,并使用 Azure ML 在 Azure cloud 中提供的计算上训练它。模型被注册为工作空间的一部分。
运行和实验
运行是训练脚本的一次执行。实验是一组运行。两者都存储为工作区的一部分。Azure 机器学习记录每次运行的数据,并保存实验中的信息。这包括:
- 执行元数据—时间戳、持续时间
- 您的培训脚本生成的任何指标
- 作为实验的一部分上传的或由训练脚本生成的任何输出文件
- 包含预运行脚本的文件夹的完整快照
管路可以有“子管路”,您可以将几个级别的管路嵌套在一起。这使您可以自动化复杂的培训程序。
快照
每次运行时,Azure ML 都会获取包含训练脚本的目录,对其进行压缩,并将其复制到计算目标。然后,该脚本在一个或多个计算目标上运行。作为实验的一部分,相同的压缩文件存储在运行记录中。
这提供了对在哪里运行了什么实验的完全可见性,并确保每次都一致地执行训练运行,这与在各种机器上复制和手动运行脚本的临时程序形成对比,后者容易出错且难以跟踪。
幕后:培训工作流程
了解 Azure 机器学习如何在幕后操作和训练模型可能会有所帮助。
每次在 Azure ML 中运行实验时,都会发生以下步骤:
- 请求运行,快照 ID 指向包含代码模型和训练脚本的目录的快照。
- Azure ML 启动,创建一个运行 ID 和一个机器学习服务令牌,计算目标可以在后面的阶段使用。
- 用户为运行选择一个计算目标——这可以是托管的目标(Azure ML 计算资源的两种类型之一),也可以是未托管的目标,它只是一个常规的虚拟机,用户已经在其上安装了机器学习环境。
数据流操作如下:
- 计算目标从密钥库中检索 SSH 凭证,密钥库是 Azure 订阅的一部分。
- Azure ML 管理代码被写到用户的 Azure Files 帐户下的文件共享中(了解 Azure Files 如何工作
- Azure ML 将快照下载到计算实例
- Azure ML 通常使用 Docker 容器在计算目标上设置所需的环境,并设置配置和环境变量。容器使用 Azure ML 管理代码启动,并运行用户的培训脚本。
- 当训练运行完成时,Azure ML 将指标从存储到 Cosmos DB。然后,您可以在 Azure ML 用户界面中看到从 Cosmos 数据存储中提取的结果。
来源:蔚蓝
结论
Azure Machine Learning 巧妙利用 Azure 服务和基础设施,为您提供真正的端到端机器学习工作流管理。我们讨论了 Azure ML 基础设施的关键组件,包括:
- 工作区 —由模型、计算资源和数据集组成的中央实体
- 数据集 —对存储在 Azure 中的机器学习数据集的引用
- 计算 — Azure 虚拟机或虚拟机集群,让您运行分布式培训
- 运行和实验 —用于管理和跟踪训练迭代的实体
学习操作整个过程可能需要一个学习曲线,但一旦您的组织开始大规模培训模型并通过一次点击将它们部署到用户,这将会带来回报。
Azure ML 和 DevOps 遇见泰坦尼克号
Azure Machine Learning 是一个云服务,用于加速和管理机器学习项目生命周期。它使您能够创建模型或使用从开源平台(如 Pytorch、TensorFlow 或 scikit-learn)构建的模型。Azure ML 补充了额外的 MLOps 工具,帮助您监控、重新训练和重新部署模型。
在这篇博文中,我想展示如何使用 Azure 机器学习笔记本和计算实例进行开发,使用集群进行培训,使用容器网站进行生产,来构建、培训和部署一个模型。对于这个演示,我们将使用泰坦尼克号乘客数据( Titanic.csv ),使用随机森林模型预测谁将幸存。
设置环境
如果你有一个 Azure 帐户,你可以去 Azure 门户网站创建一个机器学习工作区。你可以使用搜索栏找到机器学习,然后点击创建按钮。
图片由 Piethein Strengholt 提供
接下来,您需要填写项目细节,比如您的订阅 ID、资源组名称和工作区名称。你可以从基础开始,所以点击“查看+创建”。
图片由 Piethein Strengholt 提供
部署后,您可以使用资源组概述窗格检查所有新创建资源的结果。
图片由 Piethein Strengholt 提供
Azure 机器学习服务自带默认存储账号。在我们的演示中,您将使用这个默认的存储帐户来使我们的 Titanic 数据可用。点击存储账号,点击默认的 azureml-blobstore-xxx 容器,使用上传按钮上传你的 Titanic.csv 数据。
图片由 Piethein Strengholt 提供
在本演示中,您还需要使用存储帐户访问密钥。点击返回并转到默认存储帐户。在左侧点击“访问密钥”,点击“显示密钥”,并将密钥信息复制到一个安全的位置供以后使用。
服务主体认证
为了将机器学习工作流设置为自动化过程,我推荐使用服务主体认证。这种方法将身份验证从任何特定的用户登录中分离出来,并允许管理访问控制。
第一步是创建服务主体。首先选择 Azure Active Directory 和 App 注册。然后选择+New application,给你的服务主体起个名字,比如my-SVP-machine-learning。您可以保持其他参数不变。
图片由 Piethein Strengholt 提供
从您新创建的服务主体的页面中,复制应用程序 ID 和租户 ID ,因为稍后需要它们。然后选择证书&秘密,和**+新客户秘密为你的密钥写一个描述,并选择持续时间。然后点击添加**,将客户端机密的值复制到安全位置以备后用。
图片由 Piethein Strengholt 提供
最后,您需要授予服务主体访问 Azure ML 工作空间的权限。导航到资源组,导航到机器学习工作区的资源组。然后选择访问控制(IAM)并添加角色分配。对于角色,指定需要授予的访问权限级别,例如参与者。开始输入您的服务主体名称,找到后,选择它,然后单击 Save。
图片由 Piethein Strengholt 提供
Azure 机器学习
设置好一切后,我们就可以开始了。悬停回到机器学习服务并启动工作室。
图片由 Piethein Strengholt 提供
启动 studio 环境后,您将看到一个包含许多框和控件的概览屏幕。让我给你一个组件的高层次理解,以及它们如何一起工作,以协助建立,部署和维护机器学习模型的过程。
图片由 Piethein Strengholt 提供
- 一个工作区是集中所有服务和平台组件的地方。
- 一个计算目标是您用来运行您的培训脚本或托管您的服务部署的任何机器或一组机器(集群)。
- 数据集使访问和处理数据变得更加容易。通过创建数据集,可以创建对数据源位置的引用及其元数据的副本。
- 环境是对你的机器学习模型进行训练或评分的环境的封装。
- 一个实验是来自一个指定脚本的许多运行的分组。它总是属于一个工作区。提交运行时,您需要提供一个实验名称。
- 一次运行是训练脚本的一次执行。一个实验通常包含多次运行。
- 一个笔记本用来在集成的 Jupyter 笔记本服务器上编写和运行你自己的代码。
设置计算实例
为了开发新的模型,您需要有一个计算实例,这是一个包含为机器学习安装的多个工具和环境的容器。计算实例主要用于开发工作站。该计算实例还可以用作培训和推理作业的计算目标。在左侧,单击 compute 并创建一个新的计算实例。您现在可以保留默认设置,因此单击“Create”创建您的第一个计算实例。
图片由 Piethein Strengholt 提供
构建您的第一台笔记本电脑
让我们继续我们的旅程,开发我们的泰坦尼克号生存预测模型。您将通过使用 Jupyter 笔记本来完成此操作。点击“笔记本”和“新建”,然后选择创建新笔记本。左侧的文件夹和文件结构将类似于您在下图中看到的内容。点击+新建。在我的例子中,我输入 Titanic.ipny 作为我的第一个笔记本,但是你可以选择任何名字。请注意,这是为了开发和测试的目的。
图片由 Piethein Strengholt 提供
对于模型本身,我使用了来自 towardsdatascience.com 的预测泰坦尼克号乘客生存的文章。我用额外的配置增强了代码,以将流程与 Azure ML 紧密集成。让我们一行一行地浏览脚本:
# importing necessary librariesfrom azureml.core import Workspace, Datastore, Dataset, Experiment, Model
from azureml.data.dataset_factory import DataType# importing sklearn librariesimport sklearn
from sklearn import linear_model
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import MinMaxScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn import preprocessing# Useful for good split of data into train and test
from sklearn.model_selection import train_test_split# import pandas
import pandas as pd# linear algebra
import numpy as np# import re package
import re# import joblib
import joblib# import seaborn
import seaborn as sns# import matplotlib
%matplotlib inline
from matplotlib import pyplot as plt
导入所有必需的库需要第一个代码块。azureml.core 包是与我们的 azureml 工作空间进行通信所必需的。我们的模型需要其余的包,比如 sklearn。
# get existing workspace
ws = Workspace.from_config()# set connection string settings
blob_datastore_name='machinelearnin9342837683'
container_name=os.getenv("BLOB_CONTAINER", "azureml-blobstore-867fb2e1-6f13-4490-bc45-291d19912ec0")
account_name=os.getenv("BLOB_ACCOUNTNAME", "machinelearnin9763237684")
account_key=os.getenv("BLOB_ACCOUNT_KEY", "ExMnf3yB6usdSLi96wo53MMDA/QX5E6WnccJHAq1ECawHDDb5WI1ATw9UUqS3lgHQm69oKfNwWIrUtlSXZ1RQA==")# register blob storage account within AMLS
datastore = Datastore.register_azure_blob_container(workspace=ws,
datastore_name=blob_datastore_name,
container_name=container_name,
account_name=account_name,
account_key=account_key,
overwrite=True)# connect to the azure blob storage account
try:
datastore = Datastore.get(ws, blob_datastore_name)
print("Found Blob Datastore with name: %s" % blob_datastore_name)
except UserErrorException:
datastore = Datastore.register_azure_blob_container(
workspace=ws,
datastore_name=blob_datastore_name,
account_name=account_name, # Storage account name
container_name=container_name, # Name of Azure blob container
account_key=account_key,
protocol=http) # Storage account key
print("Registered blob datastore with name: %s" % blob_datastore_name)# attach Titanic.csv file
dataset = Dataset.Tabular.from_delimited_files(path=[(datastore, 'Titanic.csv')])
下一个代码块需要访问我们的工作区,并从您的存储帐户和容器中检索大量数据。此脚本中的凭据用于将存储帐户注册为新的数据存储(从您的安全位置复制粘贴访问密钥)。一旦连接上,你就可以删除这些行项目,因为 Azure ML 会进一步处理这个问题。这允许您不在脚本中放置任何凭据。现在,就让它这样吧。
# register Dataset as version 1
dataset.register(workspace = ws, name = 'titanic', create_new_version = True)
下一行项目是关于将该数据集注册为版本 1。
experiment = Experiment(ws, "TitanicExperiment")
run = experiment.start_logging(outputs=None, snapshot_directory=".")
下一步是你将注册你的泰坦尼克号实验。这很有用,因为通过实验,您可以查看所有使用的输入数据集、训练和测试数据、结果、日志记录信息等等。让我们跳到机器学习模型本身。
# convert dataset to pandas dataframe
titanic_ds = dataset.to_pandas_dataframe()print("Examine titanic dataset")
titanic_ds.info()print("Show first records")
titanic_ds.head(10)# convert ‘Sex’ feature into numeric
genders = {"male": 0, "female": 1}
data = [titanic_ds]
for dataset in data:
dataset['Sex'] = dataset['Sex'].map(genders)# since the most common port is Southampton the chances are that the missing one is from there
titanic_ds['Embarked'].fillna(value='S', inplace=True)# convert ‘Embarked’ feature into numeric
ports = {"S": 0, "C": 1, "Q": 2}
data = [titanic_ds]
for dataset in data:
dataset['Embarked'] = dataset['Embarked'].map(ports)# convert ‘Survived’ feature into numeric
ports = {False: 0, True: 1}
data = [titanic_ds]
for dataset in data:
dataset['Survived'] = dataset['Survived'].map(ports)# a cabin number looks like ‘C123’ and the letter refers to the deck.
# therefore we’re going to extract these and create a new feature, that contains a persons deck.
deck = {"A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "U": 8}
data = [titanic_ds]
for dataset in data:
dataset['Cabin'] = dataset['Cabin'].fillna("U0")
dataset['Deck'] = dataset['Cabin'].map(lambda x: re.compile("([a-zA-Z]+)").search(x).group())
dataset['Deck'] = dataset['Deck'].map(deck)
dataset['Deck'] = dataset['Deck'].fillna(0)
dataset['Deck'] = dataset['Deck'].astype(int)# drop cabin since we have a deck feature
titanic_ds = titanic_ds.drop(['Cabin'], axis=1)# fix age features missing values
data = [titanic_ds]
for dataset in data:
mean = titanic_ds["Age"].mean()
std = titanic_ds["Age"].std()
is_null = dataset["Age"].isnull().sum()
# compute random numbers between the mean, std and is_null
rand_age = np.random.randint(mean - std, mean + std, size = is_null)
# fill NaN values in Age column with random values generated
age_slice = dataset["Age"].copy()
age_slice[np.isnan(age_slice)] = rand_age
dataset["Age"] = age_slice
dataset["Age"] = titanic_ds["Age"].astype(int)# convert ‘age’ to a feature holding a category
data = [titanic_ds]
for dataset in data:
dataset['Age'] = dataset['Age'].astype(int)
dataset.loc[ dataset['Age'] <= 11, 'Age'] = 0
dataset.loc[(dataset['Age'] > 11) & (dataset['Age'] <= 18), 'Age'] = 1
dataset.loc[(dataset['Age'] > 18) & (dataset['Age'] <= 22), 'Age'] = 2
dataset.loc[(dataset['Age'] > 22) & (dataset['Age'] <= 27), 'Age'] = 3
dataset.loc[(dataset['Age'] > 27) & (dataset['Age'] <= 33), 'Age'] = 4
dataset.loc[(dataset['Age'] > 33) & (dataset['Age'] <= 40), 'Age'] = 5
dataset.loc[(dataset['Age'] > 40) & (dataset['Age'] <= 66), 'Age'] = 6
dataset.loc[ dataset['Age'] > 66, 'Age'] = 6# create titles
data = [titanic_ds]
titles = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}for dataset in data:
# extract titles
dataset['Title'] = dataset.Name.str.extract(' ([A-Za-z]+)\.', expand=False)
# replace titles with a more common title or as Rare
dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr',\
'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')
# convert titles into numbers
dataset['Title'] = dataset['Title'].map(titles)
# filling NaN with 0, to get safe
dataset['Title'] = dataset['Title'].fillna(0)# drop name and title column since we have create a title
titanic_ds = titanic_ds.drop(['Name','Ticket'], axis=1)# default missing fare rates
titanic_ds['Fare'].fillna(value=titanic_ds.Fare.mean(), inplace=True)# convert fare to a feature holding a category
data = [titanic_ds]
for dataset in data:
dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0
dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1
dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare'] = 2
dataset.loc[(dataset['Fare'] > 31) & (dataset['Fare'] <= 99), 'Fare'] = 3
dataset.loc[(dataset['Fare'] > 99) & (dataset['Fare'] <= 250), 'Fare'] = 4
dataset.loc[ dataset['Fare'] > 250, 'Fare'] = 5
dataset['Fare'] = dataset['Fare'].astype(int)# create not_alone and relatives features
data = [titanic_ds]
for dataset in data:
dataset['relatives'] = dataset['SibSp'] + dataset['Parch']
dataset.loc[dataset['relatives'] > 0, 'not_alone'] = 0
dataset.loc[dataset['relatives'] == 0, 'not_alone'] = 1
dataset['not_alone'] = dataset['not_alone'].astype(int)# create age class
data = [titanic_ds]
for dataset in data:
dataset['Age_Class']= dataset['Age']* dataset['Pclass']# create fare per person
data = [titanic_ds]
for dataset in data:
dataset['Fare_Per_Person'] = dataset['Fare']/(dataset['relatives']+1)
dataset['Fare_Per_Person'] = dataset['Fare_Per_Person'].astype(int)# convert all data to numbers
le = preprocessing.LabelEncoder()
titanic_ds=titanic_ds.apply(le.fit_transform)print("Show first records of all the features created")
titanic_ds.head(10)
在这个演示中,我们将创建一个模型来预测泰坦尼克号沉没时谁会幸存(或死亡)。大块提供了准备数据的所有代码。总之,您将许多特征转换为数字和聚合数据,以提高模型的准确性。例如,您将年龄转换为一个类别,并根据名称编辑标题。此外,您还修复了丢失的值,并导出了其他要素的数据。最后一行显示了创建的所有特征的前 10 行。
# convert all data to numbers
le = preprocessing.LabelEncoder()
titanic_ds=titanic_ds.apply(le.fit_transform)# split our data into a test (30%) and train (70%) dataset
test_data_split = 0.30
msk = np.random.rand(len(titanic_ds)) < test_data_split
test = titanic_ds[msk]
train = titanic_ds[~msk]# drop ‘PassengerId’ from the train set, because it does not contribute to a persons survival probability
train = train.drop(['PassengerId'], axis=1)X_train, X_test, Y_train, Y_test = train_test_split(train.drop("Survived", axis=1), train["Survived"],test_size=0.4,random_state=54,shuffle=True)
接下来的几行确保所有数据都被转换成数字。接下来,您将我们的完整数据集分成测试和训练数据集。在我们的例子中,所有的乘客信息被合并到一个大的数据集中。接下来,数据被拆分为用于训练和验证模型的数据。从概念上讲,你可以看到我们在下面做了什么:
# save data
np.savetxt('download/train.csv', train, delimiter=',')
np.savetxt('download/test.csv', test, delimiter=',')
np.savetxt('download/X_train.csv', X_train, delimiter=',')
np.savetxt('download/Y_train.csv', X_train, delimiter=',')
np.savetxt('download/X_test.csv', X_train, delimiter=',')
np.savetxt('download/Y_test.csv', X_train, delimiter=',')# upload data to blob storage account
datastore.upload_files(files=['download/train.csv', 'download/test.csv', 'download/X_train.csv', 'download/Y_train.csv', 'download/X_test.csv', 'download/Y_test.csv'],
target_path='titanic_data/',
overwrite=True)# attach all datasets
dataset_train = Dataset.Tabular.from_delimited_files(path=[(datastore, 'titanic_data/train.csv')])
dataset_test = Dataset.Tabular.from_delimited_files(path=[(datastore, 'titanic_data/test.csv')])
dataset_X_train = Dataset.Tabular.from_delimited_files(path=[(datastore, 'titanic_data/X_train.csv')])
dataset_Y_train = Dataset.Tabular.from_delimited_files(path=[(datastore, 'titanic_data/Y_train.csv')])
dataset_X_test = Dataset.Tabular.from_delimited_files(path=[(datastore, 'titanic_data/X_test.csv')])
dataset_Y_test= Dataset.Tabular.from_delimited_files(path=[(datastore, 'titanic_data/Y_test.csv')])# register datasets as version 1
dataset_train.register(workspace = ws, name = 'train', create_new_version = True)
dataset_test.register(workspace = ws, name = 'test', create_new_version = True)
dataset_X_train.register(workspace = ws, name = 'X_train', create_new_version = True)
dataset_Y_train.register(workspace = ws, name = 'Y_train', create_new_version = True)
dataset_X_test.register(workspace = ws, name = 'X_test', create_new_version = True)
dataset_Y_test.register(workspace = ws, name = 'Y_test', create_new_version = True)
为了在 Azure ML 中存储和管理我们所有的数据,你需要使用下面几行代码。在稍后阶段,您将注册您的版本化模型并将其链接到此版本化数据,包括所有其他元数据,如性能指标、准确性等。这对展示证据和保持控制很重要。
# Random Forest
random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, Y_train)# Save model as pickle file
joblib.dump(random_forest, "outputs/random_forest.pkl")# Predict and get result
Y_prediction = random_forest.predict(X_test)
random_forest.score(X_train, Y_train)
acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2)# show the important features for the classification
feature_imp = pd.Series(random_forest.feature_importances_, index=X_train.columns).sort_values(ascending=False)
plt.figure(figsize=(10,6))
sns.barplot(x=feature_imp, y=feature_imp.index)
# Add labels to your graph
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
plt.tight_layout()
接下来,您将使用随机森林模型,这是一种受监督的机器学习算法。它创建了一个决策树的森林,并使其具有一定的随机性。此外,您会看到一个显示模型中最主要特征的图。
# register model within workspace
model_random_forest = Model.register(workspace=ws,
model_name='random_forest',
model_path='outputs/random_forest.pkl',
model_framework=Model.Framework.SCIKITLEARN,
model_framework_version=sklearn.__version__,
sample_input_dataset=dataset_X_train,
sample_output_dataset=dataset_Y_train,
description='Titanic survival prediction using random forest.',
datasets = [('train',dataset_train),('test',dataset_test),('X_train',dataset_X_train),('Y_train',dataset_Y_train),('X_test',dataset_X_test),('Y_test',dataset_Y_test)],
tags={'type': 'regression'})
使用上面的代码行,您将在 Azure ML 中注册您的模型。模型本身被序列化为 pickle 文件,这意味着它已经被转储以供以后使用。此外,您还将模型链接到了我们的训练数据集。
# log plot image
run.log_image('Feature Importance Score', plot=plt)# complete run
run.log("Random Forest accuracy", acc_random_forest)
run.complete()
最后,您记录我们模型的准确性,并将运行标记为完成。
MLOps 功能
在典型的开发流程中,开发模型只是第一步。最大的努力是让一切都准备好投入生产。这包括数据收集、数据准备、培训、服务和监控。您只是执行了这些最初的步骤,并在 Azure ML 中存储了所有相关的元数据信息。例如,您可以看到下面的绘图图像,它和我们的模型的其他信息,如实验、版本化数据集、日志记录信息等等。
图片由 Piethein Strengholt 提供
最大的好处是,您可以将模型和实验与可靠且可重复的结果关联起来。团队成员可以轻松地观察、解释和改进模型行为和准确性,因为所有信息都集中在一个中心位置。
利用计算集群进行纵向扩展
下一步是在集群上训练模型,这对计算密集型处理很有用。例如,当使用大型数据集或复杂计算时。这项工作可以分配给几台机器。在计算部分,您可以创建和配置集群。在本演示中,您可以通过单击“下一步”来使用标准配置。
图片由 Piethein Strengholt 提供
为了向我们的集群提交作业,您需要设置一些额外的脚本。第一个脚本名为 setup.sh ,用于安装所需的软件包。
#!/bin/bash
pip install azureml-sdk[notebooks]
pip install azureml-core
pip install azure-storage-blob
pip install joblib
第二个脚本叫做 script.py ,它与我们的 Azure ML 工作空间交互,用于提交我们的作业。让我们检查下面的代码块。
from azureml.core import ScriptRunConfig, Experiment
from azureml.core import Workspace
from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException
from azureml.core import Environment
from azureml.widgets import RunDetails
from azureml.core.authentication import ServicePrincipalAuthenticationsvc_pr = ServicePrincipalAuthentication(
tenant_id="72f988bf-FDf1-41af-9Ab-2d7cd011Ab47",
service_principal_id="ef861c6f-b0FA-4895-8330-9b90Aea3bd1",
service_principal_password="~_V846CU~R36tP.UV4Sz78TtUAaeyF40C")ws = Workspace(
subscription_id="3466fg5d-afda-4533-b3e2-c498g86a45aa",
resource_group="rg-machinelearning",
workspace_name="machinelearning",
auth=svc_pr
)# create or load an experiment
experiment = Experiment(ws, 'TitanicExperiment')# create or retrieve a compute target
cluster = ws.compute_targets['cluster1']# create or retrieve an environment
env = Environment.get(ws, name='AzureML-sklearn-0.24.1-ubuntu18.04-py37-cpu-inference')# configure and submit your training run
src = ScriptRunConfig(source_directory='.',
command=['bash setup.sh && python train.py'],
compute_target=cluster,
environment=env)run = experiment.submit(config=src)
run
你还记得服务原则账户吗?服务原则帐户信息来自您之前使用的帐户信息。这允许您的集群与 Azure ML 进行交互。另一个重要的方面是推论。我正在使用一个预构建的 Docker 容器映像,它包含最流行的机器学习框架和 Python 包。
另一个重要方面是命令参数。我用它来传入 setup.sh 和 train.py 脚本。setup.sh 脚本安装所有必需的软件包。在我的示例机器学习模型脚本中, train.py 引用了与 Titanic.ipny 相同的代码。在存储这些脚本并运行 script.py 之后,应该向集群提交一个作业,如下图所示。
图片由 Piethein Strengholt 提供
最大的好处是您可以轻松地纵向扩展。从在计算实例上开发的模型过渡到高性能的弹性集群相对容易。这只是用另一个(小的)脚本来包装你的实验。
使用 Azure ML 端点操作您的模型
最后一步是操作您的模型,在我们的例子中是将模型部署为 web 服务。在 Azure ML 中,您可以部署实时或批处理服务。要将您的模型部署为实时 web 服务,请使用下面的代码:
# set service name
service_name = 'titanic-service'
service = Model.deploy(ws, service_name, [model_random_forest], overwrite=True)
service.wait_for_deployment(show_output=True)
titanic-service 是指服务名。在我们的例子中, model_random_forest 指的是您在我们的工作空间中注册的模型。成功部署后,您应该在端点部分看到您的服务:
图片由 Piethein Strengholt 提供
这个 REST 端点可以与任何其他系统集成。让我们通过使用 postman 来验证服务。
图片由 Piethein Strengholt 提供
我通过提交 13 个数据属性进行 API 调用。第二和第三个属性是性别和年龄。数字 1 和 1 对应于年龄小于或等于 11 岁的女性。提交我们的请求后,你可以看到泰坦尼克号幸存的概率是 88.5%。
图片由 Piethein Strengholt 提供
如果您将性别和年龄更改为 0 和 6,这些值对应于年龄在 44 和 66 之间的男性。幸存的概率,如你所见,下降到了 42.0%。
结论
我们刚刚展示的是一个从数据收集和准备到模型部署和运作的自动化 ML 生产环境。合乎逻辑的下一步是将我们的所有代码存储到一个版本化的 Git 存储库中,并使用一个持续集成(CI)流程来自动化管道启动、培训和测试自动化、审查和批准流程。
代码仓库:https://github . com/pietheinstrengholt/Azure-ML-and-devo PS-meets-Titanic