找回密码
立即注册
搜索
发回帖 发新帖

5978

积分

0

好友

753

主题
发表于 14 小时前 | 查看: 2| 回复: 0

在上篇《开源 TauGrid:Kubernetes 上的云原生 GPU 基础设施》中,我介绍了 TauGrid 的由来,包括它是什么、怎么安装使用,以及如何跑通第一个任务。那篇的重点是快速上手,很多设计上的取舍没有展开。

今天这篇就来补上这块缺口,聊聊 TauGrid 的架构设计和工作原理。内容来自我上周在 KubeCon China 2026 上的分享《From Data Preparation to Inference: Closing the Lifecycle Gap in AI Infrastructure on Kubernetes》的文字稿。

问题到底出在哪

Kubernetes 生态确实繁荣,AI 训练任务相关的开源项目非常多,拿过来装上就能用。一般来说,跑 AI 训练任务至少要装齐这几样:GPU 驱动和 CUDA、DCGM 监控、Kueue 排队、KubeRay 调度、持久化存储,还有监控和日志。

Kubernetes AI 训练基础组件架构图,展示 GPU 驱动、DCGM、Kueue、KubeRay、存储与监控等模块的组装关系

组件装好只是开始,它们可不会自动互相配合。想让这些组件协同工作,还得写一堆胶水代码:提交脚本、队列封装、GPU 异常监控、checkpoint 跟 PVC 的绑定。每件事单独看难度都不大,但要把它们全部串起来,让整套系统稳定可靠地跑,复杂度就不低了。

平台组装全景图,左侧 Researcher train.py 指向右侧虚线框内的六个平台组件,底部为提交脚本、队列封装、健康检查和结果回收这四类胶水代码

我们在 AKS 上见过不少客户就是这么一路走过来的。脚本越堆越多,系统越来越脆,维护、升级、异常处理都变得越来越重。

怎么破?把问题拆开看,其实很清楚:

研究员与平台基础设施之间的生命周期契约缺失示意图,左侧为研究员的 train、fine-tune、serve、debug、trace 功能,右侧为 workspace、profile、queue、storage、identity 基础设施模块,中间标注 lifecycle contract missing today

研究员关心的是训练任务能不能跑、跑到哪了、出问题去哪看日志。他不需要也不应该关心 Kubernetes 底层有哪些组件、每个组件是什么原理。

平台这边关心的则是:GPU 有多少、分给谁、利用率够不够、坏了怎么恢复。

两边关注点完全不同,中间缺一个东西把它们衔接起来。这就是 TauGrid 诞生的原因。

设计思路

TauGrid 本质上是在 Kubernetes 之上加了一层生命周期管理,让研究员和平台团队各看各的界面、各管各的事。

TauGrid 架构定位图,展示研究员接口(repository + tau CLI)、平台自有策略(workspace 与 profile)以及 Kueue、KubeRay 等既有系统的所有权划分

研究员这边,维护一份 tau.yaml,用 tau 命令提交任务、看进度、拿结果,全程不用碰 kubectl。平台这边,GPU 类型、配额、队列、节点规格统一配好,研究员不用操心。

有一点我在演讲里特别强调过:TauGrid 没有重新造轮子。排队还是 Kueue,分布式训练还是 KubeRay,GPU 监控还是 DCGM。这些上游项目一行都没改,TauGrid 只是把它们串了起来。具体架构如下:

TauGrid 系统分层架构图,自上而下分为 Surfaces、TauGrid core、Scheduling 与 monitoring、K8s platform 四层

从下往上看,最底层是 Kubernetes 平台本身——GPU Operator、Device Plugin、存储、身份认证这些集群里本来就有。往上是调度和观测,接的全是熟面孔:Kueue、KubeRay、DCGM、NPD,都是社区开源版本。

TauGrid 真正新增的只有上面两层。一层是核心,由几个 CRD 对象 加一个 Lifecycle recorder 组成,后面会展开。最上面是用户入口:tau CLI、Portal、SDK。

工作原理

下面以一次 AI 实验从提交到结束的完整流程为例,看看每个阶段是怎么管理的,TauGrid 又是怎么解决前面那些问题的。

典型 AI 实验流程示意图,从 commit code 到 collect results 经过 TauGrid Resolve、Render、Kueue Admit、KubeRay Run、K8s Schedule、Trainer Progress、TauGrid Complete 七个阶段

一次典型的 AI 实验,从提交代码到拿回结果,经过七个阶段。前两段 Resolve 和 Render 是 TauGrid 自己的,负责把研究员的 tau.yaml 和平台的 profile 合成一个 RayJob。之后交给 Kueue 检查配额,KubeRay 拉起集群,Kubernetes 调度到 GPU 节点,训练代码跑起来,最后 TauGrid 确认结束、回收资源。

虽然执行分散在不同的系统里,观测却一直在进行。TauGrid 从提交开始就把状态、日志、训练指标一路抓回来,研究员在 CLI 和 Portal 里能实时看到 loss 曲线。平台那边,DCGM 和 NPD 也一直在抓 GPU 健康状况和使用率。

存储契约

这些阶段靠什么串起来?两样东西。第一样是持久化存储。

