全部產品
Search
文件中心

Elastic Container Instance:使用ECI運行TensorFlow任務

更新時間:Jul 06, 2024

您可以將AI訓練任務所需的軟體環境容器化,然後在ECI上執行訓練任務,在解決環境搭建複雜問題的同時,可以只為已耗用時間付費,從而降低成本,提升效率。本文以一個Github上基於GPU的TensorFlow訓練任務為例,介紹如何基於ACK Serverless叢集,使用ECI來運行訓練任務。

背景資訊

近些年來,人工智慧與機器學習已經被廣泛應用到各個領域,各種各樣的訓練模型被提出,更多的訓練任務運行到雲上。然而上雲之後,想要輕鬆、持久地運行訓練任務,仍有一些痛點,例如:

  • 環境搭建麻煩:需要購買GPU執行個體並安裝GPU驅動,即使已經把訓練任務容器化,仍需要安裝GPU Runtime Hook 。

  • 使用缺乏彈性:運行完任務後,為了節約成本一般需要釋放資源,但在下次啟動任務時需要重新建立執行個體並配置環境;或者在計算節點資源不足的情況下,需要手動擴容並重新建立執行個體並配置環境。

針對上述痛點,推薦您使用ACK Serverless叢集+ECI的方案來運行訓練任務。該方案具備以下優勢:

  • 按需付費,免營運。

  • 一次配置,無限次複用。

  • 鏡像緩衝功能加速執行個體建立,訓練任務啟動快速。

  • 資料與訓練模型解耦,資料可以持久化儲存。

準備工作

  1. 準備訓練資料和容器鏡像。

    • 訓練資料:本文以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

  2. 建立ACK Serverless叢集

    Container Service管理主控台上建立ACK Serverless叢集。具體操作,請參見建立ACK Serverless叢集

    重要

    如果您需要通過公網拉取鏡像,或者訓練任務需要訪問公網,請配置公網NAT Gateway。

    您可以通過kubectl管理和訪問ACK Serverless叢集,相關操作如下:

  3. 建立NAS檔案系統,並添加掛載點。

    NAS檔案系統控制台上建立檔案系統,並添加掛載點。NAS檔案系統需和ACK Serverless叢集處於同一VPC。具體操作,請參見管理檔案系統管理掛載點

操作步驟

建立鏡像緩衝

鏡像緩衝功能已經通過Kubernetes CRD的方式整合到ACK Serverless叢集中,可以用於加速鏡像拉取。

  1. 建立鏡像緩衝的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
  2. 建立鏡像緩衝。

    kubectl create -f imagecache.yaml

    建立鏡像緩衝時需要拉取鏡像,受鏡像大小和網路的影響,需要一定的時間。您可以通過以下命令查詢鏡像緩衝的建立進度。

    kubectl get imagecache tensorflow

    返回類似如下結果時,表示鏡像緩衝已經建立成功。

    ECI-tensor.png

建立訓練任務

  1. 建立NAS檔案系統對應的PV和PVC。

    1. 準備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
    2. 建立PV和PVC。

      kubectl create -f nas.yaml
  2. 建立ECI Pod來運行訓練任務。

    1. 準備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
    2. 建立Pod。

      kubectl create -f tensorflow.yaml
  3. 查看訓練任務的執行情況。

    kubectl get pod

    當Pod狀態為Completed時,表示訓練任務已經執行完成。

    ECI-tensor1.png

    說明

    您也可以通過kubectl describe pod <pod name>查看Pod詳情,或者通過kubectl logs <pod name>命令查看日誌。

查看結果

您可以在控制台上查看訓練任務的運行結果。

  • NAS檔案系統控制台,您可以看到訓練結果已經儲存到NAS中(訓練完成的結果資料已佔用儲存容量)。重新掛載NAS後,您可以在對應的路徑下查看結果資料。

    ECI-tensor2.png

  • Elastic Container Instance控制台,您可以看到Pod對應的ECI執行個體。

    運行成功表示執行個體中的容器已經運行終止,此時系統會回收底層計算資源,不再對Pod進行計費。

    ECI-tensor3.png

相關文檔

本實踐教程使用了鏡像緩衝功能來加速鏡像拉取,並且使用了NAS檔案系統作為持久化儲存。如果想要瞭解更多相關資訊,請參見: