使用ECI运行TensorFlow任务

您可以将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集群

    容器服务管理控制台上创建ACK Serverless集群。具体操作,请参见创建ACK Serverless集群

    重要

    如果您需要通过公网拉取镜像,或者训练任务需要访问公网,请配置公网NAT网关。

    您可以通过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

  • 弹性容器实例控制台,您可以看到Pod对应的ECI实例。

    运行成功表示实例中的容器已经运行终止,此时系统会回收底层计算资源,不再对Pod进行计费。

    ECI-tensor3.png

相关文档

本实践教程使用了镜像缓存功能来加速镜像拉取,并且使用了NAS文件系统作为持久化存储。如果想要了解更多相关信息,请参见: