ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kubernetes 上部署分布式 TensorFlow:基于 Helm Chart 的 Worker/PS 集群搭建与配置指南

Kubernetes 上部署分布式 TensorFlow:基于 Helm Chart 的 Worker/PS 集群搭建与配置指南 【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载导读本指南以charts仓库中的stable/distributed-tensorflowHelm Chart 为蓝本系统讲解如何在 Kubernetes 上部署一套由Parameter Server参数服务器ps与Worker工作节点两类角色构成的分布式 TensorFlow 训练集群。读完本文你将掌握该 Chart 的架构设计、安装/卸载命令、GPU 资源配置方法以及 batchsize、learning rate、train steps 等训练超参与底层模板之间的映射关系可直接动手搭建可水平扩展的多机多卡训练环境。提示该 Chart 属于 Helm Charts 官方仓库的历史版本仓库与 Chart.yaml 中均已标注deprecated: true自 2020 年 11 月起不再维护更新本文内容适用于了解历史实现与学习分布式 TensorFlow 在 Kubernetes 上的经典部署模式生产环境请评估维护风险。一、Chart 概览与架构原理TensorFlow 是采用数据流图data flow graph进行数值计算的开源软件库原生支持分布式计算允许在不同服务器上执行数据并行data parallel或模型并行model parallel策略。借助该 Chart数据科学家可以在一套 Kubernetes 集群上把分布式训练水平扩展到数百块 GPU。该 Chart 的核心目标原文档 Chart Details 部分创建一个 TensorFlow 集群将一份计算图computation graph分发到集群中的多个节点上协同执行。从源码结构看templates 目录该 Chart 的运行时架构由三类 Kubernetes 资源协同完成StatefulSet 双角色划分statefulset-worker.yaml 与 statefulset-ps.yaml 分别定义worker与ps两个 StatefulSetPod 通过role: worker/role: ps标签区分且均以python train_distributed.py作为启动命令Headless Service 提供稳定网络标识service-worker.yaml 与 service-ps.yaml 均为clusterIP: None的无头服务让每个 Pod 拥有独立的稳定 DNS 名称供集群内互相寻址ConfigMap 动态生成 hostListconfig.yaml 根据 worker/ps 的数量与端口自动渲染出worker.hostList与ps.hostList两个数据项并通过环境变量注入到每个 Pod 中。如上图所示分布式 TensorFlow 集群中任务被划分为/job:ps/参数服务器红色框与/job:worker/工作节点黄色框两类角色其中 worker 中的chief首席工作节点负责流程管控ps 与 worker 之间通过 RPC 通信完成参数同步图片下方的 TensorBoard 则对应训练过程的可视化观测。1.1 hostList 的生成逻辑config.yaml 使用 Go 模板的until函数按序号迭代生成主机列表其格式遵循releaseName-role-index.serviceName:port# ps.hostList 示例ps.number2, ps.port8000 mnist-ps-0.mnist-distributed-tensorflow-ps:8000,mnist-ps-1.mnist-distributed-tensorflow-ps:8000 # worker.hostList 示例worker.number2, worker.port9000 mnist-worker-0.mnist-distributed-tensorflow-worker:9000,mnist-worker-1.mnist-distributed-tensorflow-worker:9000该列表配合 StatefulSet 的有序命名规则Pod 名称形如mnist-worker-0、mnist-ps-1与无头服务的 DNS 解析即可让 TensorFlow 的TF_CONFIG或脚本内的集群定义获得完整、可解析的节点地址。Pod 内的WORKER_HOSTS、PS_HOSTS环境变量即来自这个 ConfigMap见 statefulset-worker.yaml同时通过POD_NAME取自metadata.name与JOB_NAME固定为worker或ps标识自身身份。二、环境前提Kubernetes 集群版本v1.12原文档 Prerequisites 部分已安装 Helm支持helm install命令的版本若启用 GPU 训练集群需配置好 NVIDIA GPU 设备插件如nvidia.com/gpu资源并准备 GPU 版镜像。Chart 元数据信息来自 Chart.yaml名称distributed-tensorflow版本1.2.2appVersion: 1.7.0对应 TensorFlow 1.7.0 系列。三、安装 Chart3.1 默认参数安装以 release 名称mnist安装原文档命令其中 chart 路径按当前仓库结构写作stable/distributed-tensorflow$ helm install mnist stable/distributed-tensorflow如需从本地仓库目录直接安装也可使用$ helm install mnist ./stable/distributed-tensorflow3.2 通过自定义 values 文件安装将配置写入values.yaml后执行$ helm install --values values.yaml mnist stable/distributed-tensorflow以下是原文档给出的GPU 支持版自定义 values 示例它同时演示了 Worker 使用 GPU 镜像、Parameter Server 使用 CPU 镜像、以及训练超参调优的完整写法worker: number: 2 podManagementPolicy: Parallel image: repository: dysproz/distributed-tf tag: 1.6.0-gpu port: 9090 gpuCount: 1 ps: number: 2 podManagementPolicy: Parallel image: repository: dysproz/distributed-tf tag: 1.6.0 pullPolicy: IfNotPresent port: 8080 # optimize for training hyperparams: batchsize: 20 learningrate: 0.001 trainsteps: 10000说明示例中的镜像dysproz/distributed-tf托管于 Docker Hub带-gpu后缀的 tag 为 GPU 版本含 CUDA 运行时CPU 版本则不携带该后缀。3.3 安装后验证安装完成后可参照 NOTES.txt 中的提示查看集群状态kubectl get sts --namespace release-namespace -l appdistributed-tensorflow,releasemnist预期能看到两个 StatefulSetmnist-worker与mnist-ps其副本数分别对应worker.number与ps.number。四、卸载 Chart要卸载/删除名为mnist的部署原文档 Uninstalling the Chart 部分$ helm delete mnist该命令会移除与 Chart 关联的所有 Kubernetes 组件并删除该 release含两个 StatefulSet、两个无头 Service 及 ConfigMap。五、完整配置参数说明下表列出了该 Chart 的全部可配置参数及其默认值继承自原文档配置表默认值以仓库中 values.yaml 实际内容为准ParameterDescriptionDefaultworker.image.repositoryTensorFlow Worker Server 的镜像仓库dysproz/distributed-tfworker.image.tagTensorFlow Worker Server 的镜像 tag1.7.0worker.image.pullPolicyWorker 的镜像拉取策略IfNotPresentworker.gpuCount为 Pod 分配并允许使用的 GPU 数量0worker.env键值形式的环境变量Noneps.image.repositoryTensorFlow Parameter Server 的镜像仓库dysproz/distributed-tfps.image.tagTensorFlow Parameter Server 的镜像 tag1.7.0ps.image.pullPolicyPS 的镜像拉取策略IfNotPresentps.env键值形式的环境变量Nonevolumes在集群中定义的存储卷列表标准 k8s 格式host path 指向/tmp/mnistvolumeMounts挂载进 Pod 的卷标准 k8s 格式host path 卷挂载至/tmp/mnist-loghyperparams.batchsizebatch size20hyperparams.learningratelearning rate0.001hyperparams.trainsteps训练步数0持续运行hyperparams.datadir数据目录Nonehyperparams.logdir日志目录Nonehyperparams.hiddenunits神经网络隐藏单元数None原文档默认值中worker.image.tag写作gpu、ps.image.tag写作1.7.0-gpu而当前仓库 values.yaml 中两个 tag 均为1.7.0上表以仓库实际值为准。5.1 基础拓扑参数worker.number/ps.number分别控制 worker 与 ps 两个 StatefulSet 的副本数模板中映射为replicas见 statefulset-worker.yaml即分布式集群中两类角色的节点规模podManagementPolicyStatefulSet 的 Pod 管理策略默认Parallel允许所有副本并行启动加快大规模集群的拉起速度worker.port/ps.port容器内服务端口同时用于 StatefulSet 的containerPort、无头 Service 的端口以及 ConfigMap 生成的 hostList 地址如mnist-ps-0...:8000。5.2 GPU 资源参数worker.gpuCount是启用 GPU 训练的关键开关。当gpuCount 0时statefulset-worker.yaml 会做两件事在启动命令中追加--num_gpus gpuCount参数为容器声明nvidia.com/gpu资源限额与请求statefulset-worker.yamlresources: limits: nvidia.com/gpu: 1 request: nvidia.com/gpu: 1因此要使用 GPU必须同时满足集群存在可调度的nvidia.com/gpu资源、worker 镜像为 GPU 版如1.6.0-gpu、gpuCount大于 0 三个条件。PS 角色负责参数存储与更新通常使用 CPU 镜像即可。5.3 训练超参hyperparamshyperparams下的四个键会按条件映射为train_distributed.py的命令行参数worker 与 ps 的模板逻辑一致见 statefulset-worker.yamlvalues 键命令行参数语义hyperparams.learningrate--learning_rate学习率hyperparams.batchsize--batch_size批大小hyperparams.trainsteps--train_steps训练步数默认0表示持续运行hyperparams.datadir--data_dir训练数据目录hyperparams.logdir--log_dirTensorBoard 日志目录hyperparams.hiddenunits--hidden_units神经网络隐藏单元数模板采用{{- if .Values.hyperparams.xxx }}条件渲染未设置的参数不会被拼进启动命令从而保持脚本参数的可选性。这也解释了为何默认trainsteps: 0时训练会持续进行——只有当配置非 0 值如示例中的10000时才会触发--train_steps 10000。5.4 存储与环境变量volumes/volumeMounts以标准 Kubernetes 格式toYaml直接渲染进 Pod spec声明存储卷并挂载默认挂载点为 host path 的/tmp/mnist与/tmp/mnist-log用于存放训练数据与日志worker.env/ps.env以键值对形式追加自定义环境变量模板通过range遍历注入见 statefulset-worker.yaml可用于注入TF_CONFIG之外的自定义配置此外statefulset-ps.yaml 还支持ps.privileged特权容器与ps.resources自定义资源配额两个扩展参数便于在需要特权操作或精细资源控制的场景下使用。六、工作流程与集群内通信一次完整的部署到运行流程可概括为helm install根据 values 渲染出 2 个 StatefulSet、2 个无头 Service 与 1 个 ConfigMapConfigMap 依据number与port生成worker.hostList/ps.hostList每个 Pod 启动时读取自身POD_NAME、JOB_NAME并从 ConfigMap 注入WORKER_HOSTS/PS_HOSTS环境变量各容器执行python train_distributed.py借助环境变量组装出集群地址表通过无头服务的稳定 DNS 互相发现并建立通信开始分布式训练训练期间可通过log_dir指向的 TensorBoard 观测损失曲线与参数分布。七、注意事项与限制本 Chart 及整个charts仓库已于 2020 年 11 月起停止更新README 与 Chart.yaml 均明确标注废弃状态其中appVersion: 1.7.0对应的是 TensorFlow 1.x 时代的 API与 TensorFlow 2.x 的分布式训练接口如tf.distribute差异较大移植到新版本框架需自行调整训练脚本示例镜像dysproz/distributed-tf为第三方维护的历史镜像是否仍可用需自行验证worker 与 ps 的端口如示例中的9090/8080一旦变更必须保证 StatefulSet 容器端口、无头 Service 端口同步一致否则 hostList 中的地址将无法连通仓库仅提供 Chart 本身模板 默认值train_distributed.py脚本逻辑封装在镜像内本仓库不包含其源码需结合 values.yaml 中暴露的 CLI 参数理解其行为。八、延伸阅读默认配置全文values.yaml角色定义模板statefulset-worker.yaml、statefulset-ps.yamlhostList 生成逻辑config.yaml无头服务定义service-worker.yaml、service-ps.yaml名称辅助函数_helpers.tpl结合以上模板源码读者可以清楚地看到每个 values 参数从 Helm 渲染到 Kubernetes 资源再到容器启动命令的完整传递链路这也是理解该 Chart以及同类 Helm Chart最直接的方式。赞分享【免费下载链接】charts⚠️(OBSOLETE) Curated applications for Kubernetes项目地址https://gitcode.com/gh_mirrors/chart/charts点击查看免费下载相关推荐Webhook.site Helm Chart配置Kubernetes集群部署详解Webhook.site Helm Chart配置Kubernetes集群部署详解 Webhook.site是一个强大的Webhook接收和回调服务器通过H开发工具Teleport Helm Chart 部署指南用 teleport-cluster 在 Kubernetes 上搭建高可用集群Teleport Helm Chart 部署指南用 teleport cluster 在 Kubernetes 上搭建高可用集群 本指南以仓库中 telepo网络安全认证鉴权运维后端AutoMQ 基于 Bitnami Helm Chart 在 Kubernetes 上的部署指南AWS 跨可用区集群安装与配置详解AutoMQ 基于 Bitnami Helm Chart 在 Kubernetes 上的部署指南AWS 跨可用区集群安装与配置详解 AutoMQ 通过将持久化消息队列后端云原生存储上一篇HelloAgents Code Agent CLI 补丁式代码修改实战从 Patch applied 笔记看安全补丁流水线与结构化记录机制下一篇炉石传说HsMod插件终极游戏体验增强工具完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表