亚马逊AWS官方博客
AWS 神器为数据科学家轻松打造机器学习全流程 –– EMR Spark + SageMaker 黄金搭档
工欲善其事,必先利其器。在机器学习的世界里,要想成为一名出色的数据科学家,必须要善于使用机器学习的工具。
数据科学家经常使用 Apache Spark 来做数据的预处理,Apache Spark 提供的 MLlib 库不但包含很多常用的机器学习算法(如 K-Means,分类,回归等)及数据特征抽取,特征转换的预处理方法(如 Word2Vec,Tokenizer,Normalizer,PCA 等),而且还能借助 Spark 集群的多工作节点并行计算的能力,对数据进行快速预处理。数据科学家还喜欢使用 IPython,Jupyter Notebook 等交互式工具来检查,分析机器学习任务的各个阶段。当然还需要使用来搭建模型训练和部署的机器集群。
这些不同的机器学习工具或框架有着各自的安装配置方法,串联整合起来到整个机器学习流程中更是复杂,数据科学家们往往要耗费大量精力用于整个流程的搭建上。那有没有高效的工具来帮助数据科学家事半功倍完成机器学习的任务呢?那是当然的! AWS 的明星服务 EMR 和 SageMaker 就是把广大数据科学家从枯燥重复性劳动中解救出来的神器。利用两个服务组合不但能快速预处理数据,一键训练和部署模型,同时还提供 Jupyter Notebook 给数据科学家交互式环境,以方便检跟踪查机器学习每个阶段。
今天我们就来讲述一下如何利用 AWS 的 EMR Spark + SageMaker 服务快速打造一套识别 MNIST 手写数字图片的机器学习流程。MNIST 是一个手写数字数据库,它有 60000 个训练样本集和 10000个测试样本集,我们把这个 MNIST 存储到 AWS 的 S3 上,利用 EMR Spark 的 PCA 算法对训练样本(28*28图片)进行特征抽取,然后再借助 SageMaker 自带的 K-Means 算法进行模型训练并自动部署模型。
Amazon EMR 和 SageMaker 是什么?
Amazon EMR服务是一个托管的 Hadoop 服务,现支持最新的 Apache Spark 2.3.0,能够几分钟内快速搭建起来一个 Spark 集群,同时 EMR 还能支持 Spot 实例能够大大节约数据预处理的成本。
Amazon SageMaker 是一个托管的模型训练和部署服务,不仅能够快速搭建构建起机器集群进行模型训练,并且能自动部署训练好的模型。SageMaker 不但内置了 10 余种常用的机器学习算法(如 K-Means,分类,回归),还支持 MXNet 和 TensorFlow 深度学习框。
Amazon SageMaker 提供了一个 SageMaker Spark 库(Scala&Python),能把机器学习 pipeline 中的 Spark 数据预处理阶段和 SageMaker 模型训练和部署阶段自动连接起来。
Amazon SageMaker 还提供了预安装 Anaconda 环境的 Jupyter Notebook 实例,能够方便数据科学家进行交互式处理机器学习任务。在今天的例子中,我们将使用 Jupyter Notebook 来对接 EMR Saprk 集群,在 Notebook 中给 EMR Spark 发送指令,交互式地观察对 MNIST 数据集进行机器学习的过程。
前提条件
- Spark 集群和 SageMaker Jupyter 实例需要在同一个 VPC 内
- Spark 的 master 节点的安全组需要对SageMaker Jupyter 实例开放 8998 端口。
具体步骤
首先创建 EMR Spark 集群(请使用高级模式),选择 Hadoop, Livy(Spark 和 Jupyter Notebook 通信组件), Spark 组件。从 EMR 5.11 版本后,Spark 节点上已经预安装好 SageMaker 的 Spark 库。
配置 EMR 节点的类型和数量,可以选择 spot 实例类型帮助节约成本。在这里我配置了一个 master节点,两个 core 节点,都是 M4.large 机型。
创建好了 Spark 集群后,记下 Spark master 节点的 ip 地址,后面在 Sagemaker notebook instance 中需要配置。
修改 EMR Spark master EC2 节点安全组,添加 Livy 端口,source 选择 Jupyter Notebook 所在的安全组。
因为需要在 EMR 的 master 节点中调用 SageMaker 服务,所以还需要对 EMR 中的 EC2 Role 赋予 SageMakerFullAccess 的权限。
在 SageMaker 中创建 Notebook Instance:
在 notebook 控制台中选择 new -> Terminal:
打开终端后执行以下命令:
cd .sparkmagic
wget https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json
mv example_config.json config.json
修改 config.json 文件,把之前记下的 spark master 节点 ip 地址填上
退出后新建一个 Sparkmagic (PySpark)并重启 kernel:
输入 %%info 如有下面的输出,表示 Jupyter Notebook 已经 Spark 集群能够通信了。
以上详细步骤可参考 Build Amazon SageMaker notebooks backed by Spark in Amazon EMR
接下来我们要利用Notebook来串联Spark 和SageMaker进行MNITS识别模型训练。导入必要的 python 库:
- Pyspark.ml 中的 PCA 算法,这个算法在 Spark 集群中会对 MNIST 手写图片做降维的预处理。
Sagemaker_spark 的 KMeansSageMakerEstimator 将会让 Spark 节点调用 SageMaker 服务并使用自带的 KMeans 算法进行模型训练和部署
Pyspark.ml 的 Pipeline 用于将 PCA 和 K-Means 两个阶段串联起来
2. 把预先存储在 S3 上的 MNIST 数据集导入到 Spark 中,Spark 将会自动把 S3 上的数据集转换成之后用于训练的 DataFrame 格式的数据。通过 .show() 方法我们可以查看导入的训练数据集,每个数据项拥有一个标签,和 784 个特征向量。
3. 分别定义两个阶段的算法 PCA 和 K-Means
设定 cluster = 10,代表 10 个数字。
我们用 PCA 把原来的 28*28 像素 784 个特征降维到 50 个特征;
定义 K-Means 算法时我们配置在 SageMaker 中用于训练和模型的机器类型和数量,这里我们使用 1台 m4.xlarge 机器用于 K-Means 算法训练,1 台 m4.xlarge 机器用于模型的部署。
4. 构造 ML pipeline 并对 60000 个训练数据进行模型训练。
5. 使用 K-Means 算法训练将由 Spark master 节点调用 SageMaker 服务实现,所以我们能在 SageMaker 控制台看到一个训练任务。
6. 训练完成后能够在 SageMaker 控制台查看训练好的模型和部署好的终端节点
7. 接下来可以在 Jypyter Notebook 中用测试集来测试模型
8. 同时我们也可以查看 EMR 的控制台,观察在 Jupyter Notebook 中提交到 Spark 上执行的各种任务
9. 最后结束机器学习任务后,我们运行以下脚本,删除模型预测的 endpoint 节点。
以上就是利用 EMR Spark 和 SageMaker 快速搭建机器学习流程的步骤,我们后续可以扩展做更多的实验,例如在 SageMaker 中使用自己的算法,对接本地的 Spark 集群等等。