数据准备到推理的存储契约流程图,展示 tau data、tau run、tau serve 三个阶段共享 workspace PVC 挂载于 /data 目录

同一个 workspace 下的所有任务共享一块 PVC,挂在 /data。数据准备用 tau data,训练用 tau run,推理用 tau serve,换的只是命令,存储路径始终是同一个。checkpoint、训练产物、模型文件都按 run ID 组织在 /data 下面。

run ID 贯穿全链路的流转示意图,从 tau.yaml 到 RayJob、Workload、Pod、日志和产物存储的统一标识

不同的系统组件通过 run ID 标识同一个任务:tau run 渲染出的 RayJob 带上 tau.azure.com/run-id 这个 label,后面 Kueue 的 Workload、RayCluster、Pod 都带着同一个标签,产物按 run-id 存放在 /data/ 下,监控指标也打上 run-id。

CLI 渲染

第二样是渲染。

Tau run Render 决策流程图,研究员 tau.yaml 与平台 workload profile 合成 Rendered RayJob,不兼容时直接 Stop

左边是研究员写的 tau.yaml,比如用 rayjob、1 个 worker、每个 worker 1 张卡。右边是平台管理员配置的 workload profile,定义了用什么 GPU 节点、进哪条队列。

tau run 把两边合成 RayJob,以管理员定义的 profile 为准。研究员的 tau.yaml 有问题时,直接在客户端报错,避免了提交之后才发现 GPU 资源不足、任务配置跟节点配置不一致这类情况。让错误在提交之前就暴露出来,别等跑了半小时才发现一开始就配错了。

TauGrid 控制器

为了把各个组件串联起来,TauGrid 引入了三个 CRD 对象:

  • TauCluster 管理集群里有哪些 GPU、什么规格、对应哪条队列,控制器盯着节点变化自动发布 workload profile。
  • TauWorkspace 管研究员的工作空间,把 Namespace、LocalQueue、RBAC、ServiceAccount 一次性准备好。
  • TauQuotaRequest 管配额申请,研究员提申请,只有平台管理员才可以批准。

它们的职责划分如下:

TauGrid Core 架构图,一个 controller manager 下含 TauCluster、TauWorkspace、TauQuotaRequest 三个 reconciler,与 Nodes、Kueue LocalQueue、Kueue quota 的交互关系

任务状态

以前一个 Workload 出问题,得去多个系统分别排查:配额不足查 Kueue,无法调度看 kube-scheduler,GPU 异常看 Node,任务进度查训练日志,完成状态查 RayJob,最终产物还得去 PVC 里翻。一个小问题要查这么多系统,不管是 AI 研究员还是平台 SRE,都挺崩溃的。

TauGrid 六状态聚合监控视图,展示 Kueue Admitted、kube-scheduler Scheduled、Node GPU healthy、Trainer Progressing、RayJob Completed、PVC Artifact saved 六个状态框

TauGrid 把这些信号收到一起,拆成六个状态:Admitted(来自 Kueue)、Scheduled(来自 kube-scheduler)、GPU healthy(来自节点 condition)、Progressing(来自训练指标)、Completed/Failed(来自 RayJob 状态)、Artifact saved(来自 PVC 文件)。

一条 tau run status 命令就能看到异常任务卡在哪个阶段,快速定位到出问题的组件。

任务结束

训练任务跑完,并不意味着下一个任务可以直接调度过来。任务结束后还得清理资源,分两条线走:

任务结束后的资源释放流程图,上半部分为 Kueue 配额释放(Workload finished → Quota released → Next job admitted),下半部分为 Kubernetes 计算资源释放(Cluster removed → Pods terminated → GPUs free)

一条是 Kueue 的配额释放:Workload 结束后配额标记为 released,下一个任务可以准入。另一条是 Kubernetes 的 GPU 算力释放:KubeRay 删掉 RayCluster,Pod 终止,GPU 才真正空出来。两条线相互独立,只有都完成释放,后面排队的任务才能真正调度进来。

未来计划

TauGrid 路线图,NEXT 列包含多租户、Portal 体验、数据准备生命周期、分布式训练和成本归因,EXPLORING 列包含推理服务、跨云执行、强化学习和 Agent 驱动研究

TauGrid 刚刚开源,还有很多要完善的地方。

下一个版本会增强多租户支持、优化 Portal 体验、改进数据预处理,并完善分布式训练和 GPU 成本监控。

更远一些,还计划进一步优化系统性能、支持跨云 GPU 资源调度、改善强化学习和后训练的任务体验,以及增加 Agent 驱动的自动研究能力。

开源地址

TauGrid 完全开源,采用 MIT 协议。欢迎试用,更欢迎提 issue 反馈使用中遇到的问题:

如果你也在关注 AI Infra 和 Kubernetes,欢迎来 云栈社区 一起交流实践中的发现和踩坑经验。




上一篇:Kubernetes 多租户集群安全部署 AI Agent 架构设计与治理实践
下一篇:TauGrid 开源实践:Kubernetes 云原生 GPU 训练平台全流程统一 Kueue 与 KubeRay
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-11 19:11 , Processed in 0.064733 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表