使用 Amazon Step Functions Data Science SDK 创建基于无服务器架构的工作流



市场营销是金融领域的一个重要方向,在机构发展新客户的过程中,不容忽视老用户的流失情况。假如获得一个新客户的成本是保留一个老客户的成本的 5 倍,那么将其客户流失率降低 5%,其利润就可能增加 25%以上。
在本文中,我们将利用无服务器架构工作流,用于数据分析,模型部署,批量推理,从而实现提前发现可能的流失客户,及时维护避免流失。

📢 想要了解更多亚马逊云科技最新技术发布和实践创新,敬请关注在上海、北京、深圳三地举办的 2021 亚马逊云科技中国峰会!点击图片报名吧~
方案概述
本文将以一个常见的使用案例,通过 Amazon Step Functions Data Science SDK 创建基于无服务器架构的工作流,过程如下:
1.使用 Amazon Glue 进行 ETL 工作,生成样本数据集
2.使用 Amazon SageMaker 部署本地训练好的模型,用于机器学习推理
下图演示了上述 Amazon Step Functions 无服务器架构工作流:

后续操作使用了下列亚马逊云科技服务:
Amazon Step Functions
https://www.amazonaws.cn/step-functions/
是由多个离散步骤组成的状态机,其中每个步骤都可以执行任务、作出选择、启动并行执行或管理超时。其中一个步骤的输出作为下一个步骤的输入,并支持将错误处理嵌入到工作流中。
在 Amazon Step Functions Data Science SDK
诞生前,只能使用基于 JSON 的 Amazon States Language 定义 Amazon Step Functions;但现在可以借助此 SDK 使用 Python 代码轻松创建、执行和可视化 Amazon Step Functions 工作流。
Amazon Step Functions Data Science SDK
https://docs.amazonaws.cn/zh_cn/step-functions/latest/dg/concepts-python-sdk.html
本文是以 Amazon Step Functions Data Science SDK 为主线,讨论如何创建 Amazon Step Functions 步骤、使用参数、集成服务特定的功能以及将这些步骤关联在一起以创建和可视化工作流。
Amazon SageMaker 可为开发人员和数据科学家提供构建、训练和部署不同类型机器学习模型时所需的工具。
Amazon SageMaker
https://www.amazonaws.cn/sagemaker/
Amazon Glue 是一项完全托管的提取、转换和加载(ETL)服务,在分布式 Apache Spark 环境中运行,能够充分利用 Spark 而无需管理基础设施。将 Glue 指向受支持的数据存储,它将会生成代码以从指定的存储中提取数据并加载到目标存储中。
Amazon Glue
https://www.amazonaws.cn/glue/
本文使用机器学习方法进行客户流失预测,采用模拟的数据(近期消费记录,在线时长等)为示例数据集,首先使用 Amazon Glue 进行数据处理,再使用 Amazon SageMaker 进行模型部署,并进行批量转换。
该场景的使用的算法为 XGBoost (eXtreme Gradient Boosting),它是一种监督式学习算法, 尝试将一组较简单且较弱模型的一系列估计值结合在一起,从而准确地预测目标变量,可以用来处理回归、分类(二进制和多类)和排名问题。利用 XGBoost 预测客户是否会流失,以及早进行干预。
1.创建 Jupyter Notebook
1.1 创建 Amazon SageMaker 笔记本实例,部署模型

1.2 创建一个笔记本实例,类型选择 t2.medium。选择或者创建一个 IAM 角色(IAM Role)
1.3 其他部分选择默认选项,点击创建(Create)

1.4 在笔记本创建完成后,打开 Jupyter,选择 New,新建一个 ipynb,选择内核为 conda_python3
2. 使用 Amazon Step Functions Data Science SDK 创建和管理工作流
2.1 安装和加载所有必需的模块

2.2 按照代码中的注释要求,替换使用您自己的 S3 bucket/prefix
后面需要将数据上传到该项目的 Amazon S3 存储桶,用作训练模型的数据和 Model Artifact 的存储

2.3 按照代码中的注释要求,替换使用您自己的 S3 bucket/prefix
2.4 创建一个 Role 附加到 Amazon Step Functions
关联的策略如下所示,可以根据实际使用的服务调整策略,并将策略附加到创建的 Role

2.5 设置执行的 Role
为确保 Amazon SageMaker 可以顺利运行相关的任务,这里获取笔记本实例的执行角色(创建 Amazon SageMaker 笔记本实例的时候已经创建/选择的角色)。同理 Amazon Step Functions 顺利运行的前提也是要有相应的执行角色,可参考上图中角色的关联资源。

3. 验证模型
3.1 安装和加载所有必需的模块
因为需要使用 joblib 来加载模型,需要使用 sklearn 版本为 0.22.1。


3.2 读取样本数据
样本数据上传到 Notebook 后,可以看到共有 1000 行 74 列数据(列没有显示完),包括主键(cust_id)和用户按照时间维度统计的交易金额、在线换手率金额、在线赎回笔数等信息。

