您可以將AI訓練任務所需的軟體環境容器化,然後在ECI上執行訓練任務,在解決環境搭建複雜問題的同時,可以只為已耗用時間付費,從而降低成本,提升效率。本文以一個Github上基於GPU的TensorFlow訓練任務為例,介紹如何基於ACK Serverless叢集,使用ECI來運行訓練任務。
背景資訊
近些年來,人工智慧與機器學習已經被廣泛應用到各個領域,各種各樣的訓練模型被提出,更多的訓練任務運行到雲上。然而上雲之後,想要輕鬆、持久地運行訓練任務,仍有一些痛點,例如:
環境搭建麻煩:需要購買GPU執行個體並安裝GPU驅動,即使已經把訓練任務容器化,仍需要安裝GPU Runtime Hook 。
使用缺乏彈性:運行完任務後,為了節約成本一般需要釋放資源,但在下次啟動任務時需要重新建立執行個體並配置環境;或者在計算節點資源不足的情況下,需要手動擴容並重新建立執行個體並配置環境。
針對上述痛點,推薦您使用ACK Serverless叢集+ECI的方案來運行訓練任務。該方案具備以下優勢:
按需付費,免營運。
一次配置,無限次複用。
鏡像緩衝功能加速執行個體建立,訓練任務啟動快速。
資料與訓練模型解耦,資料可以持久化儲存。
準備工作
準備訓練資料和容器鏡像。
訓練資料:本文以Github的一個TensorFlow訓練任務為例。更多資訊,請參見TensorFlow訓練任務。
容器鏡像:ECI已準備好適用的樣本鏡像,樣本鏡像已上傳到阿里雲容器鏡像倉庫ACR中,您可以直接使用或進行二次開發。
鏡像私網地址:registry-vpc.cn-hangzhou.aliyuncs.com/eci_open/tensorflow:1.0
鏡像公網地址:registry.cn-hangzhou.aliyuncs.com/eci_open/tensorflow:1.0
建立ACK Serverless叢集。
在Container Service管理主控台上建立ACK Serverless叢集。具體操作,請參見建立ACK Serverless叢集。
重要如果您需要通過公網拉取鏡像,或者訓練任務需要訪問公網,請配置公網NAT Gateway。
您可以通過kubectl管理和訪問ACK Serverless叢集,相關操作如下:
如果您需要通過本機電腦管理叢集,請安裝並配置kubectl用戶端。具體操作,請參見通過kubectl串連Kubernetes叢集。
您也可以在CloudShell上通過kubect管理叢集。具體操作,請參見在CloudShell上通過kubectl管理Kubernetes叢集。
建立NAS檔案系統,並添加掛載點。
在NAS檔案系統控制台上建立檔案系統,並添加掛載點。NAS檔案系統需和ACK Serverless叢集處於同一VPC。具體操作,請參見管理檔案系統和管理掛載點。
操作步驟
建立鏡像緩衝
鏡像緩衝功能已經通過Kubernetes CRD的方式整合到ACK Serverless叢集中,可以用於加速鏡像拉取。
建立鏡像緩衝的YAML檔案。
樣本imagecache.yaml的內容如下:
說明如果您的叢集屬於華東1(杭州)地區,建議通過鏡像私網地址拉取鏡像,如果您的叢集屬於其他地區,可參考樣本通過鏡像公網地址拉取鏡像,
apiVersion: eci.alibabacloud.com/v1 kind: ImageCache metadata: name: tensorflow spec: images: - registry.cn-hangzhou.aliyuncs.com/eci_open/tensorflow:1.0
建立鏡像緩衝。
kubectl create -f imagecache.yaml
建立鏡像緩衝時需要拉取鏡像,受鏡像大小和網路的影響,需要一定的時間。您可以通過以下命令查詢鏡像緩衝的建立進度。
kubectl get imagecache tensorflow
返回類似如下結果時,表示鏡像緩衝已經建立成功。
建立訓練任務
建立NAS檔案系統對應的PV和PVC。
準備YAML檔案。
樣本nas.yaml的內容如下:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 100Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas volumeAttributes: server: 15e1d4****-gt***.cn-beijing.nas.aliyuncs.com # NAS檔案系統掛載點 path: / mountOptions: - nolock,tcp,noresvport - vers=3 --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi selector: matchLabels: alicloud-pvname: pv-nas
建立PV和PVC。
kubectl create -f nas.yaml
建立ECI Pod來運行訓練任務。
準備YAML檔案。
樣本tensorflow.yaml的內容如下:
apiVersion: v1 kind: Pod metadata: name: tensorflow labels: app: tensorflow alibabacloud.com/eci: "true" annotations: k8s.aliyun.com/eci-use-specs: "ecs.gn6i-c4g1.xlarge" # 指定GPU規格 k8s.aliyun.com/eci-auto-imc: "true" # 開啟自動匹配鏡像緩衝 spec: restartPolicy: OnFailure containers: - name: tensorflow image: registry.cn-hangzhou.aliyuncs.com/eci_open/tensorflow:1.0 # 使用鏡像緩衝對應的鏡像地址 command: - python args: - /home/classify_image/classify_image.py # 容器啟動後執行訓練指令碼 resources: limits: nvidia.com/gpu: "1" # 容器所需的GPU個數 volumeMounts: # 掛載NAS,將訓練結果持久化儲存 - name: pvc-nas mountPath: /tmp/classify_image_model volumes: - name: pvc-nas persistentVolumeClaim: claimName: pvc-nas
建立Pod。
kubectl create -f tensorflow.yaml
查看訓練任務的執行情況。
kubectl get pod
當Pod狀態為Completed時,表示訓練任務已經執行完成。
說明您也可以通過
kubectl describe pod <pod name>
查看Pod詳情,或者通過kubectl logs <pod name>
命令查看日誌。
查看結果
您可以在控制台上查看訓練任務的運行結果。
在NAS檔案系統控制台,您可以看到訓練結果已經儲存到NAS中(訓練完成的結果資料已佔用儲存容量)。重新掛載NAS後,您可以在對應的路徑下查看結果資料。
在Elastic Container Instance控制台,您可以看到Pod對應的ECI執行個體。
運行成功表示執行個體中的容器已經運行終止,此時系統會回收底層計算資源,不再對Pod進行計費。
相關文檔
本實踐教程使用了鏡像緩衝功能來加速鏡像拉取,並且使用了NAS檔案系統作為持久化儲存。如果想要瞭解更多相關資訊,請參見: