亚马逊AWS官方博客

在 SageMaker 临时实例上调度 Jupyter notebooks

Original URL:https://aws.amazon.com/cn/blogs/machine-learning/scheduling-jupyter-notebooks-on-sagemaker-ephemeral-instances/

 

一个星期五的下午五点,您花费了整整一个下午在编码处理一个复杂、繁琐的特征工程策略。这个策略在您的Amazon SageMaker Studio t3.medium notebook上已经开始工作,你想做的是插入这个策略到一个大型实例中,通过水平扩展将其覆盖剩余数据集,然后下班回家。虽然您可以直接升级notebook实例,但只要一关上您的电脑,这项作业马上就会停止。既然如此,为什么不直接从您的notebook调度作业?

Amazon SageMaker提供一套全托管式解决方案,可用于构建、训练以及部署各种机器学习(ML)模型。在本文中,我们将演示如何使用Amazon SageMaker Processing Jobs配合开源项目Papermill执行Jupyter notebooks。Amazon SageMaker与Amazon CloudWatchAWS Lambda以及整个AWS栈的结合,向您提供了实时和按计划扩展作业您所需要的模块化骨干,比如像特征工程这样的作业。我们很高兴提供了一款DIY(自己动手做)工具箱简化整个流程,使用AWS CloudFormation设置权限、使用Lambda启动作业、并使用Amazon Elastic Container Registry (Amazon ECR)创建自定义执行环境。它还包含一套类库与CLI(命令行执行工具),用于从任意AWS客户端初始notebook执行,外加一款用于提供无缝化用户体验的Jupyter插件。

截至本文撰稿时,您已经可以在Jupyter notebook中编写代码,并一键立即或按计划将其运行在Amazon SageMaker临时实例之上。使用本文提供的工具,您将可以从任何下列地方执行这个操作:在shell提示符下、在Amazon SageMaker中的JupyterLab中、在您的另一个JupyterLab环境中,或者在您编写的程序中自动完成。我们也提供了相关示例代码,借此简化使用AWS CloudFormation处理繁重的设置过程,并提供了简便的工具运行和监控整套系统的执行情况。

关于执行notebook的更多详细信息,请参见 GitHub repo。GitHub上的 aws-samples 提供了所有示例源代码。下面,请继续阅读和学习如何使用调度的notebook执行。

何时使用这套解决方案

这套工具箱特别适合运行夜间报告类作业。例如,您可能需要分析数据科学团队当天已经完成的所有训练工作,进行成本/收益分析,并生成一份您的模型被部署到生产环境后即将带来的业务价值报告。这类用例就完美适合使用调度的notebook——所有图形、表格与图表都将由您的代码自动生成,像您自己逐步调试notebook一样,除了现在它们被自动处理,此外结果被持久保存在Amazon Simple Storage Service (Amazon S3)当中。您可以使用昨夜执行后的最新notebook开始新一天的工作,推动分析能力的发展。

或者,设想您想纵向扩展特征工程。您已经完成了for循环来执行全部Pandas转换,接下您需要的是时间和将其运行在全部20 GB数据上的算力。没问题——只需要把您的notebook放入工具箱内、运行一个作业、关闭notebook,然后一切就搞定了。无论您当前是否在主动使用Jupyter,您的代码都会持续运行在调度的实例上。

或许,您所在的数据科学团队可能仍然在本地notebook或者Amazon SageMaker notebook上训练模型,且尚未采用Amazon SageMaker临时实例执行训练作业。使用这套工具箱,您可以在模型训练期间轻松使用高级计算选项。您可以为一个小时的模型训练启动一台p3.xlarge实例,但在全天使用可负担得起的t3.medium实例运行Studio环境。您可以通过几行代码轻松将这些资源接入Experiments SDK。虽然完全支持在p3实例上运行Amazon SageMaker notebooks与Amazon SageMaker Studio,但是养成一个仅短期使用最大型实例的习惯是一种节约成本的重要实践。

您可能还有一个装满了对象的S3存储桶,而且需要在每个对象上运行一个完整的notebook。这些对象可能是您呼叫中心内的电话记录日期,或是社交网络中特定用户的推文流。无论如何,您可以使用这个工具箱轻松为这些对象编写for循环,由该工具箱为各个文件调度作业,在其专用实例上运行该作业,并存储完成的notebook在Amazon S3当中。这些甚至可以是从您喜欢的训练环境中加载的模型构件—打包您的推理代码到notebook当中,然后使用这个工具箱轻松部署它们。

