亚马逊AWS官方博客

隆重推出 Amazon SageMaker Operators for Kubernetes

Original URL:https://amazonaws-china.com/blogs/machine-learning/introducing-amazon-sagemaker-operators-for-kubernetes/

AWS 很高兴地宣布正式推出 Amazon SageMaker Operators for Kubernetes。这项新功使得开发人员和数据科学家能更轻松地使用 Kubernetes 在 Amazon SageMaker 中训练、调优和部署机器学习 (ML) 模型。您可以在 Kubernetes 集群上安装这些operartors,以使用 Kubernetes API 和Kubernetes命令行工具(例如 kubectl)在集群创建 原生的Amazon SageMaker 任务。有关更多信息,请参阅白皮书 – 使用 Amazon SageMaker 和 Kubernetes 进行机器学习

许多 AWS 客户都使用 Kubernetes(一种开源的通用容器编排系统)来部署和管理容器化的应用程序。Amazon EKS 提供的托管服务可用于部署 Kubernetes。数据科学家和开发人员可以在 Kubernetes集群设置可重复的ML流程,并拥有对训练和推理工作负载的更大控制权。但是,为支持 ML 工作负载,您仍然需要编写自定义代码,以优化底层 ML 基础设施、提供高可用性和可靠性、提供数据科学生产力工具,并遵守适用的安全和法规要求。例如,如果您是使用 GPU 进行训练和推理的 Kubernetes 客户,那么您通常需要更改 Kubernetes 计划和扩展 GPU 工作负载的方式,以提高利用率、吞吐量和可用性。同样,为了将已经过训练的模型部署到生产环境中进行推理,您必须花费额外的时间来设置和优化跨多个可用区的自动扩展集群。

Amazon SageMaker Operators for Kubernetes 为您解决了这一问题,让您无需再执行集成 Amazon SageMaker 和 Kubernetes 工作流的繁重工作。在本文撰写之时,您已可实现从 kubectl 到 Amazon SageMaker 的简单调用,Amazon SageMaker 是一种完全托管的模块化服务,可帮助您更轻松地大规模构建、训练和部署 ML 模型。借助 Amazon SageMaker 中的工作流,您可以预先配置和优化计算资源,仅需在请求时进行预置,按需进行扩展,并在任务完成时自动关闭,从而实现接近 100% 的利用率。使用 Amazon SageMaker Operators for Kubernetes,您可以在继续享受 Kubernetes 和 EKS 的可移植性和标准化优势的同时,将 Amazon SageMaker 具备的众多其他优势加以整合,无需自定义代码即可实现。

Amazon SageMaker 和 Kubernetes

机器学习不仅仅关乎模型。ML 工作流包括数据寻源和准备数据、构建 ML 模型、训练和评估模型、将模型部署到生产环境以及生产后持续监控。Amazon SageMaker 可帮助您更快地构建、训练、部署和维护模型。

但是,与构建模型相关的工作通常是规模更大的工作流的一部分,此工作流跨越了多个支持全局应用程序的工程团队和服务。Kubernetes 用户(包括 EKS 客户)通过编写配置文件来部署工作负载,Kubernetes 将这些配置文件与 Kubernetes 集群中的可用计算资源相匹配。虽然 Kubernetes 为您提供了控制权和可移植性,但在 Kubernetes 集群上运行 ML 工作负载却会带来独特挑战。例如,底层基础设施需要额外的管理:针对利用率、成本和性能进行优化、符合适用的安全和法规要求,以及确保高可用性和可靠性等等。这些无差别的繁重工作占用了宝贵的时间和资源,延缓了将新的 ML 应用投入市场的速度。您既希望控制编排和工作流,也希望可以免于管理集群中的底层 ML 基础设施及服务。

