共计 10061 个字符,预计需要花费 26 分钟才能阅读完成。
机器学习不仅仅关乎模型。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.gz
tar xvzf ${os}.amd64.tar.gz
# Move binaries to a directory in your homedir.
mkdir ~/sagemaker-k8s-bin
cp ./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/v1
kind: TrainingJob // CRD 类型
metadata:
name: xgboost-mnist
spec:
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/v1
kind: HostingDeployment //CRD 类型
metadata:
name: hosting-deployment
spec:
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 能够做到服务之间的高度集成,在理论生产中,咱们齐全能够在下面试验案例的根底上进一步扩大,集成新的服务,从而构建一个端到端的解决方案。