10

image

创建一个可靠、高效的机器学习推理服务需要做很多的投入。到底多麻烦?以一个基于 XGBoost 模型的服务来说:

  • 开发人员需要创建一个完善的应用程序,例如通过 Flask 来加载模型,然后运行终端节点。
  • 为了创建这个应用程序,开发人员需要考虑队列管理、无故障部署以及重新加载新训练的模型等事宜。
  • 应用开发好后被打包成容器镜像,然后推送到镜像仓库。Kubernetes 从镜像仓库拉取该镜像在集群上进行部署,部署好后才可以对外提供服务。
  • 这些步骤需要数据科学家从事与提高模型准确性无关的任务,或引进DevOps工程师来做这些工作。
  • 这些过程加到开发计划中,必然会需要更多的时间进行服务迭代。

亚马逊云科技 (Amazon Web Services)最近发布了适用于 Kubernetes 的 Amazon SageMaker Operator,借此,我们可以用 SageMaker 托管的终端节点增强现有 Kubernetes 集群。借助 SageMaker Operator,开发人员只需要编写 yaml 文件来指定所保存模型的 S3 存储位置,而实时预测通过安全的终端节点即可使用。重新配置终端节点与更新yaml文件一样简单。

除了使用简单外,该服务还具有以下特征:

  • 多模型终端节点 – 托管几十个或更多模型可能会给配置带来困难,并且会导致很多机器以低利用率运行。多模型终端节点通过动态加载用于服务的模型构件来设置一个实例;
  • 弹性推理 – 在拆分开的 GPU 上运行较小的工作负载,可以以较低的成本部署该 GPU;
  • 高利用率和动态 Auto Scaling – 终端节点可以以100%的利用率运行,并基于我们定义的自定义指标(如每秒钟的调用数量)来添加副本。或者可以按预定义的客户端性能指标配置自动扩展;
  • 可用区转移 – 如果发生中断,Amazon SageMaker 会将终端节点自动移动到 VPC 内的另一个可用区;
  • A/B 测试– 设置多个模型,并导向与单个终端节点上设置的量成比例的流量;
  • 安全性 – 终端节点使用HTTPS创建,可配置为在私有 VPC(没有互联网出口)中运行并通过 Amazon PrivateLink 访问;
  • 合规性准备 – Amazon SageMaker 已经过认证,符合 HIPAA、PCI DSS 和 SOC (1, 2, 3)规则和法规。

亚马逊云科技为 Kubernetes 开发的 SageMaker Operator 将以上这些特性打包到一起。SageMaker Operator 大大缩短模型到应用的时间,并减少创建和维护生产环境的人力。这可以使单独使用 EKS 或 EC2 的总拥有成本下降90%。

本文演示如何设置适用于 Kubernetes 的 Amazon SageMaker Operator,以完全从 kubectl 为预先训练的 XGBoost 模型创建和更新终端节点。该解决方案包含以下步骤:

  • 创建 IAM Amazon SageMaker 角色,提供服务模型所需的 Amazon SageMaker 权限
  • 准备 YAML 文件,以将模型部署到 Amazon SageMaker
  • 将模型部署到 Amazon SageMaker
  • 查询终端节点以获取预测
  • 对部署的模型执行最终的一致性更新

先决条件

本文假设符合以下先决条件:

  • 一个 Kubernetes 集群
  • 集群上已安装 Amazon SageMaker Operator
  • 一个可以部署的 XGBoost 模型

有关将 Operator 安装到 Amazon EKS 集群上的信息,请参阅现已推出适用于 Kubernetes 的 Amazon SageMaker Operator。我们可以自带 XGBoost 模型,但本教程使用前面所述文中的现有模型。

创建一个 Amazon SageMaker 执行角色

Amazon SageMaker 需要一个 IAM 角色,它可以承担该角色来服务您的模型。如果还没有该角色,请使用下面的 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 \
    "$assume_role_policy_document"
aws iam attach-role-policy --role-name <execution role name> \
    --policy-arn \
    arn:aws:iam::aws:policy/AmazonSageMakerFullAccess

将 <execution role name> 替换为适用的角色名称。这将创建一个 IAM 角色,Amazon SageMaker 可以使用该角色来服务我们的模型。

准备托管部署

Operator 提供名为 HostingDeployment 的自定义资源定义(CRD)。我们可以使用 HostingDeployment 在 Amazon SageMaker 托管上配置模型部署。

要准备托管部署,请使用以下内容创建名为 hosting.yaml 的文件:

apiVersion: sagemaker.aws.amazon.com/v1
kind: HostingDeployment
metadata:
  name: hosting-deployment
spec:
  region: us-east-2
  productionVariants:
    - variantName: AllTraffic
      modelName: xgboost-model
      initialInstanceCount: 1
      instanceType: ml.r5.large
      initialVariantWeight: 1
  models:
    - name: xgboost-model
      executionRoleArn: SAGEMAKER_EXECUTION_ROLE_ARN
      containers:
        - containerHostname: xgboost
          modelDataUrl: s3://BUCKET_NAME/model.tar.gz
          image: 825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest

将 SAGEMAKER_EXECUTION_ROLE_ARN 替换为在上一步中创建的执行角色的 ARN。将 BUCKET_NAME 替换为包含模型的存储桶。
确保存储桶区域 HostingDeployment 区域和映像 ECR 区域一致。