最后,客户还向我们反映报告模型的运行性能是对于各利益攸关方的一个重要资产。使用这款工具箱,您可以施行起一套人工参与的解决方案,该解决方案可以分析特征重要性、生成ROC曲线,并评估您的模型在对最终产品很重要的各类极端情况下是如何表现。您还可以构建一款模型分析器,供团队中的所有数据科学家轻松访问。您可以在每一项训练作业完成后触发此模型分析器,并在将分析值发送给各利益攸关方之后结束整个循环。

在SageMaker中执行调度Notebooks的三种方式

要在Amazon SageMaker中执行notebook,您可以使用Lambda函数以配置并运行Amazon SageMaker Processing作业。该函数可直接由用户调用,或者作为目标被添加至Amazon EventBridge规则中以按计划或通过事件响应的方式运行。要运行的notebook被存储为Amazon S3对象,因此即使您不在线,当执行发生时这些notebook仍然可以正常执行。下图展示了这个架构。

接下来,我们概述了三种不同的安装和使用此功能的方法,这些功能允许您以所需的方式处理notebook和调度。

使用AWS API或者直接使用CLI

您可以直接使用AWS API以执行并调度notebooks。为了简化流程,我们提供一套CloudFormation模板以配置您需要的Lambda函数,同时提供运行notebook时所需要的AWS身份与访问管理( AWS Identity and Access Management,简称IAM)角色及策略。我们还提供相关脚本,用于构建及定制在运行notebooks时Amazon SageMaker Processing作业使用的Docker容器镜像。

在对CloudFormation模板进行实例化并完成容器镜像创建之后,您可以使用以下代码运行一个notebook:

$ aws lambda invoke --function-name RunNotebook \
             --payload '{"input_path": "s3://mybucket/mynotebook.ipynb", \
                         "parameters": {"p": 0.75}}' result.json

要创建调度,请输入以下代码,请注意替换Region(区域)与账户编号部分的arn,并替换input_path指向您的S3存储桶。

$ aws events put-rule --name "RunNotebook-test" --schedule "cron(15 1 * * ? *)"
$ aws lambda add-permission --statement-id EB-RunNotebook-test \
                            --action lambda:InvokeFunction \
                            --function-name RunNotebook \
                            --principal events.amazonaws.com \
                            --source-arn arn:aws:events:us-east-1:123456789:rule/RunNotebook-test
$ aws events put-targets --rule RunNotebook-test \
                         --targets '[{"Id": "Default", \
                                      "Arn": "arn:aws:lambda:us-east-1:123456789:function:RunNotebook", \
                                      "Input": "{ \"input_path\": \"s3://mybucket/mynotebook.ipynb\", \
                                                  \"parameters\": {\"p\": 0.75}}"}]‘

通过这种方式,您可将notebook移动至Amazon S3、监控Amazon SageMaker Processing作业,并从Amazon S3提取输出的notebook。

如果您是经验丰富的AWS用户,希望在不涉及额外依赖项的前提下构建解决方案,那么这套方案可以说是一套了不起的解决方案。您甚至可以修改我们编写的Lambda函数或者Papermill执行容器,来满足您的更多具体需求。

关于使用AWS API进行调度notebook的更多详细信息,请参阅GitHub repo上的完整配置说明。

使用便捷工具箱简化整个流程

为了进一步简化调度notebook(尤其当您不是一位AWS专家时),我们还开发出一套便捷的工具箱,封装AWS工具成为CLI和Python库,为您提供更自然的运行和调度notebook的接口。这款工具箱,让您可以通过AWS CodeBuild构建自定义执行环境,而不必使用Docker,同时管理并监控您的Amazon S3交互与作业。

在设置运行完成后,使用以下代码执行notebook:

$ run-notebook run mynotebook.ipynb -p p=0.5 -p n=200

使用以下代码进行调度notebook:

$ run-notebook schedule --at "cron(15 1 * * ? *)" --name nightly weather.ipynb -p "name=Boston, MA"

这款便捷工具箱还包含用于监控作业及查看当前调度的工具,具体参见以下代码:

$ run-notebook list-runs
Date                 Rule                 Notebook              Parameters           Status     Job
2020-06-15 15:31:40                       fraud-analysis.ipynb  name=Tom             Completed  papermill-fraud-analysis-2020-06-15-22-31-39
2020-06-15 01:00:08  DailyForecastSeattle DailyForecast.ipynb   place=Seattle, WA    Completed  papermill-DailyForecast-2020-06-15-08-00-08
2020-06-15 01:00:03  DailyForecastNewYork DailyForecast.ipynb   place=New York, NY   Completed  papermill-DailyForecast-2020-06-15-08-00-02
2020-06-12 22:34:06                       powers.ipynb          p=0.5                Completed  papermill-powers-2020-06-13-05-34-05
                                                                n=20
$ 

关于这款便捷工具箱的更多详细信息,请参阅GitHub repo

使用GUI通过JupyterLab直接执行notebooks

如果您更偏好交互体验,我们的便捷工具箱还提供JupyterLab扩展,可供您在本地JupyterLab、Amazon SageMaker Studio或者Amazon SageMaker notebook实例当中使用。

为Amazon SageMaker Studio用户设置Jupyter扩展之后,您会看到新的notebook执行侧边栏(火箭飞船图标)。此边栏让您执行或调度正在查看的notebook。您可以使用默认设置创建的notebook-runner容器,或者任何您构建的其他容器。输入这些作业用到的和您的实例需要的执行角色的ARN,就准备好走下一步了。

在选择Run Now之后,Lambda函数会选取您的notebook并将其运行在一个Amazon SageMaker Processing作业之上。这时,您可以选择 Runs以查看该作业的状态,详见以下截屏。

作业完成之后,完成的notebook将存储在Amazon S3当中。请注意,这意味着您之前的运行仍将持久化,所以您可以轻松恢复它们。

最后,选择View Output 与 Import Notebook导入输出notebook。如果您没有导入notebook,则其永远不会被复制至您的本地目录。这样设计很棒,当您想查看什么在发生时,但是不想生成太多额外的notebooks。

关于设置JupyterLab扩展以及使用GUI运行并监控notebook的更多说明信息,请参阅GitHub repo

总结

本文讨论了如何将Amazon SageMaker与AWS云的模块化功能结合起来,借此为数据科学家及机器学习工程师们在临时实例上提供无缝化的notebook运行体验。我们还发布了一款开源工具箱以进一步简化整个流程,其中包含一个CLI、便捷工具箱以及Jupyter功能部件。以此为基础,我们讨论了多种用例,从运行夜间报告到扩展特征工程,再到对最新数据集进行模型分析等。我们也分享了运行这款工具箱的多种示例方式。请随意浏览GitHub上的快速入门教程,并在 GitHub repo上查看更多示例。

 

标签:AWS SageMaker、Processing Job、Papermill、Jupyter notebooks、Lambda、AWS CloudFormation

 

本篇作者

Tom Faulhaber

Amazon SageMaker团队首席工程师。近来,他一直致力于探索Jupyter notebook丰富功能的一切潜在用途,以及如何以非传统方式将这些功能纳入数据科学家的工具箱。在业余时间,Tom喜欢骑自行车和徒步旅行,还经常与孩子们一起探索西雅图周边的远郊风景。

Emily Webber

AWS公司机器学习专家SA。在日常工作中,她的身份总是在数据科学家、机器学习架构师以及研究科学家之间来回转换。她住在芝加哥,您可以在YouTube、LinkedIn、GitHub以及Twitch上发现她的身影。除了帮助客户探索下一代机器学习体验之外,她喜欢在业余时间沿着美丽的湖岸大道慢跑、在Kindle上读书以及探索人迹罕至的偏僻小路。

 

本篇译者

申绍勇

申绍勇是AWS解决方案架构师,主要负责基于AWS的云计算解决方案进行架构咨询和设计,目前服务移动互联网(包含媒体、游戏、广告、电商、区块链等)、金融、制造业等各行业客户,提供有关云计算、AI、大数据、物联网、高性能计算等各类云计算解决方案的咨询和架构设计。