您可以将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文件系统作为持久化存储。如果想要了解更多相关信息,请参见: