久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Elastic Training Operator該怎么用

220次閱讀
沒有評論

共計 6580 個字符,預計需要花費 17 分鐘才能閱讀完成。

今天就跟大家聊聊有關 Elastic Training Operator 該怎么用,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

背景

由于云計算在資源成本和彈性擴容方面的天然優勢,越來越多客戶愿意在云上構建 AI 系統,而以容器、Kubernetes 為代表的云原生技術,已經成為釋放云價值的最短路徑,在云上基于 Kubernetes 構建 AI 平臺已經成為趨勢。

當面臨較復雜的模型訓練或者數據量大時,單機的計算能力往往無法滿足算力要求。通過使用阿里的 AiACC 或者社區的 horovod 等分布式訓練框架,僅需修改幾行代碼,就能將一個單機的訓練任務擴展為支持分布式的訓練任務。在 Kubernetes 上常見的是 kubeflow 社區的 tf-operator 支持 Tensorflow PS 模式,或者 mpi-operator 支持 horovod 的 mpi allreduce 模式。

現狀

Kubernetes 和云計算提供敏捷性和伸縮性,我們可以通過 cluster-AutoScaler 等組件為訓練任務設置彈性策略,利用 Kubernetes 的彈性能力,按需創建,減少 GPU 設備空轉。

但這種伸縮模式面對訓練這種離線任務還是略有不足:

不支持容錯,當部分 Worker 由于設備原因失敗,整個任務需要停止重來。

訓練任務一般時間較長,占用算力大,任務缺少彈性能力。當資源不足時,除非任務終止,無法按需為其他業務騰出資源。

訓練任務時間較長,不支持 worker 動態配置,無法安全地使用搶占實例,發揮云上最大性價比

如何給訓練任務賦予彈性能力,是提高性價比的關鍵路徑。近期 horovod 等分布式框架逐漸支持了 Elastic Training,即彈性訓練能力。也就是允許一個訓練任務在執行的過程中動態的擴容或者縮容訓練 worker,從不會引起訓練任務的中斷。需要在代碼中做少量修改適配,可參考:https://horovod.readthedocs.io/en/stable/elastic_include.html。

對 Elastic training 的實現原理感興趣可以看這篇 Elastic Horovod 設計文檔,本文不詳細介紹。

在 mpi-operator 中,參與訓練的 Worker 都是作為靜態資源設計和維護,支持彈性訓練模式后,給任務增加了靈活性,同時也給運維層帶來了挑戰,例如:

必須通過 horovod 提供的 horovordrun 作為入口,horovod 中 launcher 通過 ssh 登陸 worker,需要打通 launcher 和 worker 之間的登陸隧道。

負責計算彈性的 Elastic Driver 模塊通過指定 discover_host 腳本獲取最新 worker 拓撲信息,從而拉起或停止 worker 實例。當 worker 變化時,首先要更新 discover_host 腳本的返回值。

在搶占或價格計算等場景中,有時需要指定 worker 縮容,K8s 原生的編排元語 deployment,statefulset 無法滿足指定縮容的場景。

解決方法

針對以上問題,我們設計開發了 et-operator,提供 TrainingJob CRD 描述訓練任務, ScaleOut 和 ScaleIn CRD 描述擴容和縮容操作,通過它們的組合,使我們的訓練任務更具有彈性。將這個方案開源,歡迎大家提需求、交流、吐槽。

開源方案地址:https://github.com/AliyunContainerService/et-operator

設計

TrainingJob Controller 主要有以下功能:

維護 TrainingJob 的創建 / 刪除生命周期,以及子資源管理。

執行擴縮容操作。

容錯,當 worker 被驅逐,創建新的 worker 加入到訓練中。

1. 資源創建

TrainingJob 子資源創建順序如下:

創建打通 ssh 所需的密鑰對,創建 secret。

創建 workers,包含 service 和 pod,掛載 secret 公鑰。

創建 configmap,包含 discover_host 腳本 , hostfile 文件。

創建 launcher,掛載 configmap。由于 hostfile 后續會隨著拓撲關系修改,所以 hostfile 單獨通過 initcontainer 從 configmap 拷貝到單獨目錄。

TrainingJob 相關資源:

TrainingJob CR 的配置分為 Lanucher 和 Worker。在 Launcher 中指定任務的鏡像和啟動執行,默認 et-operator 會根據 worker 分配情況,生成一個 hostfile 文件和 discover_host 腳本,discover_host 腳本掛載到 Launcher 的 /etc/edl/discover_hosts.sh 文件,在入口腳本的 horovodrun 執行中通過 –host-discovery-script 參數指定。在 Worker 設置中指定 worker 的鏡像和 GPU 占用,并可以通過 maxReplicas / minReplicas 指定 workers 的副本數允許范圍。

apiVersion: kai.alibabacloud.com/v1alpha1
kind: TrainingJob
metadata:
 name: elastic-training
 namespace: default
spec:
 cleanPodPolicy: Running
 etReplicaSpecs:
 launcher:
 replicas: 1
 template:
 spec:
 containers:
 - command:
 - sh
 - -c
 - horovodrun -np 2 --min-np 1 --max-np 9 --host-discovery-script
 /etc/edl/discover_hosts.sh python /examples/elastic/tensorflow2_mnist_elastic.py
 image: registry.cn-huhehaote.aliyuncs.com/lumo/horovod:master-tf2.1.0-torch2.4.0-mxnet-py3.6-gpu
 imagePullPolicy: Always
 name: mnist-elastic
 worker:
 maxReplicas: 9
 minReplicas: 1
 replicas: 2
 template:
 spec:
 containers:
 - image: registry.cn-huhehaote.aliyuncs.com/lumo/horovod:master-tf2.1.0-torch2.4.0-mxnet-py3.6-gpu
 imagePullPolicy: Always
 name: mnist-elastic
 resources:
 limits:
 nvidia.com/gpu:  1 
 requests:
 nvidia.com/gpu:  1 
status:
 currentWorkers:
 - elastic-training-worker-0
 - elastic-training-worker-1
 - elastic-training-worker-2
 - elastic-training-worker-3
 phase: Succeeded
 replicaStatuses:
 Launcher:
 active: 1
 succeeded: 1
 Worker:
 active: 4

2. Worker 擴容 / 縮容

除了 TrainingJob 外,et-operator 同時支持 ScaleOut 和 ScaleIn 兩種 CRD,下發訓練任務擴容和縮容操作。

當下發一個 ScaleOut CR,ScaleOutController 觸發 Reconcile,這里工作很簡單,根據 ScaleOut CR 中的 Selector 字段,找到 Scaler 對應的 TrainingJob,設置到 CR 的 OwnerReferences 上。

以一個 ScaleOut 操作舉例:

- apiVersion: kai.alibabacloud.com/v1alpha1
 kind: ScaleOut
 metadata:
 creationTimestamp:  2020-11-04T13:54:26Z
 name: scaleout-ptfnk
 namespace: default
 ownerReferences:
 - apiVersion: kai.alibabacloud.com/v1alpha1
 blockOwnerDeletion: true
 controller: true
 kind: TrainingJob
 name: elastic-training //  指向擴容對象 TrainingJob
 uid: 075b9c4a-22f9-40ce-83c7-656b329a2b9e
 spec:
 selector:
 name: elastic-training
 toAdd:
 count: 2

TrainingJobController 中監聽到屬于 TrainingJob 的 ScaleOut CR 有更新,觸發 TrainingJob 的 Reconcile,遍歷過濾 TrainingJob 下 OwnerReference 指向的 ScaleIn 和 ScaleOut,根據創建時間和狀態時間決定執行的擴容或者縮容。

apiVersion: kai.alibabacloud.com/v1alpha1
kind: TrainingJob
metadata:
 name: elastic-training
 namespace: default
spec: 
 // ...... Launcher and Worker spec
status:
 currentScaler: ScaleIn:default/scaleout-ptfnk
 phase: Scaling
 currentWorkers:
 - elastic-training-worker-0
 - elastic-training-worker-1

ScaleOut 任務 CR:

ScaleIn 任務 CR:

詳細工作過程:

運行

1. 安裝 ET-Operator

mkdir -p $(go env GOPATH)/src/github.com/aliyunContainerService
cd $(go env GOPATH)/src/github.com/aliyunContainerService
git clone https://http://github.com/aliyunContainerService/et-operator
cd et-operator
kubectl create -f deploy/all_in_one.yaml

檢測 crd 的安裝:

# kubectl get crd
NAME CREATED AT
scaleins.kai.alibabacloud.com 2020-11-11T11:16:13Z
scaleouts.kai.alibabacloud.com 2020-11-11T11:16:13Z
trainingjobs.kai.alibabacloud.com 2020-11-11T11:16:13Z

檢測 controller 的運行狀態,默認安裝在 kube-ai 中:

# kubectl -n kube-ai get po
NAME READY STATUS RESTARTS AGE
et-operator-controller-manager-7877968489-c5kv4 0/2 ContainerCreating 0 5s

2. 運行 TrainingJob

運行事先已準備好的示例:

kubectl apply -f examples/training_job.yaml

檢測運行狀態:

# kubectl get trainingjob
NAME PHASE AGE
elastic-training Running 77s
# kubectl get po
NAME READY STATUS RESTARTS AGE
elastic-training-launcher 1/1 Running 0 7s
elastic-training-worker-0 1/1 Running 0 10s
elastic-training-worker-1 1/1 Running 0 9s

3. 縮容訓練任務 Worker

執行縮容時,可以通過 ScaleIn CR 中的 spec.toDelete.count 或 spec.toDelete.podNames 字段指定縮容的 worker。

通過 count 配置縮容的數量,則通過 index 計算由高到低縮容 Worker。

apiVersion: kai.alibabacloud.com/v1alpha1
kind: ScaleIn
metadata:
 name: scalein-workers
spec:
 selector:
 name: elastic-training
 toDelete:
 count: 1

如果想要縮容特定的 Worker,可以配置 podNames:

apiVersion: kai.alibabacloud.com/v1alpha1
kind: ScaleIn
metadata:
 name: scalein-workers
spec:
 selector:
 name: elastic-training
 toDelete:
 podNames:
 - elastic-training-worker-1

運行一個縮容示例,指定數量縮容 1 個 worker:

kubectl create -f examples/scale_in_count.yaml

檢測縮容執行狀態和訓練任務:

# kubectl get scalein
NAME PHASE AGE
scalein-sample-t8jxd ScaleSucceeded 11s
# kubectl get po
NAME READY STATUS RESTARTS AGE
elastic-training-launcher 1/1 Running 0 47s
elastic-training-worker-0 1/1 Running 0 50s

4. 擴容訓練任務

在 ScaleOut CR 中,通過 spec.toAdd.count 字段指定擴容的 worker 數:

apiVersion: kai.alibabacloud.com/v1alpha1
 kind: ScaleOut
 metadata:
 name: elastic-training-scaleout-9dtmw
 namespace: default
 spec:
 selector:
 name: elastic-training
 timeout: 300
 toAdd:
 count: 2

運行示例:

kubectl create -f examples/scale_out.yaml

檢測縮容執行狀態和訓練任務:

kubectl get scaleout
NAME PHASE AGE
elastic-training-scaleout-9dtmw ScaleSucceeded 30s
kubectl get po
NAME READY STATUS RESTARTS AGE
elastic-training-launcher 1/1 Running 0 2m5s
elastic-training-worker-0 1/1 Running 0 2m8s
elastic-training-worker-1 1/1 Running 0 40s
elastic-training-worker-2 1/1 Running 0 40s

看完上述內容,你們對 Elastic Training Operator 該怎么用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業資訊頻道,感謝大家的支持。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計6580字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 荥经县| 科技| 甘谷县| 渝北区| 盐山县| 阿荣旗| 卢龙县| 金阳县| 丰城市| 扶风县| 措美县| 增城市| 综艺| 大悟县| 蒲城县| 讷河市| 万载县| 竹溪县| 麦盖提县| 菏泽市| 黄平县| 区。| 永吉县| 鸡东县| 梁山县| 分宜县| 钟山县| 通许县| 林甸县| 大城县| 卢龙县| 基隆市| 习水县| 蓬安县| 上蔡县| 辉南县| 嘉鱼县| 龙井市| 横山县| 上杭县| 镇坪县|