Amazon SageMaker Operators for Kubernetes 通过将 Amazon SageMaker 和 Kubernetes 进行集成来满足这一需求。通过 Kubernetes,您可以获得专为 ML 工作流设计和优化的完全托管型的服务。基础设施和平台团队仍然可以通过在 Kubernetes 中编排工作负载来继续保持控制权和可移植性,而无需管理底层 ML 基础设施及服务。如需要向 Kubernetes 添加新的功能,您可以通过创建包含您特定于应用程序或特定于域的逻辑和组件的自定义资源(custom resource)来扩展 Kubernetes API。使用 Kubernetes 中的operators,您可以调用这些自定义资源并在本机自动执行相关工作流。您可以在 Kubernetes 集群上安装 SageMaker Operators for Kubernetes,以将 Amazon SageMaker 作为一种自定义资源添加到 Kubernetes 中。然后,您可以使用以下 Amazon SageMaker operators:

  • Train – 在 Amazon SageMaker 中训练 ML 模型,比如使用托管 Spot 训练可节省多达 90% 的训练成本;使用分布式训练则可通过扩展到多个 GPU 节点来减少训练时间。您只需为任务持续时间付费,从而获得近乎 100% 的利用率。
  • Tune – 优化 Amazon SageMaker 中的模型超参数,比如使用 Amazon EC2 Spot 实例可节省多达 90% 的成本。Amazon SageMaker Automatic Model Tuning 会执行超参数优化,在超参数范围内搜索更准确的模型,从而为您节省数天甚至数周的时间,并提高模型准确性。
  • Real-time inference – 在 Amazon SageMaker 中将经过训练的模型部署到分布在多个可用区中的完全托管型自动扩展集群中,以实时提供高性能和可用性。
  • Batch transform – 在大型数据集上创建托管的模型推理。您可以将其用于预处理以进行训练准备,或用于推断 Amazon SageMaker 中现有的经过训练的模型。

Amazon SageMaker Operator for Kubernetes 可通过 Kubernetes API 或 Kubernetes 命令行工具(如 kubectl)为您提供任务创建和与任务交互的原生 Kubernetes 体验。工程团队可以使用这些operators在 Kubernetes 中为数据科学家构建自动化、工具和自定义接口,而无需构建、维护或优化 ML 基础设施。熟悉 Kubernetes 的数据科学家和开发人员,可以在本地编写 Amazon SageMaker 训练、调优和推理任务并与之进行交互,和在本地执行 Kubernetes 任务是一样的。来自 Amazon SageMaker 任务的日志流式传输回 Kubernetes,让您可以在命令行中从本机查看模型训练、调优和预测任务的日志。

结合使用 Amazon SageMaker Operators for Kubernetes 与 XGBoost

本文将演示如何使用training operator基于修正版美国国家标准与技术研究院 (MNIST) 数据集训练梯度提升模型。MNIST 数据集中包含手写数字 0 到 9 的图片,该数据集是一个热门的 ML主题。MNIST 数据集包含 6 万张训练图片和 1 万张测试图片。

在本文中,我们会执行以下步骤:

  • 在 EKS 集群上安装 Amazon SageMaker Operators for Kubernetes
  • 为此训练任务创建 YAML 配置
  • 使用 Amazon SageMaker operator在 Amazon SageMaker 中训练模型

先决条件

本博文中的操作需要用到 EKS 中的现有 Kubernetes 集群。有关在 EKS 中创建新集群的信息,请参阅 Amazon EKS 入门。建议使用Fargate-only 集群。为完成本教程,您需要一个 Kubernetes 控制平面版本为 1.13 或更高版本的集群。您也可以在可用于控制 Kubernetes 集群(如 EC2 实例)的机器上使用以下这些工具。

  • Kubectl1.13 或更高版本)– 使用的 kubectl 版本不能高于 Kubernetes 集群控制平面的次版本。例如,1.13 版本的 kubectl 客户端可以与 Kubernetes 1.13 和 1.14 版本的集群一起使用。有关更多信息,请参阅安装 kubectl
  • AWS CLI1.16.232 或更高版本)– 您的凭证应在设置时进行配置。有关更多信息,请参阅安装 AWS CLI 版本 1
  • AWS IAM Authenticator for Kubernetes – 有关更多信息,请参阅安装 aws-iam-authenticator
  • 访问密钥或权限 – 提供现有的 IAM 访问密钥供操作员使用,或提供 IAM 权限来创建用户、将策略附加到用户以及创建访问密钥。

