Categories
程式開發

AWS將Amazon SageMaker Opeartors正式引入Kubernetes,開發者可輕鬆訓練模型


美國時間2019年12月2日,AWS在 AWS re:Invent 大會現場宣布將Amazon SageMaker Opeartors正式引入Kubernetes,這項新功能將幫助使用Kubernetes的開發人員與數據科學家輕鬆在Amazon SageMaker當中訓練、調整以及部署機器學習模型。

客戶現在可以在Kubernetes集群上安裝這些Amazon SageMaker Operators,並通過Kubernetes API以及命令行Kubernetes工具(例如「kubectl」)以本地方式創建Amazon SageMaker任務。

目前,眾多AWS客戶都在使用Amazon Elastic Kubernetes服務(EKS)等託管服務,旨在藉助開源通用容器編排系統Kubernetes實現容器化應用程序的部署與管理。例如,數據科學家與開發人員可以藉此建立起可複用機器學習流水線,同時更好地控制自己的訓練與推理工作負載。但是,為了支持各類常見的機器學習工作負載,客戶們仍然需要編寫自定義代碼以優化底層ML基礎設施,確保高可用性與可靠性,從而獲取各類數據科學生產力工具並遵循相關安全性與法規要求。例如,當Kubernetes客戶利用GPU進行訓練與推理時,往往需要變更Kubernetes調度以及GPU工作負載擴展的具體方式,從而盡可能提高資源利用率、吞吐量以及可用性。同樣的,為了將訓練完成的模型部署至生產環境當中,Kubernetes客戶也需要投入不少時間對跨越多個可用區的自動伸縮集群進行設置以及優化。

Amazon SageMaker Opeartors for Kubernetes成功填補了這一空白。現在,客戶已經不再需要面對Amazon SageMaker與Kubernetes工作流程間的繁瑣整合工作。從今天開始,使用Kubernetes的客戶可以輕鬆調用Amazon SageMaker,利用這項模塊化全託管服務快速構建、構建以及部署大規模機器學習(ML)模型。在Amazon SageMaker工作流的幫助下,用戶將可實現計算資源的預配置與優化、僅在請求時進行配置、根據實際需要加以擴展,並在作業完成時自動關閉,從而提供近100%資源利用率。而在最新Amazon SageMaker Operator for Kubernets的幫助下,客戶既能夠繼續享受Kubernetes與EKS的可移植性與標準化優勢,又能夠將眾多現有優勢與Amazon SageMaker集成起來,且整個過程無需任何自定義代碼。

Amazon SageMaker與Kubernetes

機器學習不僅僅是模型。機器學習工作流當中包含數據的攝取與準備、機器學習模型構建、模型訓練與評估,以及模型的生產場景部署乃至持續性生產監控。 Amazon SageMaker是一項模塊化全託管服務,可幫助數據科學家以及開發人員更快完成模型的構建、訓練、部署以及維護等任務。

但模型構建相關工作流本身不可能孤立存在,其往往是更大規模流水線的一部分,而後者則跨越多種用於支持整體應用程序的工程團隊與服務項目。 Kubernetes用戶(包括Amazon EKS客戶)通過編寫配置文件進行工作負載部署,Kubernetes則負責將該工作負載與用戶Kuberenetes集群內的可用計算資源進行匹配。雖然具有良好的控制性與可移植性,但在Kubernetes集群之上運行機器學習工作負載同樣會帶來一系列獨特的挑戰。例如,基礎設施需要額外管理,例如針對利用率、成本以及性能做出優化;遵循適當的安全與合規性要求;同時確保實現可高用性與可靠性等等。這一切都屬於重複且相當繁瑣的日常工作,往往會在發布ML應用程序的過程中耗費大量寶貴的時間與資源。 Kubernetes客戶希望單純控制編排與流水線,而不必分心於集群內的ML基礎設施與服務管理工作。

Amazon SageMaker Operators for Kubernetes將Amazon SageMaker與Kubernetes整合起來,希望切實滿足這方面需求。立足Kubernetes,數據科學家與開發人員將可以使用完全為ML工作流設計及優化的全託管服務。與此同時,基礎設施與平台團隊則可對Kubernetes內的工作負載進行編排,從而在保證可控制性與可移植性的同時,擺脫ML基礎設施與服務管理帶來的沉重負擔。在向Kubernetes當中添加新功能的過程中,開發人員可以創建特定於應用程序或者域的邏輯與組件自定義資源,從而輕鬆完成對Kubernetes API的擴展。 Kubernetes中的Operator允許用戶以本地方式調用這些自定義資源,同時自動執行相關工作流程。在Kubernetes集群之上安裝Amazon SageMaker Opeartors for Kubernetes之後,大家即可立足集群將Amazon SageMaker添加為“自定義資源”,而後直接使用以下Amazon SageMaker Operators:

  • 訓練 – 在Amazon SageMaker當中訓練ML模型,包括Managed Spot Training,從而節約達90%的訓練成本;同時採取分佈式訓練方法,同時利用多個GPU節點以縮短訓練週期。您只需要在作業執行過程內根據實際使用資源付費,從而獲得接近100%的資源利用率。
  • 調優 – 對Amazon SageMaker中的模型超參數進行調優,包括配合Amazon EC2競價實例以實現高達90%的成本節約。 Amazon SageMaker Automatic Model Tuning能夠自動為模型搜索更準確的超參數範圍,實現高效超參數優化,最終大大縮短模型調優的執行週期。
  • 推理 – 在Amazon SageMaker中,將經過訓練的模型部署至全託管自動擴展集群當中,同時跨越多個可用區以實現高性能、高可用性實時或批量預測。

