AWS 将 Amazon SageMaker Opeartors 正式引入 Kubernetes,开发者可轻松训练模型

美国时间 2019 年 12 月 2 日,AWS 在  AWS re:Invent 
大会现场宣布将 Amazon SageMaker Opeartors 正式引入 Kubernetes,这项新功能将帮助使用 Kubernetes 的开发人员与数据科学家轻松在 Amazon SageMaker 当中训练、调整以及部署机器学习模型。
客户现在可以在 Kubernetes 集群上安装这些 Amazon SageMaker Operators,并通过 Kubernetes API 以及命令行 Kubernetes 工具(例如「kubectl」)以本地方式创建 Amazon SageMaker 任务。
目前,众多 AWS 客户都在使用 Amazon Elastic Kubernetes 服务(EKS)等托管服务,旨在借助开源通用容器编排系统 Kubernetes 实现容器化应用程序的部署与管理。例如,数据科学家与开发人员可以借此建立起可复用机器学习流水线,同时更好地控制自己的训练与推理工作负载。但是,为了支持各类常见的机器学习工作负载,客户们仍然需要编写自定义代码以优化底层 ML 基础设施,确保高可用性与可靠性,从而获取各类数据科学生产力工具并遵循相关安全性与法规要求。例如,当 Kubernetes 客户利用 GPU 进行训练与推理时,往往需要变更 Kubernetes 调度以及 GPU 工作负载扩展的具体方式,从而尽可能提高资源利用率、吞吐量以及可用性。同样的,为了将训练完成的模型部署至生产环境当中,Kubernetes 客户也需要投入不少时间对跨越多个可用区的自动伸缩集群进行设置以及优化。
Amazon SageMaker Opeartors for Kubernetes 成功填补了这一空白。现在,客户已经不再需要面对 Amazon SageMaker 与 Kubernetes 工作流程间的繁琐整合工作。从今天开始,使用 Kubernetes 的客户可以轻松调用 Amazon SageMaker,利用这项模块化全托管服务快速构建、构建以及部署大规模机器学习(ML)模型。在 Amazon SageMaker 工作流的帮助下,用户将可实现计算资源的预配置与优化、仅在请求时进行配置、根据实际需要加以扩展,并在作业完成时自动关闭,从而提供近 100% 资源利用率。而在最新 Amazon SageMaker Operator for Kubernets 的帮助下,客户既能够继续享受 Kubernetes 与 EKS 的可移植性与标准化优势,又能够将众多现有优势与 Amazon SageMaker 集成起来,且整个过程无需任何自定义代码。

Amazon SageMaker 与 Kubernetes

机器学习不仅仅是模型。机器学习工作流当中包含数据的摄取与准备、机器学习模型构建、模型训练与评估,以及模型的生产场景部署乃至持续性生产监控。Amazon SageMaker 是一项模块化全托管服务,可帮助数据科学家以及开发人员更快完成模型的构建、训练、部署以及维护等任务。
但模型构建相关工作流本身不可能孤立存在,其往往是更大规模流水线的一部分,而后者则跨越多种用于支持整体应用程序的工程团队与服务项目。Kubernetes 用户(包括 Amazon EKS 客户)通过编写配置文件进行工作负载部署,Kubernetes 则负责将该工作负载与用户 Kuberenetes 集群内的可用计算资源进行匹配。虽然具有良好的控制性与可移植性,但在 Kubernetes 集群之上运行机器学习工作负载同样会带来一系列独特的挑战。例如,基础设施需要额外管理,例如针对利用率、成本以及性能做出优化;遵循适当的安全与合规性要求;同时确保实现可高用性与可靠性等等。这一切都属于重复且相当繁琐的日常工作,往往会在发布 ML 应用程序的过程中耗费大量宝贵的时间与资源。Kubernetes 客户希望单纯控制编排与流水线,而不必分心于集群内的 ML 基础设施与服务管理工作。
Amazon SageMaker Operators for Kubernetes 将 Amazon SageMaker 与 Kubernetes 整合起来,希望切实满足这方面需求。立足 Kubernetes,数据科学家与开发人员将可以使用完全为 ML 工作流设计及优化的全托管服务。与此同时,基础设施与平台团队则可对 Kubernetes 内的工作负载进行编排,从而在保证可控制性与可移植性的同时,摆脱 ML 基础设施与服务管理带来的沉重负担。在向 Kubernetes 当中添加新功能的过程中,开发人员可以创建特定于应用程序或者域的逻辑与组件自定义资源,从而轻松完成对 Kubernetes API 的扩展。Kubernetes 中的 Operator 允许用户以本地方式调用这些自定义资源,同时自动执行相关工作流程。在 Kubernetes 集群之上安装 Amazon SageMaker Opeartors for Kubernetes 之后,大家即可立足集群将 Amazon SageMaker 添加为“自定义资源”,而后直接使用以下 Amazon SageMaker Operators:

  • 训练 – 在 Amazon SageMaker 当中训练 ML 模型,包括 Managed Spot Training,从而节约达 90% 的训练成本;同时采取分布式训练方法,同时利用多个 GPU 节点以缩短训练周期。您只需要在作业执行过程内根据实际使用资源付费,从而获得接近 100% 的资源利用率。
  • 调优 – 对 Amazon SageMaker 中的模型超参数进行调优,包括配合 Amazon EC2 竞价实例以实现高达 90% 的成本节约。Amazon SageMaker Automatic Model Tuning 能够自动为模型搜索更准确的超参数范围,实现高效超参数优化,最终大大缩短模型调优的执行周期。
  • 推理 – 在 Amazon SageMaker 中,将经过训练的模型部署至全托管自动扩展集群当中,同时跨越多个可用区以实现高性能、高可用性实时或批量预测。