3.3 加载模型,返回预测标签
利用逻辑回归进行客户流失率建模,使用 sklearn 拆分测试集和训练集,提供回归的 xgboost 模型。
本文中的模型已在本地训练好,在 Notebook 中使用 joblib 加载模型。

4. 准备环境工作(执行一次)
4.1 打包容器 &推送容器到 ECR

编辑 Dockerfile,准备镜像。
这个过程可能需要进行很多次,因为不可避免地要修改 Dockerfile 或者某类程序以使得它们可以正常工作。
建议使用官方镜像文件,在此基础上添加组件,国内镜像仓库地址参考如下链接:
https://docs.amazonaws.cn/sagemaker/latest/dg/sagemaker-algo-docker-registry-paths.html
在 cn-north-1 下使用 sklearn 的训练镜像和推理镜像的路径为:
450853457545.dkr.ecr.cn-north-1.amazonaws.com.cn


在拉取公共镜像之前,需要做基本身份验证

推送镜像到自有 ECR 镜像仓库

4.2 上传模型文件到 S3
我们需要将本地已经训练好的模型放到之前创建的 s3 存储桶,prefix 前缀是对象名称前的完整路径。
比如一个对象 model.tar.gz,
存储路径 BucketName/Project/Demo/model.tar.gz,
则前缀是 BucketName/Project/Demo/


4.3 推理脚本

4.3.1 打包代码并上传到 s3

4.4 创建 Amazon SageMaker 模型对象
下图中的 image_uri 为 4.1 步骤中指定容器镜像地址,model_uri 为 4.2 步骤中指定模型的 s3 路径,transform_script 为 4.3 步骤中创建的推理脚本,code_uri 为 4.3.1 步骤中上传在 s3 的代码路径。

5. 批量转换(模型推理)
5.1 使用 Amazon SageMaker Batch Transform
要获得整个数据集的推理结果,可以使用批处理变换。使用批处理转换,可以使用训练好的模型和数据集创建批处理转换作业,这些数据必须存储在 Amazon S3 中。
Amazon SageMaker Batch Transform
https://docs.amazonaws.cn/sagemaker/latest/dg/batch-transform.html
Amazon SageMaker 将推理保存在创建批处理转换作业时指定的 S3 存储桶中。
批量转换管理获取推理所需的所有计算资源,并在批处理转换作业完成后将其删除。
5.1.1 输出结果整合输入 id

指定 model_name,实例的数量和机型

6. 使用 Data Science SDK 创建 Amazon Step Functions Step
6.1 创建 Glue Step,指定 glue job name
下图中名为 glue-demo-job-0223 的 Glue job 是已经创建好的作业,其目的是定期生成需要推理的样本数据。

6.2 创建 Batch Transform Step,指定 job name 和 model_name

6.3 串联上述的步骤
导入 fields 模块,更改 attrs 属性,本文中需要更改 glue 和 Amazon SageMaker 对应的 Step
(1)把 resource: “arn:aws:states:::glue:startJobRun.sync”
替换为 resource: “arn:aws-cn:states:::glue:startJobRun.sync”
(2)把 resource: “arn:aws:states:::sagemaker:createTransformJob.sync”
替换为 resource:”arn:aws-cn:states:::sagemaker:createTransformJob.sync”


7. 运行上述 workflow,指定 workflow name
7.1 操作步骤
新建名为 MyInferenceRoutine01 的工作流

生成图示

创建和执行 workflow,可以看到图示不同的颜色代表不同的状态


可以列出失败的 events,正在执行的 workflow 和执行成功的 workflow



正常执行完成后的图示:

7.2 生成的文件
最后在 s3 对应的文件夹下,可以看到生成的推理文件:

客户 ID 和对应的分数,可以看到,分数越低的客户流失的可能性会更高。

8. 总结
本文讨论的是使用 Amazon Step Functions Data Science SDK,从数据 ETL,到模型部署,再到批量推理,创建一个基于无服务器架构的工作流。对于业务端的数据科学家来讲,这些步骤都可以在 Notebook 中完成,而且可以通过 Amazon Step Functions 监控每个任务的运行状态和日志记录,最终实现整个流程的自动化,减少数据科学家的人工重复工作,提高生产开发效率。本文涉及的示例代码下载链接:
https://github.com/hlmiao/sagemaker/tree/main/sklearn-xgboost
参考资料
[1] amazon-step-functions-data-science-sdk-python
https://github.com/aws/aws-step-functions-data-science-sdk-python
[2] Amazon Step Functions Data Science SDK – Hello World
[3] Build a machine learning workflow using Step Functions and SageMaker
[4] Using the SageMaker Python SDK
https://sagemaker.readthedocs.io/en/stable/overview.html#id3
本篇作者

缪翰林
亚马逊云科技解决方案架构师
负责基于亚马逊云科技的方案咨询,设计和架构评估。在运维,DevOps 方面有丰富的经验,目前侧重于大数据领域的研究。

王世帅
亚马逊云科技机器学习产品技术专家
负责基于亚马逊云科技的机器学习方案的咨询与设计,对于机器学习应用等有浓厚的兴趣和热情,参与了多个客户的机器学习项目。

评论