argus-cluster/specs/mvp/mvp_roadmap.md
2025-12-23 14:22:15 +08:00

15 KiB
Raw Blame History

MVP RoadmapV1 → V2 → … → 训练平台)

本文档在 specs/mvp/milestones.md 的草稿基础上做扩展与细化把目标拆成可迭代的版本MVP v1/v2/…),保证每个版本都能独立运行、可验证验收,并且在上一版本基础上演进。

总目标North Star产出一套**基于 Native Ray 集群(无 K8s 底座)**的训练平台,面向多用户,支持 verl 各类训练/评测/Serving 工作负载,提升集群利用率,并通过可观测系统实现资源统计、监控告警,最终形成运维 SOP 并可接入运维智能体做自动化运维。


0. 关键原则(贯穿所有版本)

  1. 版本可独立运行:每个版本都能从“空环境”按文档跑起来(不依赖未来能力)。
  2. 验收可客观验证:每个里程碑必须有明确的 DoDDefinition of Done与可复现步骤。
  3. 强制产物落盘:模型/数据/日志/ckpt 必须可追踪、可复用、可审计(基于共享存储/NFS
  4. Head 不参与计算Head 只承担控制面GCS/Dashboard/Job server避免训练抢占控制面资源。
  5. 按 submission id 组织作业:作业输出目录与 Ray submission id 绑定,方便检索、回收、归档。
  6. “先把 RL 跑稳”,再扩 workload:先 PPO已验证再 GRPO/SFT/Serving。

0.1 里程碑总览(建议交付顺序)

版本 定位 关键交付 核心验收点
v1 可复现实验闭环 Ray 集群 + PPO 跑通 + 持久化 driver 不在 head产物落盘
v1.1 实验工程化 JobSpec 模板 + 新增 1 个 workload 可回归、可定位、可扩展
v2.0 服务化入口 API + Ray Jobs SDK API 提交/查询/停止可用
v2.1 节点纳管 SSH 注入 + 资源池/标签 节点上线/下线、gang 约束
v3.0 平台雏形 队列 + 超时 + 最小多用户 pending→running 自动调度
v3.1 可扩展平台 自定义代码/reward + 多版本 多版本并存、插件可用
v4.0 可运营平台 Prom/Grafana + W&B 资源核算/告警/归档
v4.1 可交接平台 SOP + 自动化运维接口 非开发可按 SOP 运维
v5.0 长期形态 Serving + Pipeline 训练→发布推理闭环

1. 当前基线MVP v1已完成/已验证)

1.1 目标

在单机(或同一宿主机)用 3 个容器跑通:

  • Ray head无 GPUCPU=0/GPU=0
  • 2 个 Ray worker每个 4 GPU
  • 通过 head 上的 ray job submit 提交 verl PPOtotal_epochs=1
  • 通过 entrypoint 自定义资源强制 driver 在 worker 上
  • 数据/模型/日志/ckpt 全部持久化

1.2 交付物repo 中已存在)

  • 脚本与 composesrc/mvp/v1/
  • 行动与验收文档:specs/mvp/v1/v1_action.md
  • 共享目录约定:shared/datasetsshared/hfshared/jobs 等(与 NFS 对齐)

1.3 验收口径(摘要)

  • ray job listdriver_info.node_ip_address ∈ worker IP且 ≠ head IP
  • 训练输出落在 /mnt/shared/jobs/<submission_id>/...
  • checkpoint 按 save_freq 产生(避免爆磁盘)

2. MVP v1.1Hardening + 多 workload 可行性验证)

目标:把 v1 从“实验脚本”升级成“可长期回归的最小系统”,并验证更多 workload 的可行性边界。

2.1 主要能力

  • Workload 扩展(可选顺序):
    • PPO回归金标
    • GRPO on Ray可运行验证
    • SFT on Ray可运行验证llamafactoryverl 相关 SFT 路径)
  • 作业模板化(最小实现):
    • 统一 JobSpecYAML/JSON描述workload 类型、资源nnodes/n_gpus_per_node、数据、模型、输出目录、超时
    • 仍然用 ray job submit,但把 entrypoint 组装逻辑标准化
  • checkpoint 策略与磁盘保护:
    • 默认 save_freq ≥ 10或按训练总 steps 的比例)
    • 明确保留策略(至少提供“保留最后 N 个 ckpt”的配置建议/脚本)
  • “失败可定位”:
    • 统一收敛日志入口Ray job logs + hydra 日志目录 + 关键参数快照)
    • 失败时能定位:是资源不足 / NCCL / 数据 / 模型 / 配置错误

