NVIDIA发布Workload Map:用声明式定义统一描述Kubernetes分布式AI负载
NVIDIA技术博客介绍,Workload Map(原Karta)以Kubernetes CRD加Go库的形式,为JobSet、PyTorchJob、RayCluster等负载提供共享的结构描述,使KAI Scheduler、NVIDIA Run:ai等组件无需各自维护框架专用解析代码。该组件以Apache 2.0协议开源,已在NVIDIA Run:ai生产环境使用。
NVIDIA技术博客发布文章,介绍开源组件Workload Map(原Karta,CRD资源类型名保持Karta)。该组件以Kubernetes CRD加Go库的形式,为JobSet、PyTorchJob、RayCluster等分布式AI负载提供统一的结构描述,使调度器、控制器和平台无需为每类框架单独维护解析代码。文章作者为Alon Lavian。
文章给出的示例是一个JobSet:1个leader角色、2个worker角色,每个Pod请求4块GPU,合计12块GPU。NVIDIA称,没有共享的负载描述时,kubectl会把JobSet、三个Job及其Pod分别列出,平台需要自行重建结构并汇总GPU请求。
Workload Map如何描述负载
每份工作负载定义说明该类型在哪里找到Pod模板、副本数和状态字段。Go库把运行中的对象解析为统一的结构视图,使用方据此提取Pod模板、副本数、状态和元数据,跨实例更新Pod spec、标签与注解,并理解负载层级(例如JobSet的replicated Jobs及其Pod)。
文章以JobSet定义为例:根组件声明kind与状态读取方式;由于JobSet不直接报告“Running”条件,定义用jq表达式对replicatedJobsStatus推导(任一Job ready且active、且无失败),并把原生Completed、Failed条件映射到共享状态词汇。子组件用jq路径取Pod模板、以replicas乘parallelism计算Pod数、以replicatedJobs[].name区分leader与worker角色。
- 预置定义覆盖JobSet、PyTorchJob、RayCluster、RayJob、RayService、KServe、Knative、MPIJob、NVIDIA NIM、LeaderWorkerSet、Milvus、Grove PodCliqueSet、NVIDIA Dynamo
- 新增负载类型只需编写描述其结构与状态的YAML定义
- 每个定义包含Pod模板路径、副本数路径和状态映射
同一份定义在三类工具中的用法
文章展示了同一份JobSet定义的三种用途。Workload Map CLI通过kubeconfig读取集群中的负载,加载定义后打印树状结构;示例输出显示leader 1/1、worker 2/2、合计12块GPU及各Pod所在节点。NVIDIA称这一检查流程无需把Workload Map安装进集群,CLI可通过Homebrew安装。
在调度侧,定义可附带可选的gang scheduling指令,声明pod group与子组;KAI Scheduler负责实施组准入与放置决策。文章称KAI Scheduler把Workload Map作为其pod分组器在无原生插件负载类型上的兜底,原生插件仍优先。
在NVIDIA Run:ai中,NVIDIA称一次API调用即可用同一份目录定义注册负载类型,无需额外代码,平台随后把该JobSet作为一个负载管理。
- CLI用途:检查负载结构、角色就绪状态与GPU总量
- KAI Scheduler用途:为缺少原生插件的负载类型提供分组与gang调度信息
- NVIDIA Run:ai用途:以单一负载视角呈现并管理JobSet
采用范围与许可
NVIDIA称Workload Map以Apache 2.0协议开源,通过NVIDIA DSX AI Factory GitHub组织发布,并在NVIDIA Run:ai生产环境中使用。文章还提到,Elotl的Nova用它解释负载结构与资源需求,以在多集群间为分布式负载选择集群。
文章没有给出采用该组件后的调度效率或运维成本数据。
- 开源协议:Apache 2.0
- 生产使用方:NVIDIA Run:ai(NVIDIA自述)
- 其他采用方:Elotl Nova(用于多集群调度选型)