您可以將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集群。
在容器服務管理控制臺上創建ACK Serverless集群。具體操作,請參見創建ACK Serverless集群。
重要如果您需要通過公網拉取鏡像,或者訓練任務需要訪問公網,請配置公網NAT網關。
您可以通過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后,您可以在對應的路徑下查看結果數據。
在彈性容器實例控制臺,您可以看到Pod對應的ECI實例。
運行成功表示實例中的容器已經運行終止,此時系統會回收底層計算資源,不再對Pod進行計費。
相關文檔
本實踐教程使用了鏡像緩存功能來加速鏡像拉取,并且使用了NAS文件系統作為持久化存儲。如果想要了解更多相關信息,請參見: