機器學習不只僅關乎模型。ML工做流包括數據尋源和準備數據、構建ML模型、訓練和評估模型、將模型部署到生產環境以及生產後持續監控。Amazon SageMaker可幫助用戶更快地構建、訓練、部署和維護模型。
可是,與構建模型相關的工做一般是規模更大的工做流的一部分,此工做流跨越了多個支持全局應用程序的工程團隊和服務。Kubernetes用戶(包括EKS客戶)經過編寫配置文件來部署工做負載,Kubernetes將這些配置文件與Kubernetes集羣中的可用計算資源相匹配。雖然Kubernetes爲用戶提供了控制權和可移植性,但在Kubernetes集羣上運行ML工做負載卻會帶來獨特挑戰。例如,底層基礎設施須要額外的管理:針對利用率、成本和性能進行優化、符合適用的安全和法規要求,以及確保高可用性和可靠性等等。這些無差異的繁重工做佔用了寶貴的時間和資源,延緩了將新的ML應用投入市場的速度。node
如何控制編排和工做流,同時又免於管理集羣中的底層ML基礎設施及服務?linux
Amazon SageMaker Operator能夠幫助數據科學家以及開發人員利用Kubernetes接口來建立和管理SageMaker任務,如機器學習的模型訓練、超參優化、批量轉換以及實時推理等。
如圖所示,SageMaker Operator可讓開發與運維人員經過Kubectl命令行或者Kubernetes API接口調用的方式來管理和使用SageMaker服務,它就像翻譯器同樣,在Kubernetes平臺與AWS SageMaker服務之間搭建了一座橋樑,讓那些已經很很熟悉Kubernetes的開發、運維人員在無需投入過多精力的狀況下,便可快速地使用SageMaker服務。git
SageMaker Operator可讓那些已經很瞭解Kubernetes平臺的開發人員以很是熟悉和友好的方式來使用SageMaker服務,它很是適用於如下一些場景。github
一、 項目團隊已經很是熟悉Kubernetes平臺的接口和標準,因爲項目需求,但願引進機器學習部分。因爲人員數量有限,團隊不但願再去單獨維護一套機器學習平臺,而是在充分利用已有的能力的基礎上,適當引進第三方的工具和服務,快速地進行業務創新,下降學習和使用的成本,大幅度提高效率。
二、 項目團隊已在Kubernetes平臺的基礎上很好的實現了DevOps,不少業務模塊都已經作到了持續集成與持續發佈。機器學習部分只是整個業務系統中的一個模塊,團隊但願可以能將機器學習模塊與其它業務模塊統一進行工程化的管理,最終實現業務流程的全自動化。算法
與其它第三方應用的Kubernetes Operator實現機制同樣,SageMaker Operator由Kubernetes CRD和Controller兩部分組成。如圖所示,在安裝好SageMaker Operator以後,SageMaker Operator會向Kubernetes平臺新註冊一些與SageMaker服務相關CRD,同時以Pod的方式在Kubernetes Worker Node上運行SageMaker Operator Controller。當開發人員須要建立機器學習的任務時,首先須要在yaml文件中定義與CRD資源相關的關鍵配置參數,而後經過kubectl提交命令建立CRD資源,在CRD資源資源成功建立後,SageMaker Controller能夠從Kubernetes API Server監聽到與該CRD相關的信息,以後解析參數並調用SageMaker服務,完成機器學習任務的建立。json
Operator是Kubernetes中一個重要概念,它可讓開發人員在Kubernetes的基礎上進行高級的抽象和封裝,從而能夠更加容易地安裝和管理複雜的應用。除了SageMaker Operator,不少公司和開源機構都會按照Kubernetes的標準把封裝本身的Operator。Kubernetes Operator概念相對抽象,技術實現細節也比較複雜,若想對它更深刻的瞭解,咱們首先須要理解Kubernetes資源建立的機制和流程,同時也須要理解Kubernetes CRD和Controller等一些重要的概念,本文不會就Kubernetes Operator的技術細節作過多的展開,關於更多有關Kubernetes Operator的介紹,請參考如下連接:api
下文咱們將演示一個具體的例子,從而更好地說明如何如何利用AWS SageMaker Operator來實現機器學習任務的建立和管理。在該方案中,咱們會用到如下服務:安全
搭建EKS集羣,配置IAM權限,安裝SageMaker Operator。bash
EKS是AWS的Kubernetes託管集羣,咱們能夠經過圖形界面或者命令行的方式實現集羣的建立。在本實驗中,咱們在ap-southeast-1區域部署Kubernetes集羣,該集羣會包含一個Worker Node Group,該Node Group內有三個c5.xlarge的計算實例。在默認狀況下,節點會採用高可用的方式均勻地部署在該區域的多個可用區內,若是有定製化需求,咱們也能夠經過指定命令行參數或者編寫配置文件來指定可用區。
1.1 運行命令,建立集羣。app
eksctl create cluster --region <region-name> --name=<cluster-name> --nodes-min=3 --nodes-max=5 --node-type=c5.xlarge --ssh-access —ssh-public-key <ssh-keyname>
1.2 運行命令,查看Kubernetes節點的工做狀態。
kubectl get node
OpenID Connect Provider能夠將Kubernetes內的Service Account與AWS IAM的角色進行關聯。在上文中咱們提到過,SageMaker Operator Controller會以Pod的方式運行在EKS節點上,該Pod在監聽到資源的建立信息後會調用SageMaker服務,而成功調用SageMaker的前提是該Pod要具有相應的權限。咱們知道Kubernetes內Pod的權限分配通常是要經過Service Account傳入的,因此OpenID Connect Provider的做用即是將集羣外的IAM角色與集羣內的Service Account進行關聯。
2.1 運行命令獲取OIDC ID。
請將${CLUSTERNAME}替換成實際的EKS集羣名稱,將${AWSREGION}替換成實際的Region。
aws eks describe-cluster --name ${CLUSTER_NAME} --region ${AWS_REGION} \ --query cluster.identity.oidc.issuer --output text
命令運行成功或會返回以下相似的結果:
https://oidc.eks.${AWS_REGION}.amazonaws.com/id/D48675832CA65BD10A532F597OIDCID
2.2 建立名爲trust.json的文件。
文件模板以下所示。請將<OIDC ID>替換成爲上一步獲取的ID,將<AWS account number>替換成當前帳號的ID,將<EKS Cluster region>替換成EKS的名稱。
{ "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 ID>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:aud": "sts.amazonaws.com", "oidc.eks.<EKS Cluster region>.amazonaws.com/id/<OIDC ID>:sub": "system:serviceaccount:sagemaker-k8s-operator-system:sagemaker-k8s-operator-default" } } } ] }
使用上一步建立成功的trust.json文件,並運行下面命令建立IAM角色,將<role name>替換成本身須要的名稱。
aws iam create-role --role-name <role name> --assume-role-policy-document file://trust.json --output=text
命令運行成功後會返回如圖所示的結果:
2.3 運行下列命令,將SageMaker FullAccess的權限賦予上一步所建立的角色。
aws iam attach-role-policy --role-name <role name> --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess
在完成角色的建立和權限的配置後,請記錄角色的ARN,在後面建立SageMaker Operator時,咱們須要爲SageMaker Operator配置該角色,從而確保SageMaker Operator Controller具有操做SageMaker的權限。
SageMaker Operator的安裝方式很靈活,咱們能夠直接經過yaml文件進行部署或者經過Helm的方式進行安裝部署,本次實驗中咱們經過yaml的方式進行部署。在上文提到過,SageMaker Operator由CRD和Controller兩部分組成,其中Controller會以Pod的形式運行在EKS Worker Node上。
3.1 運行命令下載用於安裝SageMaker Operator的yaml文件。
wget https://raw.githubusercontent.com/aws/amazon-sagemaker-operator-**for**-k8s/master/release/rolebased/installer.yaml
3.2 下載完yaml文件後,進入文件內。
找到eks.amazonaws.com/role-arn參數項,將該參數對應的值更新爲2.3步所建立角色的ARN。
3.3 運行下列命令安裝SageMaker Operator
kubectl apply -f installer.yaml
上文曾提到,SageMaker Operator由CRD與Controller兩部分組成,當SageMaker Operator安裝成功後,SageMaker Operator會向Kubernetes集羣內註冊新的CRD,同時以Pod的形式在Kubernetes Worker Node上運行SageMaker Operator Controller。
3.4 運行下列命令查看新建立的CRD。
kubectl get crd | grep sagemaker
3.5 運行下列命令查看新建立的SageMaker Operator Controller。
kubectl -n sagemaker-k8s-operator-system get pods
SageMaker日誌插件是SageMaker Operator中的一個可選項,SageMaker的任務在運行過程當中會將日誌推送至CloudWatch的日誌組中,而SageMaker Operator日誌插件則可實時地將CloudWatch日誌收集到Kubernetes集羣上,從而讓開發人員經過kubectl命令查看SageMaker任務的日誌。SageMaker Operator日誌插件的安裝是可選項,若安裝則能夠方便用戶對日誌進行管理,不安裝也不會影響到任務自身的建立。
4.1 運行命令,安裝SageMaker日誌插件
export os="linux" wget https://amazon-sagemaker-operator-for-k8s-us-east-1.s3.amazonaws.com/kubectl-smlogs-plugin/v1/${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
4.2 運行下列命令驗證插件是否安裝成功。
kubectl smlogs
接下來,咱們將建立一個SageMaker機器學習模型訓練的任務,這裏咱們以SageMaker內置算法xgboost爲例,對MINIST數據集進行模型的訓練和部署。
5.1 運行命令,生成數據集並將數據集上傳至S3存儲桶。
請將<BUCKET_NAME>替換成本身的S3存儲桶名稱。
`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`
查看S3存儲桶,能夠發現訓練、測試和驗證數據集都已成功上傳至S3存儲桶上。
5.2 運行命令建立SageMaker角色。
在建立SageMaker任務前,須要爲SageMaker建立好角色,從而確保SageMaker能夠順利運行相關的任務。
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
5.3 準備機器學習訓練任務yaml文件。
在該文件中,須要配置與SageMaker訓練任務相關的重要參數。關於機器學習訓練任務yaml文件的模板請參考以下,請將變量部分替換成實際的參數,關鍵參數解釋請參考模板中的備註信息。
apiVersion: sagemaker.aws.amazon.com/v1 kind: TrainingJob // CRD類型 metadata: name: xgboost-mnist spec: roleArn: <Your SageMaker Role> // 上一步建立的SageMaker role region: <Your-Region> // EKS集羣所在的region algorithmSpecification: trainingImage: <Docker Image> // SageMaker XGboost鏡像的存放位置,請參考SageMaker官方文檔查看具體的鏡像位置。 trainingInputMode: File outputDataConfig: s3OutputPath: <s3://your-bucket/test> // 測試數據集存放位置 inputDataConfig: - channelName: train dataSource: s3DataSource: s3DataType: S3Prefix s3Uri: <s3://your-bucket/train> // 訓練數據集存放位置 s3DataDistributionType: FullyReplicated contentType: text/csv compressionType: None - channelName: validation dataSource: s3DataSource: s3DataType: S3Prefix s3Uri: <<s3://your-bucket/validate> //驗證數據集存放位置 s3DataDistributionType: FullyReplicated contentType: text/csv compressionType: None resourceConfig: instanceCount: 1 // SageMaker實例數量 instanceType: ml.m4.xlarge //SageMaker實例類型 volumeSizeInGB: 5 // SageMaker 根卷大小 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
5.4 運行命令,建立SageMaker訓練任務。
`kubectl apply -f train.yaml`
5.5 運行命令,查看SageMaker訓練任務狀態。
`$ kubectl describe trainingjob xgboost-mnist $ kubectl get trainingjob xgboost-mnist`
5.6 進入AWS控制檯,查看AWS SageMaker訓練任務狀態。
5.7 任務訓練結束後,模型會被自動存放至S3。
進入S3控制檯,能夠查看到模型以及成功上傳。
模型訓練結束後,咱們將建立模型部署任務,SageMaker Operator會自動調用SageMaker服務完成模型的部署。
6.1 建立模型部署yaml文件。
在該文件中,咱們須要配置與SageMaker模型部署任務相關的重要參數。關於模型部署任務的yaml文件的模板請參考以下,請將變量部分替換成實際的參數,關鍵參數解釋請參考模板中的備註信息。
apiVersion: sagemaker.aws.amazon.com/v1 kind: HostingDeployment //CRD類型 metadata: name: hosting-deployment spec: region: <Your-Region> // EKS集羣所在區域 productionVariants: - variantName: AllTraffic modelName: xgboost-model initialInstanceCount: 1 // 部署實例類型數量 instanceType: ml.r5.large //部署實例類型 initialVariantWeight: 1 models: - name: xgboost-model executionRoleArn: <Your SageMaker Role> // 上一步建立的SageMaker role containers: - containerHostname: xgboost modelDataUrl: <S3://Your-Bucket/Model> //模型存放地址 image: <Docker-Image> // SageMaker XGboost Docker Image地址,請參考SageMaker官方文檔查看鏡像具體存放位置。
6.2 運行命令查看模型部署任務狀態
kubectl get hostingdeployments
6.3 進入AWS控制檯,查看SageMaker模型部署任務。
在上面實驗中,咱們舉了模型訓練和部署的例子,除了這兩種任務,SageMaker Operator還支持參數優化、批量轉換以及模型部署配置等其它任務,咱們能夠根據項目中的實際需求靈活選擇相對應的任務。
利用SageMaker Operator,項目團隊可使用所熟悉的Kubernetes命令以及接口管理複雜機器學習任務與流程,無需在已有的基礎設施和平臺上作出改動即可以快速地啓動與機器學習相關的項目,從而極大程度地提高效率、下降成本。
在真實項目中,機器學習部分每每只是整個業務系統的一個模塊,所以在設計方案時也須要系統性的考慮,除了機器學習流程自己,還須要考慮CI/CD、監控運維、安全控制、服務集成等多方面的因素。AWS能夠作到服務之間的高度集成,在實際生產中,咱們徹底能夠在上面實驗案例的基礎上進一步擴展,集成新的服務,從而構建一個端到端的解決方案。