阿里云Kubernetes 1.9上利用Helm运行TensorFlow 分布式模型训练

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: TensorFlow和Kubernetes分别作为深度学习和容器编排领域的领航者,二者的强强联合可以真正释放分布式训练的洪荒之力。而阿里云的Helm解决方案降低了部署的难度,降低了这把`屠龙刀`的使用难度。

阿里云Kubernetes 1.9上利用Helm运行TensorFlow 分布式模型训练

TensorFlow是业界最流行的深度学习框架, 但是如何将TensorFlow真正运用于生产环境却并不简单,它面临着资源隔离,应用调度和部署,GPU资源分配,训练生命周期管理等挑战。特别是大规模的分布式训练场景, 单靠手动部署和人力运维已经无法有效处理。特别启动每个模块都需要指定好分布式集群的clusterSpec, 更是让人挠头。

在Kubernetes集群上运行分布式TensorFlow模型训练,可以依靠Kubernetes本身在应用调度,GPU资源分配,共享存储等方面的能力,实现训练任务和参数服务器的调度以及生命周期的管理。同时利用共享存储查看训练的收敛程度,调整超参。

但是手动写部署Yaml对于最终用户来说还是非常酸爽的,阿里云容器服务提供了基于Helm的TensorFlow分布式训练解决方案:

  • 同时支持GPU和非GPU集群
  • 不再需要手动配置clusterspec信息,只需要指定worker和ps的数目,能自动生成clusterspec
  • 内置Tensorboard可以有效监控训练的收敛性,方便快速调整参数epoch,batchsize, learning rate

以下就是一个利用Helm运行端到端的分布式模型训练示例:

1. 准备数据

1.1 创建NAS文件存储,并且设置vpc内挂载点。可以参考阿里云NAS文档。并且查看挂载点,这里假设挂载点为aliyunxxxx.cn-shanghai.nas.aliyuncs.com

1.2 准备名字为/data的数据文件夹

mkdir /nfs
mount -t nfs -o vers=4.0 aliyunxxxx.cn-shanghai.nas.aliyuncs.com:/ /nfs
mkdir -p /nfs/data
umount /nfs

2. 创建persistent volume

以下为创建NAS的nas.yaml样例,实际上也可以创建云盘或者OSS等持久化存储

storage_1

---
apiVersion: v1
kind: PersistentVolume
metadata:
  labels:
    train: mnist
  name: pv-nas-train
spec:
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 5Gi
  flexVolume:
    driver: alicloud/nas
    options:
      mode: "755"
      path: /data
      server: aliyunxxxx.cn-shanghai.nas.aliyuncs.com
      vers: "4.0"

注意这里需要指定label为model: mnist, storageClassName需要为nas, 这两个标签对于pvc选择pv绑定非常重要。
另外和NAS相关的具体配置可以参考Kubernetes使用阿里云NAS

运行kubectl命令创建

kubectl create -f nas.yaml
persistentvolume "pv-nas" created

部署完成后,可以通过dashboard检查运行状态:

storage_2

3. 通过Helm部署TensorFlow分布式训练的应用

3.1 可以通过应用目录,点击acs-tensorflow-training

training_1

以下为支持GPU的自定义配置参数的training.yaml文件

---
# Default values for acs-dl-distributed-training.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
worker:
  number: 2
  gpuCount: 1
  image: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/tf-mnist-k8s:gpu
  imagePullPolicy: IfNotPresent
  # if you'd like to choose the cusomtized docker image, 
  #image: ""
  port: 8000

ps:
  number: 2
  image: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/tf-mnist-k8s:cpu
  imagePullPolicy: IfNotPresent
   # if you'd like to choose the cusomtized docker image, 
  #image: ""
  port: 9000

tensorboard:
  image: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/tensorboard:1.1.0
  serviceType: LoadBalancer

persistence: 
  mountPath: /data
  pvc: 
    matchLabels: 
      train: mnist
    storage: 5Gi

如果你运行的Kubernetes集群不含有GPU可以使用一下配置

---
worker:
  number: 2
  # if you'd like to choose the cusomtized docker image
  image: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/tf-mnist-k8s:cpu
  imagePullPolicy: IfNotPresent

ps:
  number: 2
  # if you'd like to choose the cusomtized docker image
  image: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/tf-mnist-k8s:cpu
  imagePullPolicy: IfNotPresent

tensorboard:
  image: registry.cn-hangzhou.aliyuncs.com/tensorflow-samples/tensorboard:1.1.0
  serviceType: LoadBalancer

