星期五下午五点,你终于赶在下班前搞定了一个复杂、繁琐的特征工程策略。这个策略在Amazon SageMaker Studio t3.medium Notebook上已经开始工作,你想做的是插入这个策略到一个大型实例中,通过水平扩展将其覆盖剩余数据集,然后开始周末的Happy hour。
然而……虽然可以直接升级Notebook实例,但只要一关闭电脑,这项作业马上就会停止。怎么办?作业运行期间一直守在电脑前?为什么不直接从Notebook调度作业呢?
Amazon SageMaker提供了一套全托管式解决方案,可用于构建、训练以及部署各种机器学习(ML)模型。在本文中,我们将演示如何使用Amazon SageMaker Processing Jobs配合开源项目Papermill执行Jupyter Notebook。Amazon SageMaker与Amazon CloudWatch、AWS 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转换,接下来需要的是时间和将其运行在全部20GB数据上的算力。没问题 —— 只需要把Notebook放入工具箱内、运行一个作业、关闭Notebook,然后一切就搞定了。无论当前是否在主动使用Jupyter,代码都会持续运行在调度的实例上。
或许,你所在的数据科学团队可能仍然在本地Notebook或者Amazon SageMaker notebook上训练模型,且尚未采用Amazon SageMaker临时实例执行训练作业。使用这套工具箱,我们可以在模型训练期间轻松使用高级计算选项。我们可以为一个小时的模型训练启动一台p3.xlarge实例,但在全天使用可负担得起的t3.medium实例运行Studio环境。我们可以通过几行代码轻松将这些资源接入Experiments SDK。虽然完全支持在p3实例上运行Amazon SageMaker notebook与Amazon SageMaker Studio,但是养成一个仅短期使用最大型实例的习惯是一种节约成本的重要实践。
你可能还有一个装满了对象的S3存储桶,而且需要在每个对象上运行一个完整的Notebook。这些对象可能是呼叫中心内的电话记录日期,或是社交网络中特定用户的推文流。无论如何,我们可以使用这个工具箱轻松为这些对象编写for循环,由该工具箱为各个文件调度作业,在其专用实例上运行该作业,并存储完成的Notebook在Amazon S3当中。这些甚至可以是从我们喜欢的训练环境中加载的模型构件 — 打包推理代码到Notebook当中,然后使用这个工具箱轻松部署。
最后,客户还向我们反映报告模型的运行性能是对于各利益攸关方的一个重要资产。使用这款工具箱,我们可以施行起一套人工参与的解决方案,该解决方案可以分析特征重要性、生成ROC曲线,并评估模型在对最终产品很重要的各类极端情况下是如何表现。我们还可以构建一款模型分析器,供团队中的所有数据科学家轻松访问。我们可以在每一项训练作业完成后触发此模型分析器,并在将分析值发送给各利益攸关方之后结束整个循环。
在SageMaker中执行调度Notebook的三种方式
要在Amazon SageMaker中执行Notebook,我们可以使用Lambda函数以配置并运行Amazon SageMaker Processing作业。该函数可直接由用户调用,或者作为目标被添加至Amazon EventBridge规则中以按计划或通过事件响应的方式运行。要运行的Notebook被存储为Amazon S3对象,因此即使我们不在线,当执行发生时这些Notebook仍然可以正常执行。下图展示了这个架构。
接下来,我们概述了三种不同的安装和使用此功能的方法,这些功能允许我们以所需方式处理Notebook和调度。
使用AWS API或者直接使用CLI
我们可以直接使用AWS API以执行并调度Notebook。为简化流程,我们提供一套CloudFormation模板以配置需要的Lambda函数,同时提供运行Notebook所需要的AWS身份与访问管理(AWS Identity and Access Management,简称IAM)角色及策略。我们还提供相关脚本,用于构建及定制在运行Notebook时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还开发出一套便捷的工具箱,封装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直接执行Notebook
如果更偏好交互体验,便捷工具箱还提供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,则其永远不会被复制至本地目录。这样设计很棒,当我们想查看什么在发生时,但是不想生成太多额外的Notebook时,就可以这样做。
关于设置JupyterLab扩展以及使用GUI运行并监控Notebook的更多说明信息,请参阅GitHub repo。
总结
本文讨论了如何将Amazon SageMaker与AWS云的模块化功能结合起来,借此为数据科学家及机器学习工程师们在临时实例上提供无缝化的Notebook运行体验。我们还发布了一款开源工具箱以进一步简化整个流程,其中包含一个CLI、便捷工具箱以及Jupyter功能部件。
以此为基础,我们讨论了多种用例,从运行夜间报告到扩展特征工程,再到对最新数据集进行模型分析等。我们也分享了运行这款工具箱的多种示例方式。欢迎浏览GitHub上的快速入门教程,并在GitHub repo上查看更多示例。