每一个 Amazon SageMaker Operator for Kubernetes 都将为用户提供本地化的作业创建与交互体验,包括调用 Kubernetes API 以及使用 Kubernetes 命令行工具(kubectl 等)两种具体方式。工程团队可以利用这些 operators 在 Kubernetes 当中为数据科学家构建起自动化、工具完备且定制化的界面,同时彻底摆脱 ML 基础设施的构建、维护与优化等恼人环节。熟悉 Kubernetes 的数据科学家与开发人员亦可本地编写代码,并与 Amazon SageMaker 的训练、调优以及推理作业进行交互,整个过程与本地 Kubernetes 作业执行毫无区别。来自 Amazon SageMaker 作业的日志流将传输回 Kubernetes,允许用户通过本地命令行查看模型训练、调优以及推理任务的当前状态。

联手 TensorFlow

美国国家标准与技术研究院(MNIST)正在利用 Amazon SageMaker Training Operators for Kubernetes 训练一套简单的卷积神经网络模型。MNIST 采用的数据集包含从 0 到 9 的手写数字图像,这是一种相当流行的 ML 问题。MNIST 数据集共包含 6 万张训练图像与 1 万张测试图像。
整个实验包含以下几个步骤:

  • 在 Kubernetes 集群上安装 Amazon SageMaker Operators for Kubernetes
  • 创建一个用于训练的 YAML 配置文件
  • 利用 Amazon SageMaker Operator 训练模型

先决条件

在本示例中,我们需要使用 EKS 中的现成 Kubernetes 集群。关于如何在 Amazon EKS 当中创建新的集群,请参阅 Amazon EKS 入门指南
。大家还需要在负责控制该 Kubernetes 集群的设备(例如个人笔记本或者 EC2 实例)上完成以下操作:

  • 安装 kubectl(1.13 版本或者更高)。请确保您选择的 kubectl 主版本号与 Kubernetes 集群控制平面相统一。例如,1.13 版本的 kubetcl 可配合 Kubernetes 1.13 与 1.14 集群。关于更多细节信息,请参阅 如何安装 kubectl
  • AWS CLI(1.16.232 版本或者更高)。关于更多细节信息,请参阅 如何安装 AWS CLI 版本 1
  • AWS IAM Authenticator for Kubernetes。关于更多细节信息,请参阅  如何安装 aws-iam-authenticator
  • 为 operator 分配现有 IAM 访问密钥,或者利用 IAM 权限允许其创建用户、为用户添加政策或者创建访问密钥。

设置 IAM 角色与权限

在将 operator 部署至 Kubernetes 集群之前,请关联 IAM 角色与 OpenID Connect(OIDC)提供程序以进行身份验证。具体参见以下代码:


复制代码

# 设置区域与集群
exportCLUSTER_NAME=""
exportAWS_REGION=""
eksctl utils associate-iam-oidc-provider --cluster${CLUSTER_NAME}\
--region${AWS_REGION}--approve

您的输出结果应该如下所示:


复制代码

[_] eksctlversion0.10.1
[_]usingregion us-east-1
[_] IAM OpenIDConnectproviderisassociatedwithcluster"my-cluster"in"us-east-1"

现在,EKS 中的 Kubernetes 集群已经拥有 OIDC 身份提供程序,您可以创建角色并为其授权权限。使用以下命令以获取 OIDC 发布 URL:


复制代码

aws eksdescribe-cluster--name${CLUSTER_NAME}--region${AWS_REGION}\
--querycluster.identity.oidc.issuer --output text

以上命令将返回呈下 URL:


复制代码

https://oidc.eks.${AWS_REGION}.amazonaws.com/id/{Your OIDC ID}

利用上条命令返回的 OIDC ID 进行角色创建。使用以下代码创建一个名为“trust.json”的新文件。请记得利用 OIDC ID、AWS 账户以及 EKS 集群区域替换其中的对应部分。


复制代码

{
"Version":"2012-10-17",
"Statement": [
{
"Effect":"Allow",
"Principal": {
"Federated":"arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/"
},
"Action":"sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks..amazonaws.com/id/:aud":"sts.amazonaws.com",
"oidc.eks..amazonaws.com/id/:sub":"system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default"
}
}
}
]
}

现在,创建一个新的 IAM 角色:


复制代码

awsiamcreate-role--role-name--assume-role-policy-documentfile://trust.json--output=text

输出结果将返回“ROLE ARN”,我们将其传递至 operator 以安全从 Kubernetes 集群处调用
Amazon SageMaker。


复制代码

ROLEarn:aws:iam::123456789012:role/my-role2019-11-22T21:46:10Z/ABCDEFSFODNN7EXAMPLEmy-role
ASSUMEROLEPOLICYDOCUMENT2012-10-17
STATEMENTsts:AssumeRoleWithWebIdentityAllow
STRINGEQUALSsts.amazonaws.comsystem:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default
PRINCIPALarn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/

最后,允许新角色访问 Amazon SageMaker 并为其添加 AmazonSageMakerFullAccess
政策。


复制代码

aws iam attach-role-policy --role-name  --policy-arnarn:aws:iam::aws:policy/AmazonSageMakerFullAccess

在 Kuberentes 集群上设置 operator

GitHub repo
处下载 YAML 配置文件,即可安装可供使用的 Amazon SageMaker operator。


复制代码

wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/release/rolebased/installer.yaml

在 installer.yaml 文件中,使用此前步骤中基于 OIDC 角色中的 ARN 更新 eks.amazonaws.com/role-arn。
现在,在您的 Kubernetes 集群上安装 Amazon SageMaker CRD 并设置您要使用的 operators。


复制代码

kubectl -fapplyinstaller.yaml

验证您 Kubernetes 集群中的 Amazon SageMaker Operators 是否可用。详见以下代码:


复制代码

$ kubectlgetcrd | grep sagemaker
batchtransformjobs.sagemaker.aws.amazon.com2019-11-20T17:12:34Z
endpointconfigs.sagemaker.aws.amazon.com2019-11-20T17:12:34Z
hostingdeployments.sagemaker.aws.amazon.com2019-11-20T17:12:34Z
hyperparametertuningjobs.sagemaker.aws.amazon.com2019-11-20T17:12:34Z
models.sagemaker.aws.amazon.com2019-11-20T17:12:34Z
trainingjobs.sagemaker.aws.amazon.com2019-11-20T17:12:34Z

利用这些 oepartors,全部 Amazon SageMaker 安全托管 ML 基础设施与软件优化方案都将以定制化资源的形式供您的 Kubernetes 集群使用。
要通过命令行使用 kubetcl 查看 Amazon SageMaker 日志,我们还需要安装以下客户端:


复制代码