hyperparams:
  epochs: 100
  batchsize: 20
  learningrate: 0.001

persistence:
  mountPath: /data
  pvc:
    matchLabels:
      train: mnist
    storage: 5Gi

这里镜像的参考代码来自于;https://github.com/cheyang/tensorflow-sample-code

3.2 点击参数, 就可以通过修改参数配置点击部署

training_2

也可运行helm命令部署

helm install --values values.yaml --name mnist incubator/acs-tensorflow-tarining
helm install --debug --dry-run --values values.yaml --name mnist incubator/acs-tensorflow-tarining

3.3 部署完成后,可以查看应用运行状态

training_3

4. 利用helm命令查看部署的信息

4.1 登录到Kubernetes的master上利用helm命令查看部署应用的列表

# helm list
NAME              REVISION  UPDATED                   STATUS    CHART                         NAMESPACE
mnist-dist-train  1         Mon Mar 19 15:23:51 2018  DEPLOYED  acs-tensorflow-training-0.1.0 default

4.2 利用helm status命令检查具体应用的配置

# helm status mnist-dist-train
LAST DEPLOYED: Mon Mar 19 15:23:51 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME             DATA  AGE
tf-cluster-spec  1     7m

==> v1/Service
NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
worker-0     ClusterIP  None           <none>        8000/TCP  7m
ps-1         ClusterIP  None           <none>        9000/TCP  7m
tensorboard  ClusterIP  172.19.13.242  106.1.1.1 80/TCP    7m
ps-0         ClusterIP  None           <none>        9000/TCP  7m
worker-1     ClusterIP  None           <none>        8000/TCP  7m

==> v1beta1/Deployment
NAME         DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
tensorboard  1        1        1           1          7m

==> v1/Job
NAME      DESIRED  SUCCESSFUL  AGE
ps-1      1        0           7m
worker-0  1        0           7m
ps-0      1        0           7m
worker-1  1        0           7m

==> v1/Pod(related)
NAME                          READY  STATUS   RESTARTS  AGE
tensorboard-5c785fbd97-7cwk2  1/1    Running  0         7m
ps-1-lkbtb                    1/1    Running  0         7m
worker-0-2mpmb                1/1    Running  0         7m
ps-0-ncxch                    1/1    Running  0         7m
worker-1-4hngw                1/1    Running  0         7m

这里可以看到Tensorboard的对外IP是106.1.1.1,可以在训练过程中查看cost的收敛程度

4.3 检查任务运行状况, 此时worker都是出于运行中的状态

# kubectl get job
NAME       DESIRED   SUCCESSFUL   AGE
ps-0       1         0            5m
ps-1       1         0            5m
worker-0   1         0            5m
worker-1   1         0            5m

# kubectl get po
NAME                          READY     STATUS    RESTARTS   AGE
ps-0-jndpd                    1/1       Running   0          6m
ps-1-b8zgz                    1/1       Running   0          6m
tensorboard-f78b4d57b-pm2nf   1/1       Running   0          6m
worker-0-rqmvl                1/1       Running   0          6m
worker-1-7pgx6                1/1       Running   0          6m

4.4 检查训练日志

# kubectl logs --tail=10 worker-0-rqmvl
Step: 124607,  Epoch: 24,  Batch: 1600 of 2750,  Cost: 0.8027,  AvgTime: 6.79ms
Step: 124800,  Epoch: 24,  Batch: 1700 of 2750,  Cost: 0.7805,  AvgTime: 6.10ms
Step: 124989,  Epoch: 24,  Batch: 1800 of 2750,  Cost: 1.4159,  AvgTime: 5.98ms
Step: 125184,  Epoch: 24,  Batch: 1900 of 2750,  Cost: 0.6790,  AvgTime: 6.33ms
Step: 125376,  Epoch: 24,  Batch: 2000 of 2750,  Cost: 1.3145,  AvgTime: 6.35ms
Step: 125565,  Epoch: 24,  Batch: 2100 of 2750,  Cost: 0.6310,  AvgTime: 6.13ms
Step: 125759,  Epoch: 24,  Batch: 2200 of 2750,  Cost: 1.1366,  AvgTime: 6.36ms
Step: 125948,  Epoch: 24,  Batch: 2300 of 2750,  Cost: 0.5678,  AvgTime: 6.02ms
Step: 126143,  Epoch: 24,  Batch: 2400 of 2750,  Cost: 0.6040,  AvgTime: 6.84ms
Step: 126310,  Epoch: 24,  Batch: 2500 of 2750,  Cost: 0.7697,  AvgTime: 6.01ms

4.5 可以通过watch job状态,可以监视到job已经完成

# kubectl get job
NAME       DESIRED   SUCCESSFUL   AGE
ps-0       1         0            1h
ps-1       1         0            1h
worker-0   1         1            1h
worker-1   1         1            1h

4.6 此时再查看训练日志,发现训练已经完成

# kubectl logs --tail=10 -f worker-0-rqmvl
Step: 519757,  Epoch: 100,  Batch: 2300 of 2750,  Cost: 0.1770,  AvgTime: 6.45ms
Step: 519950,  Epoch: 100,  Batch: 2400 of 2750,  Cost: 0.2142,  AvgTime: 6.33ms
Step: 520142,  Epoch: 100,  Batch: 2500 of 2750,  Cost: 0.1940,  AvgTime: 6.02ms
Step: 520333,  Epoch: 100,  Batch: 2600 of 2750,  Cost: 0.5144,  AvgTime: 6.21ms
Step: 520521,  Epoch: 100,  Batch: 2700 of 2750,  Cost: 0.5694,  AvgTime: 5.80ms
Step: 520616,  Epoch: 100,  Batch: 2750 of 2750,  Cost: 0.5333,  AvgTime: 2.94ms
Test-Accuracy: 0.89
Total Time: 1664.68s
Final Cost: 0.5333
done

5. 通过Tensorboad查看训练效果,前面已经获得了Tensorboard的外部ip 106.1.1.1, 直接登录链接 http://106.1.1.1/, 就可以观测到训练的效果

tensorboard

总结

TensorFlow和Kubernetes分别作为深度学习和容器编排领域的领航者,二者的强强联合可以真正释放分布式训练的洪荒之力。而阿里云的Helm解决方案降低了部署的难度,降低了这把屠龙刀的使用难度。欢迎大家尝试阿里云Kubernetes容器服务,利用分布式TensorFLow运行自己的模型训练。我们也会持续优化,增加日志和监控,GPU亲和性调度等能力。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1天前
|
供应链 安全 Cloud Native
阿里云飞天企业版获【可信云·容器平台安全能力】先进级认证
阿里云飞天企业版容器系列产品获中国信息通信研究院【可信云·容器平台安全能力】先进级认证,这是飞天企业版容器产品获得《等保四级PaaS平台》和《 云原生安全配置基线规范V2.0》之后,本年度再一次获得行业权威认可,证明飞天企业版的容器解决方案具备符合行业标准的最高等级容器安全能力。
阿里云飞天企业版获【可信云·容器平台安全能力】先进级认证
|
10天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
24天前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
24天前
|
弹性计算 调度 数据中心
阿里云 ACK One 注册集群云上弹性:扩展业务新利器
随着企业数字化转型深入,传统IDC数据中心因物理容量限制,难以实现动态扩容,缺乏弹性能力。阿里云ACK One注册集群凭借其高度灵活性和丰富资源选择,成为解决此问题的最佳方案。通过与阿里云资源的整合,ACK One不仅实现了计算资源的按需扩展,提高了资源利用率,还通过按需付费模式降低了成本,使企业能够更高效地应对业务增长和高峰需求。
|
24天前
|
运维 Kubernetes Serverless
阿里云Argo X K8s玩转工作流引擎,实现大规模并行计算
本文基于2024云栖大会田双坤的演讲,介绍了Kubernetes作为云原生操作系统的角色及其在各类任务中的应用,重点探讨了Argo Workflows在Kubernetes上编排并行任务的能力。面对自建Argo Workflows的挑战,如稳定性、成本和安全性等问题,阿里巴巴云推出了全托管的Serverless Argo工作流,提供全托管、免运维、可观测和易集成的特点,显著提升了任务编排的效率和稳定性。适用于数据处理、科学计算、自动驾驶仿真等多个领域。
|
24天前
|
Kubernetes 容灾 调度
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
|
24天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
20天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
217 55
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤
本文介绍了 TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤,包括数据准备、模型定义、损失函数与优化器选择、模型训练与评估、模型保存与部署,并展示了构建全连接神经网络的具体示例。此外,还探讨了 TensorFlow 的高级特性,如自动微分、模型可视化和分布式训练,以及其在未来的发展前景。
112 5
|
2月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
94 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络

相关产品

  • 容器服务Kubernetes版