机器学习不仅仅关乎模型。ML工作流包含数据寻源和筹备数据、构建ML模型、训练和评估模型、将模型部署到生产环境以及生产后继续监控。Amazon SageMaker可帮忙用户更快地构建、训练、部署和保护模型。
然而,与构建模型相干的工作通常是规模更大的工作流的一部分,此工作流逾越了多个反对全局应用程序的工程团队和服务。Kubernetes用户(包含EKS客户)通过编写配置文件来部署工作负载,Kubernetes将这些配置文件与Kubernetes集群中的可用计算资源相匹配。尽管Kubernetes为用户提供了控制权和可移植性,但在Kubernetes集群上运行ML工作负载却会带来独特挑战。例如,底层基础设施须要额定的治理:针对利用率、老本和性能进行优化、合乎实用的平安和法规要求,以及确保高可用性和可靠性等等。这些无差别的沉重工作占用了贵重的工夫和资源,延缓了将新的ML利用投入市场的速度。
如何管制编排和工作流,同时又免于治理集群中的底层ML基础设施及服务?
Amazon SageMaker Operator能够帮忙数据科学家以及开发人员利用Kubernetes接口来创立和治理SageMaker工作,如机器学习的模型训练、超参优化、批量转换以及实时推理等。
如图所示,SageMaker Operator能够让开发与运维人员通过Kubectl命令行或者Kubernetes API接口调用的形式来治理和应用SageMaker服务,它就像翻译器一样,在Kubernetes平台与AWS SageMaker服务之间搭建了一座桥梁,让那些曾经很很相熟Kubernetes的开发、运维人员在无需投入过多精力的状况下,即可疾速地应用SageMaker服务。
利用场景
SageMaker Operator能够让那些曾经很理解Kubernetes平台的开发人员以十分相熟和敌对的形式来应用SageMaker服务,它十分实用于以下一些场景。
1、 我的项目团队曾经十分相熟Kubernetes平台的接口和规范,因为我的项目需要,心愿引进机器学习局部。因为人员数量无限,团队不心愿再去独自保护一套机器学习平台,而是在充分利用已有的能力的根底上,适当引进第三方的工具和服务,疾速地进行业务翻新,升高学习和应用的老本,大幅度晋升效率。
2、 我的项目团队已在Kubernetes平台的根底上很好的实现了DevOps,很多业务模块都曾经做到了继续集成与继续公布。机器学习局部只是整个业务零碎中的一个模块,团队心愿可能能将机器学习模块与其它业务模块对立进行工程化的治理,最终实现业务流程的全自动化。
技术原理
与其它第三方利用的Kubernetes Operator实现机制一样,SageMaker Operator由Kubernetes CRD和Controller两局部组成。如图所示,在装置好SageMaker Operator之后,SageMaker Operator会向Kubernetes平台新注册一些与SageMaker服务相干CRD,同时以Pod的形式在Kubernetes Worker Node上运行SageMaker Operator Controller。当开发人员须要创立机器学习的工作时,首先须要在yaml文件中定义与CRD资源相干的要害配置参数,而后通过kubectl提交命令创立CRD资源,在CRD资源资源胜利创立后,SageMaker Controller能够从Kubernetes API Server监听到与该CRD相干的信息,之后解析参数并调用SageMaker服务,实现机器学习工作的创立。
Operator是Kubernetes中一个重要概念,它能够让开发人员在Kubernetes的根底上进行高级的形象和封装,从而能够更加容易地装置和治理简单的利用。除了SageMaker Operator,很多公司和开源机构都会依照Kubernetes的规范把封装本人的Operator。Kubernetes Operator概念绝对形象,技术实现细节也比较复杂,若想对它更深刻的理解,咱们首先须要了解Kubernetes资源创立的机制和流程,同时也须要了解Kubernetes CRD和Controller等一些重要的概念,本文不会就Kubernetes Operator的技术细节做过多的开展,对于更多无关Kubernetes Operator的介绍,请参考以下链接:
- Kubernetes CRD
- Kubernetes Controller
- Kubernetes Operator
试验演示
下文咱们将演示一个具体的例子,从而更好地阐明如何如何利用AWS SageMaker Operator来实现机器学习工作的创立和治理。在该计划中,咱们会用到以下服务:
- AWS S3:AWS对象存储服务,用于寄存训练数据集以及机器学习模型。
- AWS EKS:AWS Kubernetes托管服务,用于运行SageMaker Operator以及其它与Kubernetes相干的利用。
- AWS SageMaker:AWS机器学习托管服务,用于实现数据处理、模型训练、模型优化以及模型部署等机器学习工作的自动化创立和治理。Operator会主动解析参数并调用SageMaker服务实现机器学习工作的创立。
- AWS IAM:AWS平安治理服务,用于管制SageMaker Operator以及SageMaker对AWS资源的拜访权限。
- AWS CloudWatch:AWS日志治理服务,用于记录SageMaker机器学习工作的日志同时将日志以事实的形式推送至AWS EKS。
试验内容
搭建EKS集群,配置IAM权限,装置SageMaker Operator。
- 通过kubectl命令创立SageMaker机器学习训练任务,提交工作后能够在SageMaker界面上看到机器训练任务,工作完结后确认模型会主动上传至S3。
- 通过kubectl命令创立SageMaker机器学习部署的工作,提交工作后能够在SageMaker界面上看到机器学习部署工作,SageMaker会主动创立虚拟机并加载模型。
试验步骤
1、EKS集群搭建
EKS是AWS的Kubernetes托管集群,咱们能够通过图形界面或者命令行的形式实现集群的创立。在本试验中,咱们在ap-southeast-1区域部署Kubernetes集群,该集群会蕴含一个Worker Node Group,该Node Group内有三个c5.xlarge的计算实例。在默认状况下,节点会采纳高可用的形式平均地部署在该区域的多个可用区内,如果有定制化需要,咱们也能够通过指定命令行参数或者编写配置文件来指定可用区。
1.1 运行命令,创立集群。
eksctl create cluster --region <region-name> --name=<cluster-name> --nodes-min=3 --nodes-max=5 --node-type=c5.xlarge --ssh-access —ssh-public-key <ssh-keyname>
1.2 运行命令,查看Kubernetes节点的工作状态。
kubectl get node
2、创立OpenID Connect Provider
OpenID Connect Provider能够将Kubernetes内的Service Account与AWS IAM的角色进行关联。在上文中咱们提到过,SageMaker Operator Controller会以Pod的形式运行在EKS节点上,该Pod在监听到资源的创立信息后会调用SageMaker服务,而胜利调用SageMaker的前提是该Pod要具备相应的权限。咱们晓得Kubernetes内Pod的权限调配个别是要通过Service Account传入的,所以OpenID Connect Provider的作用便是将集群外的IAM角色与集群内的Service Account进行关联。
2.1 运行命令获取OIDC ID。
请将${CLUSTERNAME}替换成理论的EKS集群名称,将${AWSREGION}替换成理论的Region。
aws eks describe-cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} \--query cluster.identity.oidc.issuer --output text
命令运行胜利或会返回如下相似的后果:
https://oidc.eks.${AWS_REGION}.amazonaws.com/id/D48675832CA65BD10A532F597OIDCID
2.2 创立名为trust.json的文件。
文件模板如下所示。请将<OIDC ID>替换成为上一步获取的ID,将<AWS account number>替换成以后账号的ID,将<EKS Cluster region>替换成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" } } } ]}
应用上一步创立胜利的trust.json文件,并运行上面命令创立IAM角色,将<role name>替换成本人须要的名称。
aws iam create-role --role-name <role name> --assume-role-policy-document file://trust.json --output=text
命令运行胜利后会返回如图所示的后果:
2.3 运行下列命令,将SageMaker FullAccess的权限赋予上一步所创立的角色。
aws iam attach-role-policy --role-name <role name> --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess
在实现角色的创立和权限的配置后,请记录角色的ARN,在前面创立SageMaker Operator时,咱们须要为SageMaker Operator配置该角色,从而确保SageMaker Operator Controller具备操作SageMaker的权限。
3、装置SageMaker Operator
SageMaker Operator的装置形式很灵便,咱们能够间接通过yaml文件进行部署或者通过Helm的形式进行装置部署,本次试验中咱们通过yaml的形式进行部署。在上文提到过,SageMaker Operator由CRD和Controller两局部组成,其中Controller会以Pod的模式运行在EKS Worker Node上。
3.1 运行命令下载用于装置SageMaker Operator的yaml文件。
wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-**for**-k8s/master/release/rolebased/installer.yaml
3.2 下载完yaml文件后,进入文件内。
找到eks.amazonaws.com/role-arn参数项,将该参数对应的值更新为2.3步所创立角色的ARN。
3.3 运行下列命令装置SageMaker Operator
kubectl apply -f installer.yaml
上文曾提到,SageMaker Operator由CRD与Controller两局部组成,当SageMaker Operator装置胜利后,SageMaker Operator会向Kubernetes集群内注册新的CRD,同时以Pod的模式在Kubernetes Worker Node上运行SageMaker Operator Controller。
3.4 运行下列命令查看新创建的CRD。
kubectl get crd | grep sagemaker
3.5 运行下列命令查看新创建的SageMaker Operator Controller。
kubectl -n sagemaker-k8s-operator-system get pods
4 装置SageMaker Operator日志插件
SageMaker日志插件是SageMaker Operator中的一个可选项,SageMaker的工作在运行过程中会将日志推送至CloudWatch的日志组中,而SageMaker Operator日志插件则可实时地将CloudWatch日志收集到Kubernetes集群上,从而让开发人员通过kubectl命令查看SageMaker工作的日志。SageMaker Operator日志插件的装置是可选项,若装置则能够不便用户对日志进行治理,不装置也不会影响到工作本身的创立。
4.1 运行命令,装置SageMaker日志插件
export os="linux" wget https://amazon-sagemaker-operator-for-k8s-us-east-1.s3.amazonaws.com/kubectl-smlogs-plugin/v1/${os}.amd64.tar.gztar xvzf ${os}.amd64.tar.gz # Move binaries to a directory in your homedir.mkdir ~/sagemaker-k8s-bincp ./kubectl-smlogs.${os}.amd64/kubectl-smlogs ~/sagemaker-k8s-bin/. # This line will add the binaries to your PATH in your .bashrc. echo 'export PATH=$PATH:~/sagemaker-k8s-bin' >> ~/.bashrc # Source your .bashrc to update environment variables:source ~/.bashrc
4.2 运行下列命令验证插件是否装置胜利。
kubectl smlogs
5、创立机器学习训练任务
接下来,咱们将创立一个SageMaker机器学习模型训练的工作,这里咱们以SageMaker内置算法xgboost为例,对MINIST数据集进行模型的训练和部署。
5.1 运行命令,生成数据集并将数据集上传至S3存储桶。
请将<BUCKET_NAME>替换成本人的S3存储桶名称。
`wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/scripts/upload_xgboost_mnist_dataset/upload_xgboost_mnist_dataset \chmod +x upload_xgboost_mnist_dataset \./upload_xgboost_mnist_dataset --s3-bucket <BUCKET_NAME> --s3-prefix xgboost-mnist`
查看S3存储桶,能够发现训练、测试和验证数据集都已胜利上传至S3存储桶上。
5.2 运行命令创立SageMaker角色。
在创立SageMaker工作前,须要为SageMaker创立好角色,从而确保SageMaker能够顺利运行相干的工作。
export assume_role_policy_document='{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "sagemaker.amazonaws.com" }, "Action": "sts:AssumeRole" }]}'aws iam create-role --role-name <execution role name> --assume-role-policy-document file://<(echo "$assume_role_policy_document")aws iam attach-role-policy --role-name <execution role name> --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess
5.3 筹备机器学习训练任务yaml文件。
在该文件中,须要配置与SageMaker训练任务相干的重要参数。对于机器学习训练任务yaml文件的模板请参考如下,请将变量局部替换成理论的参数,要害参数解释请参考模板中的备注信息。
apiVersion: sagemaker.aws.amazon.com/v1kind: TrainingJob // CRD类型metadata: name: xgboost-mnistspec: roleArn: <Your SageMaker Role> // 上一步创立的SageMaker role region: <Your-Region> // EKS集群所在的region algorithmSpecification: trainingImage: <Docker Image> // SageMaker XGboost镜像的寄存地位,请参考SageMaker官网文档查看具体的镜像地位。 trainingInputMode: File outputDataConfig: s3OutputPath: <s3://your-bucket/test> // 测试数据集寄存地位 inputDataConfig: - channelName: train dataSource: s3DataSource: s3DataType: S3Prefix s3Uri: <s3://your-bucket/train> // 训练数据集寄存地位 s3DataDistributionType: FullyReplicated contentType: text/csv compressionType: None - channelName: validation dataSource: s3DataSource: s3DataType: S3Prefix s3Uri: <<s3://your-bucket/validate> //验证数据集寄存地位 s3DataDistributionType: FullyReplicated contentType: text/csv compressionType: None resourceConfig: instanceCount: 1 // SageMaker实例数量 instanceType: ml.m4.xlarge //SageMaker实例类型 volumeSizeInGB: 5 // SageMaker 根卷大小 hyperParameters: // 超参设置,不同的算法会有不同的参数。 - name: max_depth value: "5" - name: eta value: "0.2" - name: gamma value: "4" - name: min_child_weight value: "6" - name: silent value: "0" - name: objective value: multi:softmax - name: num_class value: "10" - name: num_round value: "10" stoppingCondition: maxRuntimeInSeconds: 86400
5.4 运行命令,创立SageMaker训练任务。
`kubectl apply -f train.yaml`
5.5 运行命令,查看SageMaker训练任务状态。
`$ kubectl describe trainingjob xgboost-mnist$ kubectl get trainingjob xgboost-mnist`
5.6 进入AWS控制台,查看AWS SageMaker训练任务状态。
5.7 工作训练完结后,模型会被主动寄存至S3。
进入S3控制台,能够查看到模型以及胜利上传。
6、模型部署
模型训练完结后,咱们将创立模型部署工作,SageMaker Operator会主动调用SageMaker服务实现模型的部署。
6.1 创立模型部署yaml文件。
在该文件中,咱们须要配置与SageMaker模型部署工作相干的重要参数。对于模型部署工作的yaml文件的模板请参考如下,请将变量局部替换成理论的参数,要害参数解释请参考模板中的备注信息。
apiVersion: sagemaker.aws.amazon.com/v1kind: HostingDeployment //CRD类型metadata: name: hosting-deploymentspec: region: <Your-Region> // EKS集群所在区域 productionVariants: - variantName: AllTraffic modelName: xgboost-model initialInstanceCount: 1 // 部署实例类型数量 instanceType: ml.r5.large //部署实例类型 initialVariantWeight: 1 models: - name: xgboost-model executionRoleArn: <Your SageMaker Role> // 上一步创立的SageMaker role containers: - containerHostname: xgboost modelDataUrl: <S3://Your-Bucket/Model> //模型寄存地址 image: <Docker-Image> // SageMaker XGboost Docker Image地址,请参考SageMaker官网文档查看镜像具体寄存地位。
6.2 运行命令查看模型部署工作状态
kubectl get hostingdeployments
6.3 进入AWS控制台,查看SageMaker模型部署工作。
在下面试验中,咱们举了模型训练和部署的例子,除了这两种工作,SageMaker Operator还反对参数优化、批量转换以及模型部署配置等其它工作,咱们能够依据我的项目中的理论需要灵便抉择绝对应的工作。
总结
利用SageMaker Operator,我的项目团队能够应用所相熟的Kubernetes命令以及接口治理简单机器学习工作与流程,无需在已有的基础设施战争台上做出改变便能够疾速地启动与机器学习相干的我的项目,从而极大水平地晋升效率、降低成本。
在实在我的项目中,机器学习局部往往只是整个业务零碎的一个模块,因而在设计方案时也须要系统性的思考,除了机器学习流程自身,还须要思考CI/CD、监控运维、安全控制、服务集成等多方面的因素。AWS能够做到服务之间的高度集成,在理论生产中,咱们齐全能够在下面试验案例的根底上进一步扩大,集成新的服务,从而构建一个端到端的解决方案。