在本文撰写之时,smlog 仅支持 Linux,因此您应将其部署在运行 Ubuntu 操作系统的 EC2 计算机上。

设置 IAM 角色和权限

为了使操作员能够访问您的 SageMaker 资源,您首先需要配置一个承担已经过 OIDC 身份验证的角色且具有适当权限的 Kubernetes 服务账户。有关更多信息,请参阅在集群上为服务账户启用 IAM 角色

请执行以下步骤:

  1. 将 IAM OpenID Connect (OIDC)提供方与 EKS 集群关联,以验证可以使用AWS资源。请参阅以下代码:
    # Set the AWS region and EKS cluster name
    export CLUSTER_NAME="<your cluster name>"
    export AWS_REGION="<your region>"
    eksctl utils associate-iam-oidc-provider --cluster \ 
    ${CLUSTER_NAME} --region ${AWS_REGION} --approve

    您的输出应如下所示:

    [ℹ]  using region us-east-1
    [ℹ]  will create IAM Open ID Connect provider for cluster "my-cluster" in "us-east-1"
    [✔]  created IAM Open ID Connect provider for cluster "my-cluster" in "us-east-1"

    现在,EKS 中的 Kubernetes 集群已拥有 OIDC 身份提供方,您可以创建角色并为其授予权限。

  2. 使用以下代码获取 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}

    如果输出为 None,请确保您的 AWS CLI 使用了先决条件中列出的版本。

使用上一条命令返回的 OIDC ID 来创建角色。

  1. 使用以下代码创建名为 trust.json 的新文件:
    {
      "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 IC>"
        },
        "Action": "sts:AssumeRoleWithWebIdentity",
        "Condition": {
          "StringEquals": {
            "oidc.eks.<EKS cluster Region>.amazonaws.com/id/<OIDC IC>:aud": "sts.amazonaws.com",
            "oidc.eks.<EKS cluster Region>.amazonaws.com/id/<OIDC IC>:sub": "system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default"
          }
        }
      }]
    }
    

    使用您的 OIDC ID、AWS 账号和 EKS 集群区域更新代码中的占位符。

  2. 创建可由集群服务账户承担的新 IAM 角色。请参阅以下代码:
    aws iam create-role --role-name <role name> --assume-role-policy-document file://trust.json --output=text

    输出将包含您的角色 ARN。

  3. 将 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/
  4. 授予该新角色对 Amazon SageMaker 的访问权限,并附加 AmazonSageMakerFullAccess。请参阅以下代码:
    aws iam attach-role-policy --role-name <role name> --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess

在 Kubernetes集群上设置operator

要在 Kubernetes 集群上设置operator,请完成以下步骤:

  1. 如果使用 Fargate(推荐),请使用以下 bash 代码为operator配置名称空间:
    eksctl create fargateprofile --cluster ${CLUSTER_NAME} --namespace sagemaker-k8s-operator-system
  2. 下载 YAML 配置文件(该文件使用自定义资源定义和operator控制器服务配置 Kubernetes 集群),以从 GitHub 存储库安装 Amazon SageMaker Operators for Kubernetes。请参阅以下代码:
    wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/release/rolebased/installer.yaml
  3. installer.yaml 文件中,使用上一步中基于 OIDC 的角色的 ARN 更新 eks.amazonaws.com/role-arn
  4. 在您的 Kubernetes 集群上,安装 Amazon SageMaker CRD 并设置operator。请参阅以下代码:
    kubectl apply -f installer.yaml
  5. 确认您的 Kubernetes 集群中的 Amazon SageMaker operator可用。请参阅以下代码:
    $ kubectl get crd | grep sagemaker
    batchtransformjobs.sagemaker.aws.amazon.com         2020-01-01T12:34:56Z
    endpointconfigs.sagemaker.aws.amazon.com            2020-01-01T12:34:56Z
    hostingdeployments.sagemaker.aws.amazon.com         2020-01-01T12:34:56Z
    hyperparametertuningjobs.sagemaker.aws.amazon.com   2020-01-01T12:34:56Z
    models.sagemaker.aws.amazon.com                     2020-01-01T12:34:56Z
    trainingjobs.sagemaker.aws.amazon.com               2020-01-01T12:34:56Z

借助这些operators,Amazon SageMaker 中的所有托管和安全的大规模 ML 基础设施和优化的软件,现在都可以作为 Kubernetes 集群中的自定义资源供您使用。

如需使用 kubectl 在命令行中查看来自 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

# 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

生成训练数据

安装operator后,您可以开始训练。本文中使用 SageMaker 预构建的容器基于 MNIST 数据集训练 XGBoost 模型。本文在 SageMaker Operators for Kubernetes GitHub 存储库中提供了一个脚本,该脚本以 XGBoost 预构建容器所需的格式将 MNIST 数据集上传到 S3 存储桶。

要生成训练数据,请完成以下步骤:

  1. 创建 S3 存储桶。本文使用 us-east-1 区域。
  2. 下载并运行 upload_xgboost_mnist_dataset。请参阅以下代码:
    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
    

    确保将 BUCKET_NAME 替换为您创建的 S3 存储桶的名称。此脚本要求您安装 Python3、boto3、numpy 和 argparse。

  3. 验证数据已成功上传。命令输出应如下所示:
    ./upload_xgboost_mnist_dataset --s3-bucket BUCKET_NAME --s3-prefix xgboost-mnist
    Downloading dataset from http://deeplearning.net/data/mnist/mnist.pkl.gz
    train: (50000, 784) (50000,)
    Uploading 981250000 bytes to s3://BUCKET_NAME/xgboost-mnist/train/examples
    validation: (10000, 784) (10000,)
    Uploading 196250000 bytes to s3://BUCKET_NAME/xgboost-mnist/validation/examples
    test: (10000, 784) (10000,)
    Uploading 196000000 bytes to s3://BUCKET_NAME/xgboost-mnist/test/examples

    现在,数据已上传到您的 S3 存储桶。

创建适用于 SageMaker 的 IAM 角色

SageMaker 在训练时承担着执行角色(execution role)。这个角色会向 SageMaker 授予权限,以便 SageMaker 可以从 S3 进行读取和写入、管理 EC2 实例等。该角色应不同于附加到 OIDC 提供方的角色。如果您没有 SageMaker 执行角色(execution role),请使用以下 bash 命令创建一个:

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

这些命令会创建 SageMaker 可以承担的 IAM 角色,并授予该角色对 SageMaker 通常需要的资源(例如 S3 和 EC2)的访问权限。准备训练任务时,请保存创建的角色 ARN。

准备训练任务

创建 train.yaml YAML 配置文件以开始训练。将 TrainingJob 指定为 在Amazon SageMaker 上的模型训练(Amazon SageMaker 现在是您 Kubernetes 集群中的自定义资源)。

将以下占位符替换为对应的值:

  • BUCKET_NAME 替换为您创建的 S3 存储桶名称
  • SAGEMAKER_EXECUTION_ROLE_ARN 替换为上一步中创建的执行角色的 ARN

请参阅以下代码:

apiVersion: sagemaker.aws.amazon.com/v1
kind: TrainingJob
metadata:
  name: xgboost-mnist
