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

简介: 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亲和性调度等能力。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
7月前
|
存储 关系型数据库 分布式数据库
喜报|阿里云PolarDB数据库(分布式版)荣获国内首台(套)产品奖项
阿里云PolarDB数据库管理软件(分布式版)荣获「2024年度国内首版次软件」称号,并跻身《2024年度浙江省首台(套)推广应用典型案例》。
|
8月前
|
Ubuntu 定位技术 TensorFlow
源码编译安装ROCm以运行tensorflow-rocm(适用于Ubuntu 23.04)
总结一番,完成这趟奇妙的技术之旅后,乐趣多多,还能享受 tensorflow-rocm 带来的便利和速度。这趟旅程需要耐心,勇气,以及对技术的热爱。朋友,做好准备,让你的Ubuntu系统展翅高飞吧!
476 9
|
9月前
|
PyTorch 调度 算法框架/工具
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
DLC任务Pytorch launch_agent Socket Timeout问题源码分析与解决方案
480 18
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
阿里云人工智能平台 PAI 开源 EasyDistill 框架助力大语言模型轻松瘦身
本文介绍了阿里云人工智能平台 PAI 推出的开源工具包 EasyDistill。随着大语言模型的复杂性和规模增长,它们面临计算需求和训练成本的障碍。知识蒸馏旨在不显著降低性能的前提下,将大模型转化为更小、更高效的版本以降低训练和推理成本。EasyDistill 框架简化了知识蒸馏过程,其具备多种功能模块,包括数据合成、基础和进阶蒸馏训练。通过数据合成,丰富训练集的多样性;基础和进阶蒸馏训练则涵盖黑盒和白盒知识转移策略、强化学习及偏好优化,从而提升小模型的性能。
|
9月前
|
缓存 并行计算 测试技术
阿里云PAI-全模态模型Qwen2.5-Omni-7B推理浅试
阿里云PAI-全模态模型Qwen2.5-Omni-7B推理浅试
2217 12
|
11月前
|
存储 人工智能 云栖大会
【云栖大会】阿里云设计中心 × 教育部协同育人项目成果展,PAI ArtLab助力高校AIGC教育新路径
【云栖大会】阿里云设计中心 × 教育部协同育人项目成果展,PAI ArtLab助力高校AIGC教育新路径
|
11月前
|
存储 人工智能 物联网
ACK Gateway with AI Extension:大模型推理的模型灰度实践
本文介绍了如何使用 ACK Gateway with AI Extension 组件在云原生环境中实现大语言模型(LLM)推理服务的灰度发布和流量分发。该组件专为 LLM 推理场景设计,支持四层/七层流量路由,并提供基于模型服务器负载感知的智能负载均衡能力。通过自定义资源(CRD),如 InferencePool 和 InferenceModel,可以灵活配置推理服务的流量策略,包括模型灰度发布和流量镜像。
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
云上一键部署通义千问 QwQ-32B 模型,阿里云 PAI 最佳实践
3月6日阿里云发布并开源了全新推理模型通义千问 QwQ-32B,在一系列权威基准测试中,千问QwQ-32B模型表现异常出色,几乎完全超越了OpenAI-o1-mini,性能比肩Deepseek-R1,且部署成本大幅降低。并集成了与智能体 Agent 相关的能力,够在使用工具的同时进行批判性思考,并根据环境反馈调整推理过程。阿里云人工智能平台 PAI-Model Gallery 现已经支持一键部署 QwQ-32B,本实践带您部署体验专属 QwQ-32B模型服务。
|
11月前
|
存储 测试技术 对象存储
使用容器服务ACK快速部署QwQ-32B模型并实现推理智能路由
阿里云最新发布的QwQ-32B模型,通过强化学习大幅度提升了模型推理能力。QwQ-32B模型拥有320亿参数,其性能可以与DeepSeek-R1 671B媲美。

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多