export os="linux"
wget https://amazon-sagemaker-operator-for-k8s-us-east-1.s3.amazonaws.com/kubectl-smlogs-plugin/latest/${os}.amd64.tar.gz
tar xvzf ${os}.amd64.tar.gz
# 将二进制代码移动至您的 homedir 目录中。
mkdir ~/sagemaker-k8s-bin
cp./kubectl-smlogs.${os}.amd64/kubectl-smlogs~/sagemaker-k8s-bin/.
# 这一行将二进制代码添加至您的.bashrc 路径内。
echo'export PATH=$PATH:~/sagemaker-k8s-bin' >> ~/.bashrc
# 指定.bashrc 源以更新环境变量:
source ~/.bashrc

准备训练任务

在为 Amazon SageMaker 训练任务创建 YAML 配置文件之前,我们需要首先创建一套容器,用于容纳您的 Python 训练代码(可通过 tensorflow_distributed_mnist
GitHub repo 下载)。另外,大家也可以使用  AWS Deep Learning Containers
提供的 TensorFlow GPU 镜像创建 Dockerfile。详见以下代码:


复制代码

# 使用 AWS 深度学习容器镜像
FROM763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-training:1.13-gpu-py3
## 添加训练脚本
COPY train.py/opt/ml/code/train.py
ENV SAGEMAKER_PROGRAM train.py
ENV SM_MODEL_DIR=/opt/ml/model

在本示例中,我们将 MNIST 训练数据集上传至 S3 存储桶。接下来,创建 train.yaml YAML 配置文件即可开始训练。另外,请将 TrainingJob 指定为 Amazon SageMaker 模型训练的自定义资源,以供 Kubernetes 集群随时调用。


复制代码

apiVersion: sagemaker.aws.amazon.com/v1
kind: TrainingJob
metadata:
name: tf-mnist
spec:
algorithmSpecification:
trainingImage:578276202366.dkr.ecr.us-west-2.amazonaws.com/mnist-demo:latest
trainingInputMode: File
roleArn: {YOURROLE:ARN}
region: us-west-2
outputDataConfig:
s3OutputPath:s3://{YOUR OUTPUT PATH}
resourceConfig:
instanceCount:1
instanceType: ml.p2.8xlarge
volumeSizeInGB:30
stoppingCondition:
maxRuntimeInSeconds:86400
inputDataConfig:
-channelName: train
dataSource:
s3DataSource:
s3DataType: S3Prefix
s3Uri:s3://sagemaker-us-west-2-578276202366/data/DEMO-mnist
s3DataDistributionType: FullyReplicated
contentType: text/csv
compressionType: None

模型训练

现在,我们可以使用以下命令开始模型训练了:


复制代码

$ kubectl apply -f training.yaml
trainingjob.sagemaker.aws.amazon.com/tf-mnist created

Amazon SageMaker Operator 会利用您在 train.yaml 文件中指定的规范在 Amazon SageMaker 中创建一项训练任务。大家可以与该训练任务交互,具体方法与常规 Kubernetes 使用完全相同。详见以下代码:


复制代码

$ kubectl describe trainingjob tf-mnist
$ kubectlgettrainingjob tf-mnist
$ kubectl smlogs trainingjob tf-mnist
tf-mnist-fa964bf80e4b11ea89d40e3ef2d156bc/algo-1-157455316615745532661532019-11-2323:54:25,480sagemaker-containers INFO Reporting training SUCCESS

在训练任务结束之后,我们在 Amazon SageMaker 中用于训练工作的所有计算实例都将立即中止。

关于更多相关示例,请参阅 GitHub repo

全新 Amazon SageMaker 功能上线

Amazon SageMaker Operators for Kubernetes 目前已经在美国东区(俄亥俄州)、美国东区(北弗吉尼亚州)、美国西区(俄勒冈州)以及欧盟区(爱尔兰)等 AWS 区域正式上线。关于更多细节信息及操作指南,请参阅我们的 用户指南

我们也欢迎大家分享您的体验与反馈,或者提交更多 YAML 规范示例或者 operator 改进建议。您可以联系 Amazon SageMaker 分论坛、GitHub repo 或者 AWS 客户代表提供意见,帮助我们进一步完善 Amazon SageMaker Operators for Kubernetes。
原文链接:

https://aws.amazon.com/cn/blogs/machine-learning/introducing-amazon-sagemaker-operators-for-kubernetes/