spec:
  roleArn: SAGEMAKER_EXECUTION_ROLE_ARN  
  region: us-east-1
  algorithmSpecification:
    trainingImage: 811284229777.dkr.ecr.us-east-1.amazonaws.com/xgboost:latest
    trainingInputMode: File
  outputDataConfig:
    s3OutputPath: s3://BUCKET_NAME/xgboost-mnist/models/
  inputDataConfig:
    - channelName: train
      dataSource:
        s3DataSource:
          s3DataType: S3Prefix
          s3Uri: s3://BUCKET_NAME/xgboost-mnist/train/
          s3DataDistributionType: FullyReplicated
      contentType: text/csv
      compressionType: None
    - channelName: validation
      dataSource:
        s3DataSource:
          s3DataType: S3Prefix
          s3Uri: s3://BUCKET_NAME/xgboost-mnist/validation/
          s3DataDistributionType: FullyReplicated
      contentType: text/csv
      compressionType: None
  resourceConfig:
    instanceCount: 1
    instanceType: ml.m4.xlarge
    volumeSizeInGB: 5
  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

S3 数据和 ECR 存储库的区域位置应相同。如果您的数据位于 us-east-1 以外的区域中,请通过查找替代图像 URI 来更新训练图像的位置。有关更多信息,请参阅内置算法的常见参数

训练模型

现在,您可以通过输入以下代码来开始训练任务:

$ kubectl apply -f train.yaml
trainingjob.sagemaker.aws.amazon.com/xgboost-mnist created

operator使用您在 train.yaml 中提供的规范,在 Amazon SageMaker 中创建训练任务。您可以用使用在 Kubernetes 中常用的方式与该训练任务进行交互。请参阅以下代码:

$ kubectl describe trainingjob xgboost-mnist
$ kubectl get trainingjob xgboost-mnist

训练任务开始后,状态显示为 InProgress,您可以使用 smlogs 插件读取该任务的 Amazon CloudWatch logs。请参阅以下代码:

$ kubectl smlogs trainingjob xgboost-mnist
xgboost-mnist-f52d88dd423411eaa1270a350733ba06/algo-1-1580260714 2020-01-28 17:19:43.244 -0800 PST [2020-01-29:01:19:40:INFO] Running standalone xgboost training.

或者,您可以在 SageMaker 控制台中查看任务进度和信息。

训练任务完成后,您在 Amazon SageMaker 中为此训练任务启动的所有计算实例都将终止。

有关其他示例,请参阅 GitHub 存储库

小结

在本文撰写之时,Amazon SageMaker Operators for Kubernetes 已在以下 AWS 区域中正式推出:美国东部(俄亥俄)、美国东部(弗吉尼亚北部)、美国西部(俄勒冈)和欧洲(爱尔兰)。有关更多信息和分步教程,请参阅 Amazon SageMaker Operators for Kubernetes

和往常一样,欢迎您分享您的经验和反馈,或者提交其他示例 YAML 规范或operator改进信息。如果您想告诉我们您使用 Amazon SageMaker Operators for Kubernetes 的相关情况,可以在 AWS 论坛中的 Amazon SageMaker 板块下发布帖子,在 GitHub 存储库中创建问题,或发送给您的常用 AWS 联系人并由其代为转达。

本篇作者

Cade Daniel

Cade Daniel 是 AWS Deep Learning 部门的软件开发工程师。他开发的产品能够帮助客户更轻松更高效地训练和提供 DL/ML 模型。工作之余,他喜欢练习西班牙语和钻研新的爱好。

Nicholas Thomson

Nicholas Thomson 是 AWS Deep Learning 部门的软件开发工程师。他参与构建了用于为 Amazon AI 提供技术支持的开源深度学习基础设施项目。业余时间,他喜欢打台球或构建概念证明网站。

Aditya Bindal

Aditya Bindal 是 AWS Deep Learning 部门的高级产品经理。他负责开发帮助客户更轻松地使用深度学习引擎的产品。业余时间,他喜欢打网球、阅读历史小说和旅行。

Alex Chung

Alex Chung 是 AWS Deep Learning 部门的高级产品经理。他负责推广 AWS Deep Learning 产品,并使产品更贴合大众需求。他对社会影响力和科技很感兴趣,会定期参加体育锻炼,并喜爱健康烹饪。