将模型部署到 Amazon SageMaker

随后可以通过运行 kubectl apply -f hosting.yaml 来启动部署。请参阅以下代码:

$ kubectl apply -f hosting.yaml
hostingdeployment.sagemaker.aws.amazon.com/hosting-deployment created

我们可以使用 kubectl get hostingdeployments 跟踪部署状态。请参阅以下代码:

$ kubectl get hostingdeployments
NAME                 STATUS     SAGEMAKER-ENDPOINT-NAME
hosting-deployment   Creating   hosting-deployment-38ecac47487611eaa81606fc3390e6ba

模型终端节点最多可能需要十五分钟才能部署好。我们可以使用以下命令查看状态。终端节点达到 InService 状态后便可以立即用于查询。

$ kubectl get hostingdeployments
NAME                 STATUS      SAGEMAKER-ENDPOINT-NAME
hosting-deployment   InService   hosting-deployment-38ecac47487611eaa81606fc3390e6ba

查询终端节点

终端节点投入使用后,可以测试它是否能与以下示例代码结合使用:

$ aws sagemaker-runtime invoke-endpoint \
  --region us-east-2 \
  --endpoint-name SAGEMAKER-ENDPOINT-NAME \
  --body $(seq 784 | xargs echo | sed 's/ /,/g') \
  >(cat) \
  --content-type text/csv > /dev/null

bash 命令使用 Amazon CLI 与 HTTPS 终端节点连接。我们创建的模型基于 MNIST 位数据集,预测工具会读取图像中的数字。当进行此调用时,它会以 CSV 格式发送包含784项特征的推理负载,这些特征代表图像中的像素。我们将在负载中看到模型所认为的预测数字。请参阅以下代码:

$ aws sagemaker-runtime invoke-endpoint \
  --region us-east-2 \
  --endpoint-name hosting-deployment-38ecac47487611eaa81606fc3390e6ba \
  --body $(seq 784 | xargs echo | sed 's/ /,/g') \
  >(cat) \
  --content-type text/csv > /dev/null
8.0

此代码确认终端节点已启动并在运行。

最终一致的更新

部署好模型后,我们可以对 Kubernetes YAML 进行更改,SageMaker Operator 将更新终端节点。这些更新将以最终一致的方式传播到 Amazon SageMaker。这样一来,我们便可以以声明式的方式配置终端节点,并让 SageMaker Operator 处理细节。

为证明这一点,我们可以将模型的实例类型从 ml.r5.large 更改为 ml.c5.2xlarge。请执行以下步骤:

  1. 将 hosting.yaml 中的实例类型修改为 ml.c5.2xlarge。请参阅以下代码:
apiVersion: sagemaker.aws.amazon.com/v1
kind: HostingDeployment
metadata:
  name: hosting-deployment
spec:
  region: us-east-2
  productionVariants:
    - variantName: AllTraffic
      modelName: xgboost-model
      initialInstanceCount: 1
      instanceType: ml.c5.2xlarge
      initialVariantWeight: 1
  models:
    - name: xgboost-model
      executionRoleArn: SAGEMAKER_EXECUTION_ROLE_ARN
      containers:
        - containerHostname: xgboost
          modelDataUrl: s3://BUCKET_NAME/model.tar.gz
          image: 825641698319.dkr.ecr.us-east-2.amazonaws.com/xgboost:latest
  1. 将更改应用至 Kubernetes 集群。请参阅以下代码:
$ kubectl apply -f hosting.yaml
hostingdeployment.sagemaker.aws.amazon.com/hosting-deployment configured
  1. 获取托管部署的状态。该状态将显示为正在更新,然后在准备好以后更改为 InService。请参阅以下代码:
$ kubectl get hostingdeployments
NAME                 STATUS     SAGEMAKER-ENDPOINT-NAME
hosting-deployment   Updating   hosting-deployment-38ecac47487611eaa81606fc3390e6ba

终端节点在整个更新过程中保持实时状态且完全可用。有关更多信息和其他示例,请参阅 GitHub 存储库

清理

要删除终端节点而不会产生更多使用费用,请运行 kubectl delete -f hosting.yaml。请参阅以下代码:

$ kubectl delete -f hosting.yaml
hostingdeployment.sagemaker.aws.amazon.com "hosting-deployment" deleted

结论

本文演示了适用于 Kubernetes 的 Amazon SageMaker Operator 如何支持实时推理。它还支持训练和超参数调整。

希望大家能分享自己的经验和反馈,或者提交其他示例 YAML 规范或 Operator 改进信息。大家可以分享使用适用于 Kubernetes 的 Amazon SageMaker Operator 的相关情况,在亚马逊云科技论坛中的 Amazon SageMaker 的板块下发布帖子,在 GitHub 存储库中创建问题,或发送给 Amazon Support 联系人并由其代为转达。

image


亚马逊云开发者
2.9k 声望9.6k 粉丝

亚马逊云开发者社区是面向开发者交流与互动的平台。在这里,你可以分享和获取有关云计算、人工智能、IoT、区块链等相关技术和前沿知识,也可以与同行或爱好者们交流探讨,共同成长。