建立一个可靠、高效的机器学习推理服务须要作不少的投入。到底多麻烦?以一个基于 XGBoost 模型的服务来讲:html
AWS 最近发布了适用于 Kubernetes 的 Amazon SageMaker Operator,借此,咱们能够用 SageMaker 托管的终端节点加强现有 Kubernetes 集群。借助 SageMaker Operator,开发人员只须要编写 yaml 文件来指定所保存模型的 S3 存储位置,而实时预测经过安全的终端节点便可使用。从新配置终端节点与更新yaml文件同样简单。git
除了使用简单外,该服务还具备如下特征:github
AWS 为 Kubernetes 开发的 SageMaker Operator 将以上这些特性打包到一块儿。SageMaker Operator 大大缩短模型到应用的时间,并减小建立和维护生产环境的人力。这可使单独使用 EKS 或 EC2 的总拥有成本降低90%。api
本文演示如何设置适用于 Kubernetes 的 Amazon SageMaker Operator,以彻底从 kubectl 为预先训练的 XGBoost 模型建立和更新终端节点。该解决方案包含如下步骤:安全
本文假设符合如下先决条件:bash
有关将 Operator 安装到 Amazon EKS 集群上的信息,请参阅现已推出适用于 Kubernetes 的 Amazon SageMaker Operator。咱们能够自带 XGBoost 模型,但本教程使用前面所述文中的现有模型。app
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 区域一致。
随后能够经过运行 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 命令使用 AWS 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。请执行如下步骤:
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
$ kubectl apply -f hosting.yaml hostingdeployment.sagemaker.aws.amazon.com/hosting-deployment configured
$ 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 的相关状况,在AWS论坛中的 Amazon SageMaker 的板块下发布帖子,在 GitHub 存储库中建立问题,或发送给 AWS Support 联系人并由其代为转达。