主题
Job、角色、Worker 与 Task
在 Web 控制台中选择创建任务时,创建的是一个 RLark Job,不是一个 RLark Task。日常提交和查看训练任务时,主要关注 Job、角色和 Worker;查看 YAML、状态或排查编排问题时,才需要进一步查看 Task。
区分控制台中的几个对象
| 名称 | 对用户表示什么 |
|---|---|
| 控制台任务 / Job | 一次训练、评测或数据采集的完整运行定义 |
| 角色 | 一组按相同节点选择、资源、镜像、脚本、环境变量和挂载创建的 Worker |
| Worker | 控制台显示的实际运行实例;当前 Kubernetes 运行方式下通常对应一个 Pod,并启动一个 Ray 节点 |
| Task 模板 | Job YAML 的 spec.tasks[] 条目;描述一个角色应如何创建 Worker |
| Task 资源 | Job 提交后,RLark 根据 Task 模板创建并管理的独立资源 |
这里的 Task 资源不是 Kubernetes API 所说的子资源(例如 status 或 scale)。更准确地说,它是 Job 派生并管理的 Task 资源。
理解 Job 提交后的资源关系
text
控制台角色
│
▼
Job.spec.tasks[] 中的 Task 模板
│
│ Job Controller 根据模板创建并管理
▼
RLark Task 资源
│
│ 当前 Web 控制台的 Kubernetes 运行方式
▼
StatefulSet
│
▼
Worker Pod(s)
│
▼
Ray 节点Job YAML 中的 spec.tasks[] 只是模板列表,不表示同名 Task 资源已经存在。Job 提交后,RLark 才会为每个模板创建 Task 资源;数据平面随后根据 Task 创建 StatefulSet 和 Pod。
Task API 还可以表达 Docker、Raw 和其他 Kubernetes 工作负载,但 Web 控制台的创建页面当前生成 Kubernetes StatefulSet 配置。本页后续关于 StatefulSet 和 Pod 的说明只适用于这条控制台创建路径。
理解角色如何产生 Worker
一个角色对应一个 Task 模板。角色中的已选节点数会成为该模板的副本数,并决定 RLark 尝试创建多少个 Worker。
角色统一定义这组 Worker 使用的:
- 节点选择;
- 单个 Worker 的 GPU 和设备数量;
- 镜像、准备脚本和环境变量;
- 主机目录或对象存储挂载。
不同角色可以选择同一批物理节点,但各角色的匹配数量、Worker 和资源申请会分别计算,不会按物理节点去重。一个物理节点上可以运行多个 Worker;这些 Worker 仍是不同的 Pod 和 Ray 节点,并分别获得 RLINF_NODE_RANK。
角色也不是 RLinf 组件。角色名称为 Actor、Rollout 或 Environment,不会让 RLinf 在对应 Worker 中自动启动同名组件。多节点或异构任务先根据已有 RLinf 配置确定 Ray 节点数量和 Worker 分组,再按照规划多节点和异构 Worker填写角色。
Header 角色必须只创建 1 个 Worker
运行脚本写入 Header 角色对应的 Task 模板。该 Task 的每个 Pod 都会启动 Ray Head 并执行同一份运行脚本,因此 Header 角色的已选节点数和 YAML 副本数都必须为 1。
在任务详情中核对 Worker
Worker 是控制台根据 Task 和 Pod 状态组成的运行实例视图,不是独立的 RLark 资源。展开 Worker 后可以查看:
- 所属角色和 Task;
- Pod 名称、阶段、所在节点和 IP;
- 日志、WebTerminal 和其他运行时入口。
工作负载尚未产生 Pod 时,页面可能只显示 Task 摘要。此时还不能根据 Worker 行确认实际 Pod、节点或终端是否可用。
结合各层状态判断运行情况
状态大致按以下顺序更新:
- StatefulSet 和 Pod 产生运行状态。
- 数据面把最近观察到的状态同步到 Task 和 Pod 资源。
- RLark 根据各 Task 的阶段更新 Job。
- 控制台把 Job、Task 和 Pod 状态组合成 Worker 视图。
刚提交、停止或恢复 Job 后,各层显示可能短暂不同步。等待一次正常同步后,再结合 Worker 日志、Ray 成员、RLinf 业务信号和持久输出判断结果。
当前控制台生成的 StatefulSet Task 不会上报 Failed 或 Succeeded。运行脚本结束、容器重启或日志报错时,Job 和 Task 仍可能显示 Running。各层状态的适用范围见状态与生命周期。