2.2 验收DoD

  • 同一套脚本在同一台机器能连续跑 3 次 PPO 回归,产物目录不互相覆盖
  • 至少新增 1 个 workloadGRPO 或 SFT可以跑通 “启动→训练→落盘” 闭环
  • 作业目录内包含:
    • config/submit_cmd.txt(或 job spec 快照)
    • logs/(可追踪)
    • checkpoints/(按策略生成)

3. MVP v2.0Control Plane 服务化API + Ray Jobs SDK

目标:从“人跑脚本”升级为“服务提交任务”。依然是 Native Ray 集群,但引入一个最小控制平面服务。

3.1 系统形态

  • Control Plane建议部署在 head/CPU 机器):
    • FastAPI 服务REST
    • Job 管理:用 Ray Jobs Python SDK 提交/查询/停止(不再依赖 CLI 文本解析)
    • 节点视图:读取 Ray statenodes, actors, placement groups
  • Data Plane
    • 仍然是预先启动的 worker 节点加入集群(先不做 SSH 动态纳管也可)

3.2 APIMVP 级别)

  • POST /v1/jobs:提交 JobSpecppo/grpo/sft
  • GET /v1/jobs:列表(含状态、资源、开始/结束时间)
  • GET /v1/jobs/{id}详情含输出目录、driver node
  • POST /v1/jobs/{id}:stop:停止作业

3.3 验收DoD

  • API 提交 PPO返回 submission id输出目录为 /mnt/shared/jobs/<submission_id>/...
  • API 查询 job 状态与 driver node必须是 worker
  • 停止 job 后,资源释放、状态可见

4. MVP v2.1SSH 纳管 + 资源池 + Gang 约束)

目标对齐你草稿里“SSH 纳管”的约束与需求:控制面能纳管 GPU 节点,形成可运营的资源池。

4.1 节点纳管SSH Provisioner

  • 控制面保存 NodeSpecip/user/port/labels/gpu_count
  • 通过 SSH 执行:
    • ray start --address=<head>:6379 --resources=...
    • ray stopdrain/下线)
  • 维护节点状态机:pending → online → draining → offline