每一個Amazon SageMaker Operator for Kubernetes都將為用戶提供本地化的作業創建與交互體驗,包括調用Kubernetes API以及使用Kubernetes命令行工具(kubectl等)兩種具體方式。工程團隊可以利用這些operators在Kubernetes當中為數據科學家構建起自動化、工具完備且定制化的界面,同時徹底擺脫ML基礎設施的構建、維護與優化等惱人環節。熟悉Kubernetes的數據科學家與開發人員亦可本地編寫代碼,並與Amazon SageMaker的訓練、調優以及推理作業進行交互,整個過程與本地Kubernetes作業執行毫無區別。來自Amazon SageMaker作業的日誌流將傳輸回Kubernetes,允許用戶通過本地命令行查看模型訓練、調優以及推理任務的當前狀態。

聯手TensorFlow

美國國家標準與技術研究院(MNIST)正在利用Amazon SageMaker Training Operators for Kubernetes訓練一套簡單的捲積神經網絡模型。 MNIST採用的數據集包含從0到9的手寫數字圖像,這是一種相當流行的ML問題。 MNIST數據集共包含6萬張訓練圖像與1萬張測試圖像。

整個實驗包含以下幾個步驟:

  • 在Kubernetes集群上安裝Amazon SageMaker Operators for Kubernetes
  • 創建一個用於訓練的YAML配置文件
  • 利用Amazon SageMaker Operator訓練模型

先決條件

在本示例中,我們需要使用EKS中的現成Kubernetes集群。關於如何在Amazon EKS當中創建新的集群,請參閱Amazon EKS入門指南。大家還需要在負責控制該Kubernetes集群的設備(例如個人筆記本或者EC2實例)上完成以下操作:

  • 安裝kubectl(1.13版本或者更高)。請確保您選擇的kubectl主版本號與Kubernetes集群控制平面相統一。例如,1.13版本的kubetcl可配合Kubernetes 1.13與1.14集群。關於更多細節信息,請參閱如何安裝kubectl
  • AWS CLI(1.16.232版本或者更高)。關於更多細節信息,請參閱如何安裝AWS CLI版本1
  • AWS IAM Authenticator for Kubernetes。關於更多細節信息,請參閱 如何安裝aws-iam-authenticator
  • 為operator分配現有IAM訪問密鑰,或者利用IAM權限允許其創建用戶、為用戶添加政策或者創建訪問密鑰。

設置IAM角色與權限

在將operator部署至Kubernetes集群之前,請關聯IAM角色與OpenID Connect(OIDC)提供程序以進行身份驗證。具體參見以下代碼:

# 设置区域与集群
export CLUSTER_NAME=""
export AWS_REGION=""
eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} 
      --region ${AWS_REGION} --approve

您的輸出結果應該如下所示:

    [_]  eksctl version 0.10.1
    [_]  using region us-east-1
    [_]  IAM OpenID Connect provider is associated with cluster "my-cluster" in "us-east-1"

現在,EKS中的Kubernetes集群已經擁有OIDC身份提供程序,您可以創建角色並為其授權權限。使用以下命令以獲取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}

利用上條命令返回的OIDC ID進行角色創建。使用以下代碼創建一個名為“trust.json”的新文件。請記得利用OIDC ID、AWS賬戶以及EKS集群區域替換其中的對應部分。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam:::oidc-provider/oidc.eks..amazonaws.com/id/"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks..amazonaws.com/id/:aud": "sts.amazonaws.com",
              "oidc.eks..amazonaws.com/id/:sub": "system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default"
            }
          }
        }
      ]
    }

現在,創建一個新的IAM角色:

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

輸出結果將返回“ROLE 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/

最後,允許新角色訪問Amazon SageMaker並為其添加AmazonSageMakerFullAccess 政策。

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

在Kuberentes集群上設置operator

GitHub repo處下載YAML配置文件,即可安裝可供使用的Amazon SageMaker operator。

wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-for-k8s/master/release/rolebased/installer.yaml

在installer.yaml文件中,使用此前步驟中基於OIDC角色中的ARN更新eks.amazonaws.com/role-arn。

現在,在您的Kubernetes集群上安裝Amazon SageMaker CRD並設置您要使用的operators。

kubectl -f apply installer.yaml

驗證您Kubernetes集群中的Amazon SageMaker Operators是否可用。詳見以下代碼:

