建立一個可靠、高效的機器學習推理服務須要作不少的投入。到底多麻煩?以一個基於 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 聯繫人並由其代爲轉達。