4.2 资源池与 gangAll-or-nothing

  • 资源池最小模型:
    • pool 标签(如 pool_ah20ib_domain_1
    • 提交 job 时指定 pool 约束
  • Gang 约束MVP 实现方式):
    • job spec 明确 trainer.nnodes + trainer.n_gpus_per_node
    • 提交前检查 Ray 可用资源是否满足,不满足则进入 pending 队列(见 v3.0

4.3 验收DoD

  • 通过 API 注册 2 个 workerSSH 注入 ray startray status 可见节点上线
  • 通过 API 下线节点,节点被标记不可调度且不再分配新 job
  • gang 不满足时 job 不提交(或提交后一直 pending满足后可运行

5. MVP v3.0(调度与多用户:队列 + 超时 + 最小权限)

目标:平台开始“像个平台”:多用户、队列、超时、审计。仍然不做复杂配额/公平调度。

5.1 作业队列(简单但可用)

  • FIFO 队列:无优先级
  • “资源满足就调度”:谁先满足谁先跑(可接受非严格 FIFO
  • job 超时Ray 原生不支持统一 timeout草稿已指出因此控制面需
    • 记录 start_time
    • 定期扫描超时 job → stop

5.2 多用户最小闭环

  • 认证MVPtoken 或 basic auth先不做复杂 RBAC
  • 归属与隔离(文件层):
    • /mnt/shared/users/<user>/datasets/
    • /mnt/shared/users/<user>/models/
    • /mnt/shared/jobs/<submission_id>/ 记录 user/metadata

5.3 验收DoD

  • 2 个用户可各自提交 job能看到自己的 job 列表与输出目录
  • 超时策略可触发(模拟短 timeoutjob 被停止且状态标记为 timeout
  • 队列在资源不足时保持 pending资源释放后自动运行

6. MVP v3.1(可扩展性:自定义代码/Reward、多版本 VERL

目标:把“平台内置 workload”升级成“用户可提交自定义代码与 reward”并支持多版本并存。

6.1 自定义代码提交(最小实现)

两种方式二选一(建议先做 A

  • Aworking_dir 指向 NFS 上的代码快照目录(用户自己准备/上传)
  • B上传 zip控制面落到 NFS 并解压为 code snapshot

6.2 多版本 VERL 并存

约束前提:基础镜像保持同一个(生产环境容器由算力平台创建时已固定镜像标签)。

目标:在同一 Ray 集群内,不同 job 可以使用不同版本的 verl(例如不同分支/commit 或用户魔改版)。

已确认优先方案A必须通过 Ray Job 的 runtime_env.env_vars 透传 PYTHONPATH,让 job 粒度优先 import 指定代码快照。

建议方案(以 NFS 为中心,最小可行实现):

  • 在共享存储上以“不可变快照”的方式存放代码版本(推荐 commit hash 命名):
    • ${SHARED_ROOT}/common/code/verl/<commit>/...
    • ${SHARED_ROOT}/users/<user>/code/verl/<commit>/...(用户魔改版)
  • JobSpec 增加 code_path(指向上述目录),控制面在提交 job 时注入(必须走 runtime_env
    • runtime_env.env_vars.PYTHONPATH = "<code_path>:$PYTHONPATH"(把 code_path 放最前面,确保 import 优先级)

示例(概念性,实际以 ${SHARED_ROOT} 为准):

CODE_PATH="${SHARED_ROOT}/common/code/verl/<commit>"

ray job submit \
  --address="http://127.0.0.1:8265" \
  --submission-id="<submission_id>" \
  --runtime-env-json='{"env_vars": {"PYTHONPATH": "'"${CODE_PATH}"':$PYTHONPATH"}}' \
  -- \
  python3 -m verl.trainer.main_ppo ...

需要验证的关键点(作为 v3.1 的 DoD 之一):

  • 同时运行两个 job
    • jobA 使用 <commitA>jobB 使用 <commitB>
    • 互不影响,且各自训练/日志/ckpt 正常
  • job 粒度是否能做到“依赖隔离”(至少做到 verl 版本隔离;第三方依赖冲突可先假设镜像内一致)

备注:当前 v1 的做法是容器内全局 pip install -e /workspace/verl,这会让所有 job 默认使用同一份 verl。要实现多版本并存,必须让 job 的 import 优先使用 code_path(或为每个 job 单独创建 venv/安装 wheel后者更重建议后置

6.3 自定义 reward function

  • JobSpec 支持 reward_fn_pathPython 模块路径)
  • reward_fn_path 可指向共享存储中用户自定义代码目录(例如 ${SHARED_ROOT}/users/<user>/code/...
    • 约束:代码必须在 job runtime 中可 importworking_dir/PYTHONPATH 或 runtime_env 保障)
  • 控制面校验模块可导入basic lint/安全白名单可后置)

6.4 验收DoD

  • 同时运行两个 job使用不同的 verl 代码版本(或用户魔改版本),互不影响
  • 用户可在 JobSpec 中替换 reward function 并跑通一个最小训练闭环

7. MVP v4.0可观测性Prometheus/Grafana + W&B 集成)

目标:平台可运营:能回答“谁在用多少资源、跑了多久、利用率如何、是否空占 GPU”。

7.1 指标与监控

  • Ray 指标接入 Prometheus节点/任务/actor
  • GPU 指标nvidia exporter 或 DCGM exporter
  • DashboardGrafana至少 3 张核心面板)
    • 集群总 GPU/CPU 使用率、空闲率
    • 每 job 的 GPU 时间、峰值显存、运行时长
    • 节点健康(心跳/掉线)与告警

7.2 W&B或等价集成验证

  • 最小可行:单机 self-host W&B server 可用性验证
  • JobSpec 支持启用/关闭 W&B并传入 project/run name

7.3 验收DoD

  • Grafana 上能看到集群与 job 资源视图
  • 某个 job GPU 利用率异常(模拟)能触发告警规则(邮件/IM/日志即可)
  • W&B 指标能按 job 维度归档(至少 PPO 能上报)

8. MVP v4.1运维化SOP + 自动化运维接口)

目标:把平台变成“可交接”的系统:运维动作标准化,并为智能体留出接口。

8.1 SOP 与自动化入口

  • SOP 文档:
    • 节点上线/下线
    • 故障定位Ray session、Ray job、NCCL、OOM
    • 资源回收(停止 job、清理 ckpt
  • 自动化接口(最小):
    • /v1/ops/drain_node
    • /v1/ops/restart_ray_head(谨慎:需要保护与权限)
    • /v1/ops/cleanup_job_artifacts

8.2 验收DoD

  • 按 SOP非开发人员可完成一次“节点上线→跑任务→下线→清理”
  • 自动化接口至少能完成 1 个高频动作(如清理/停止/下线)

9. MVP v5.0Serving 与 Pipeline偏长期

目标:训练-部署一体化:支持 model serving并在平台内串联训练→评测→发布。

9.1 Serving

  • Ray Serve或等价部署模型推理服务
  • Serving 与训练共用模型库与权限(按 user/project

9.2 Pipeline草稿里标为高级

  • Pipeline 是对多个 job 的封装训练→merge→eval→publish
  • 可先实现最小 DAG两步串联作为验证

9.3 验收DoD

  • 训练产物一键发布为一个可访问的推理 endpoint
  • Pipeline 能自动串联并产出最终 artifact可回滚/可追踪)

10. 并行技术验证(建议尽早做)

这些属于“跨版本”风险项,建议在 v1.1 ~ v2.0 期间尽早做:

10.1 网络IB / RoCEv2

  • 确认环境是否支持 IBH100或 RoCEv2H20
  • 跑最小 NCCL 通信验证all-reduce / bandwidth
  • 将必要的 NCCL 环境变量注入到 job runtime_env

10.2 Ray + 多节点容器约束

  • 多容器同宿主机时的 Ray node_ip/临时目录冲突规律(已踩坑,需固化规范)
  • 端口范围与防火墙策略Ray worker 端口、dashboard、metrics

11. 已确认的约束与假设(来自讨论结论)

这些会直接影响 v2.1SSH 纳管)与后续多用户/存储设计:

  1. 最终形态仍以“每节点容器”运行(不是裸机 systemd
    • H20 开发环境:我们可在宿主机用 docker compose 自建容器,并通过 SSH 进入容器调试/纳管。
    • H100 生产环境:容器由算力平台创建/回收;平台侧控制面只能 SSH 进入这些容器 做纳管(执行 ray start/stop、注入 env 等)。
  2. 认证:内部 token 即可MVP 阶段不对接 SSO
  3. 存储:只考虑 NFS。
    • 开发环境NFS/共享目录可通过宿主机 bind mount 提供给容器。
    • 生产环境:所有容器挂载相同 NFS容器内共享根路径为 /private/(需要在实现时把“共享根路径”做成可配置项,而不是写死 /mnt/shared)。
  4. 网络拓扑约束:暂不做按 IB 域/机架/拓扑的强约束调度(第 10.1 仍需验证 IB/RoCE 是否可用与配置方式,但调度不引入拓扑维度)。
  5. 共享目录分层:在 users/<user>/... 之外增加一个可读写的 common/ 目录用于共享数据/模型/代码:
    • ${SHARED_ROOT}/common/datasets/
    • ${SHARED_ROOT}/common/models/
    • ${SHARED_ROOT}/common/code/
    • 权限MVP先默认“所有内部 token 用户可读写”,后续再细化只读/受控写。

12. 仍需你确认/讨论的问题(剩余不确定项)

  1. runtime_env.env_vars 注入对“子进程/训练框架内部启动进程”的覆盖范围是否足够?
    • 需要确认 verl/sglang 等子进程是否继承 driver 的环境变量(通常会继承,但建议在 v3.1 验收时明确验证)。