发布于: Jul 22, 2022

 

我们将演示一个具体的例子,从而更好地说明如何如何利用 Amazon SageMaker Operator 自动化机器学习平台来实现机器学习任务的创建和管理

 

在本篇博客中我们将演示一个具体的例子,从而更好地说明如何如何利用 Amazon SageMaker Operator 自动化机器学习平台来实现机器学习任务的创建和管理。在该方案中,我们会用到以下服务:

  • Amazon S3 :Amazon Web Services 对象存储服务,用于存放训练数据集以及机器学习模型。
  • Amazon EKS :Amazon Kubernetes 托管服务,用于运行 SageMaker Operator 以及其它与 Kubernetes 相关的应用。
  • Amazon SageMaker: Amazon Web Services 机器学习托管服务,用于实现数据处理、模型训练、模型优化以及模型部署等机器学习任务的自动化创建和管理。Operator 会自动解析参数并调用 SageMaker 服务完成机器学习任务的创建。
  • Amazon IAM: Amazon Web Services 安全管理服务,用于控制 SageMaker Operator 以及 SageMaker 对 Amazon Web Services 资源的访问权限。
  • Amazon CloudWatch:Amazon Web Services 日志管理服务,用于记录 SageMaker 机器学习任务的日志同时将日志以事实的方式推送至 Amazon EKS。
 

搭建 EKS 集群,配置 IAM 权限,安装 SageMaker Operator。

通过 kubectl 命令创建 SageMaker 机器学习训练任务,提交任务后可以在 SageMaker 界面上看到机器训练任务,任务结束后确认模型会自动上传至 S3。

通过 kubectl 命令创建 SageMaker 机器学习部署的任务,提交任务后可以在 SageMaker 界面上看到机器学习部署任务,SageMaker 会自动创建虚拟机并加载模型。

 

 

1、EKS 集群搭建

EKS 是 Amazon Web Services 的 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 与 Amazon IAM 的 role 进行关联。在上文中我们提到过,SageMaker Operator Controller 会以 pod 的方式运行在 EKS 的节点之上,该 pod 在监听到资源的创建信息后会调用 SageMaker 服务,而成功调用 SageMaker 的前提是该 Pod 要具备相应的权限,我们知道 Kubernetes 内 Pod 的权限分配一般是要通过 service account 传入的,所以 OpenID Connect Provider 的作用便是将集群外的 IAM role 与集群内的 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,将 <role name> 替换成一个自己需要的名称。

aws iam create-role --role-name <role name> --assume-role-policy-document file://trust.json --output=text

命令运行成功后会返回如图所示的结果。

2.3 运行下面命令,将 SageMaker FullAccess 的权限赋予上一步所创建的 role。

aws iam attach-role-policy --role-name <role name> --policy-arn 
arn:aws:iam::aws:policy/AmazonSageMakerFullAccess

在完成 role 的创建和权限的配置之后,请记录 role 的 arn,在后面创建 SageMaker Operator 时,我们需要为 SageMaker Opearator 配置该 role。从而确保 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 步所创建 role 的 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 role,在创建 SageMaker 任务之前,我们需要为 SageMaker 创建好 role,从而确保 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 进入 Amazon Web Services 控制台,查看 Amazon 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 进入 Amazon Web Services 控制台,查看 SageMaker 模型部署任务。

在上面实验中,我们举了模型训练和部署的例子,除了这两种任务, SageMaker Operator 还支持参数优化、批量转换以及模型部署配置等其它任务,我们可以根据项目中的实际需求灵活选择相对应的任务。

 

利用 SageMaker Operator,项目团队可以使用所熟悉的 Kubernetes 命令以及接口管理复杂机器学习任务与流程,无需在已有的基础设施和平台上做出改动便可以快速地启动与机器学习相关的项目,从而极大程度地提升效率、降低成本。在真实的项目中,机器学习部分往往只是整个业务系统的一个模块,因此在设计方案时也需要系统性的考虑,除了机器学习流程本身,还需要考虑 CI/CD、监控运维、安全控制、服务集成等多方面的因素,Amazon Web Services 可以做到服务之间的高度集成,在实际生产中,我们完全可以在上面实验案例的基础上进一步扩展,集成新的服务,从而构建一个端到端的解决方案。

 

相关文章