美国时间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 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 Operator for Kubernetes都将为用户提供本地化的作业创建与交互体验,包括调用Kubernetes API以及使用Kubernetes命令行工具(kubectl等)两种具体方式。工程团队可以利用这些operators在Kubernetes当中为数据科学家构建起自动化、工具完备且定制化的界面,同时彻底摆脱ML基础设施的构建、维护与优化等恼人环节。熟悉Kubernetes的数据科学家与开发人员亦可本地编写代码,并与Amazon SageMaker的训练、调优以及推理作业进行交互,整个过程与本地Kubernetes作业执行毫无区别。来自Amazon SageMaker作业的日志流将传输回Kubernetes,允许用户通过本地命令行查看模型训练、调优以及推理任务的当前状态。
美国国家标准与技术研究院(MNIST)正在利用Amazon SageMaker Training Operators for Kubernetes训练一套简单的卷积神经网络模型。MNIST采用的数据集包含从0到9的手写数字图像,这是一种相当流行的ML问题。MNIST数据集共包含6万张训练图像与1万张测试图像。
整个实验包含以下几个步骤:
在本示例中,我们需要使用EKS中的现成Kubernetes集群。关于如何在Amazon EKS当中创建新的集群,请参阅Amazon EKS入门指南。大家还需要在负责控制该Kubernetes集群的设备(例如个人笔记本或者EC2实例)上完成以下操作:
在将operator部署至Kubernetes集群之前,请关联IAM角色与OpenID Connect(OIDC)提供程序以进行身份验证。具体参见以下代码:
# 设置区域与集群
export CLUSTER_NAME="<your cluster name>"
export AWS_REGION="<your region>"
eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} \
--region ${AWS_REGION} --approve
您的输出结果应该如下所示:
[_] eksctl version 0.10.1
[_] using region us-east-1
[_] IAM OpenID Connect provider is associated with cluster "my-cluster" in "us-east-1"
现在,EKS中的Kubernetes集群已经拥有OIDC身份提供程序,您可以创建角色并为其授权权限。使用以下命令以获取OIDC发布URL:
aws eks describe-cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} \
--query cluster.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::<AWS account number>:oidc-provider/oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:aud": "sts.amazonaws.com",
"oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:sub": "system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default"
}
}
}
]
}
现在,创建一个新的IAM角色:
aws iam create-role --role-name <role name> --assume-role-policy-document file://trust.json --output=text
输出结果将返回“ROLE ARN”,我们将其传递至operator以安全从Kubernetes集群处调用
Amazon SageMaker。
ROLE arn:aws:iam::123456789012:role/my-role 2019-11-22T21:46:10Z / ABCDEFSFODNN7EXAMPLE my-role
ASSUMEROLEPOLICYDOCUMENT 2012-10-17
STATEMENT sts:AssumeRoleWithWebIdentity Allow
STRINGEQUALS sts.amazonaws.com system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default
PRINCIPAL arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/
最后,允许新角色访问Amazon SageMaker并为其添加AmazonSageMakerFullAccess 政策。
aws iam attach-role-policy --role-name <role name> --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess
从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 -f apply installer.yaml
验证您Kubernetes集群中的Amazon SageMaker Operators是否可用。详见以下代码:
$ kubectl get crd | grep sagemaker
batchtransformjobs.sagemaker.aws.amazon.com 2019-11-20T17:12:34Z
endpointconfigs.sagemaker.aws.amazon.com 2019-11-20T17:12:34Z
hostingdeployments.sagemaker.aws.amazon.com 2019-11-20T17:12:34Z
hyperparametertuningjobs.sagemaker.aws.amazon.com 2019-11-20T17:12:34Z
models.sagemaker.aws.amazon.com 2019-11-20T17:12:34Z
trainingjobs.sagemaker.aws.amazon.com 2019-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深度学习容器镜像
FROM 763104351884.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: {YOUR ROLE: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
$ kubectl get trainingjob tf-mnist
$ kubectl smlogs trainingjob tf-mnist
tf-mnist-fa964bf80e4b11ea89d40e3ef2d156bc/algo-1-1574553166 1574553266153 2019-11-23 23:54:25,480 sagemaker-containers INFO Reporting training SUCCESS
在训练任务结束之后,我们在Amazon SageMaker中用于训练工作的所有计算实例都将立即中止。
关于更多相关示例,请参阅 GitHub repo。
Amazon SageMaker Operators for Kubernetes目前已经在美国东区(俄亥俄州)、美国东区(北弗吉尼亚州)、美国西区(俄勒冈州)以及欧盟区(爱尔兰)等AWS区域正式上线。关于更多细节信息及操作指南,请参阅我们的用户指南。
我们也欢迎大家分享您的体验与反馈,或者提交更多YAML规范示例或者operator改进建议。您可以联系Amazon SageMaker分论坛、GitHub repo或者AWS客户代表提供意见,帮助我们进一步完善Amazon SageMaker Operators for Kubernetes。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货