$ kubectl get crd | grep sagemaker
batchtransformjobs.sagemaker.aws.amazon.com         2019-11-20T17:12:34Z
endpointconfigs.sagemaker.aws.amazon.com            2019-11-20T17:12:34Z
hostingdeployments.sagemaker.aws.amazon.com         2019-11-20T17:12:34Z
hyperparametertuningjobs.sagemaker.aws.amazon.com   2019-11-20T17:12:34Z
models.sagemaker.aws.amazon.com                     2019-11-20T17:12:34Z
trainingjobs.sagemaker.aws.amazon.com               2019-11-20T17:12:34Z

利用這些oepartors,全部Amazon SageMaker安全託管ML基礎設施與軟件優化方案都將以定制化資源的形式供您的Kubernetes集群使用。

要通過命令行使用kubetcl查看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
# 将二进制代码移动至您的homedir目录中。
mkdir ~/sagemaker-k8s-bin
cp ./kubectl-smlogs.${os}.amd64/kubectl-smlogs ~/sagemaker-k8s-bin/.
# 这一行将二进制代码添加至您的.bashrc路径内。
echo 'export PATH=$PATH:~/sagemaker-k8s-bin' >> ~/.bashrc
# 指定.bashrc源以更新环境变量:
source ~/.bashrc

準備訓練任務

在為Amazon SageMaker訓練任務創建YAML配置文件之前,我們需要首先創建一套容器,用於容納您的Python訓練代碼(可通過tensorflow_distributed_mnist GitHub repo下載)。另外,大家也可以使用 AWS Deep Learning Containers提供的TensorFlow GPU鏡像創建Dockerfile。詳見以下代碼:

# 使用AWS深度学习容器镜像
FROM 763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-training:1.13-gpu-py3
## 添加训练脚本
COPY train.py /opt/ml/code/train.py 
ENV SAGEMAKER_PROGRAM train.py
ENV SM_MODEL_DIR=/opt/ml/model

在本示例中,我們將MNIST訓練數據集上傳至S3存儲桶。接下來,創建train.yaml YAML配置文件即可開始訓練。另外,請將TrainingJob指定為Amazon SageMaker模型訓練的自定義資源,以供Kubernetes集群隨時調用。

apiVersion: sagemaker.aws.amazon.com/v1
kind: TrainingJob
metadata:
  name: tf-mnist
spec:
    algorithmSpecification:
        trainingImage: 578276202366.dkr.ecr.us-west-2.amazonaws.com/mnist-demo:latest
        trainingInputMode: File
    roleArn: {YOUR ROLE:ARN}
    region: us-west-2
    outputDataConfig:
        s3OutputPath: s3://{YOUR OUTPUT PATH}
    resourceConfig:
        instanceCount: 1
        instanceType: ml.p2.8xlarge
        volumeSizeInGB: 30
    stoppingCondition:
        maxRuntimeInSeconds: 86400
    inputDataConfig:
        - channelName: train
          dataSource:
            s3DataSource:
                s3DataType: S3Prefix
                s3Uri: s3://sagemaker-us-west-2-578276202366/data/DEMO-mnist
                s3DataDistributionType: FullyReplicated
          contentType: text/csv
          compressionType: None

模型訓練

現在,我們可以使用以下命令開始模型訓練了:

$ kubectl apply -f training.yaml
trainingjob.sagemaker.aws.amazon.com/tf-mnist created

Amazon SageMaker Operator會利用您在train.yaml文件中指定的規範在Amazon SageMaker中創建一項訓練任務。大家可以與該訓練任務交互,具體方法與常規Kubernetes使用完全相同。詳見以下代碼:

$ kubectl describe trainingjob tf-mnist
$ kubectl get trainingjob tf-mnist
$ kubectl smlogs trainingjob tf-mnist
tf-mnist-fa964bf80e4b11ea89d40e3ef2d156bc/algo-1-1574553166 1574553266153 2019-11-23 23:54:25,480 sagemaker-containers INFO     Reporting training SUCCESS

在訓練任務結束之後,我們在Amazon SageMaker中用於訓練工作的所有計算實例都將立即中止。

關於更多相關示例,請參閱 GitHub repo

全新Amazon SageMaker功能上線

Amazon SageMaker Operators for Kubernetes目前已經在美國東區(俄亥俄州)、美國東區(北弗吉尼亞州)、美國西區(俄勒岡州)以及歐盟區(愛爾蘭)等AWS區域正式上線。關於更多細節信息及操作指南,請參閱我們的用戶指南

我們也歡迎大家分享您的體驗與反饋,或者提交更多YAML規範示例或者operator改進建議。您可以聯繫Amazon SageMaker分論壇、GitHub repo或者AWS客戶代表提供意見,幫助我們進一步完善Amazon SageMaker Operators for Kubernetes。

原文鏈接:

https://aws.amazon.com/cn/blogs/machine-learning/introducing-amazon-sagemaker-operators-for-kubernetes/