argus-cluster/specs/mvp/v1/mvp_plan.md

5.6 KiB
Raw Blame History

MVP 计划V1

本文档目标:把当前“口述/实验记录”整理成可复现、可验收的 MVP 计划,并明确下一步最小闭环。

1. 背景与目标

我们要验证的最小闭环是:

  1. 在“HeadCPU 容器)+ WorkerGPU 容器)”的 Ray Cluster 上,能够跑通一次 verl 的 PPO 训练。
  2. 训练所需的 数据集 / 模型缓存 / 训练产物checkpoint/ 日志 不落在容器临时文件系统里,而是落在共享存储NFS,容器重启后可继续使用。
  3. 所有步骤能写成一套清晰命令/脚本,新人可照着复现。

2. 环境与假设

  • 机器H20 机器(具体规格由算力平台提供)
  • 访问方式:通过 ssh h1a 远程登录(进入算力平台/宿主访问入口)
  • 容器:算力平台可申请 CPU 容器(对外暴露端口)与若干 GPU 容器(可 SSH 互通)
  • 共享存储:所有容器可挂载同一套 NFSspecs/hl_design_v2.md 中假设为 /mnt/shared

3. 已验证现状(现有实验)

目录 ray_in_docker/ 已经做过一次可运行的实验(偏“本地/示例级别”):

  • docker-compose 起了 2 个 verl 镜像容器:
    • verl-head:作为 Ray HeadDashboard 端口 8265
    • verl-worker:作为 Ray Worker
  • 在容器中执行:
    • 下载 GSM8K 数据集(examples/data_preprocess/gsm8k.py
    • 拉取 HuggingFace 模型(示例:Qwen/Qwen2.5-0.5B-Instruct
    • ray start --head + ray start --address=...
    • 通过 ray job submit ... python -m verl.trainer.main_ppo ... 提交 PPO 训练任务(见 ray_in_docker/ray_example/ppo_train.sh

结论:训练脚本可以跑通

4. 当前主要问题(从实验到平台化 MVP 的差距)

  1. 数据 / 模型 / 输出落在容器内:容器重启/替换后不可复用;也不利于多人共享与审计。
  2. 缓存路径不规范HuggingFace cache、Ray 临时目录、Hydra 输出目录等可能分散在容器默认路径。
  3. 可复现不足:缺少明确的目录规范、统一的启动/提交流程、验收口径。
  4. Ray 节点打标签/亲和性调度的方法未固化:需要明确是否统一用 ray start --resources,以及命名规范如何设计。

5. MVP V1最小闭环定义

specs/hl_design_v2.md 的方向为准,但 V1 只做最小可运行原型,暂不做完整 Web/调度系统。

5.1 目录规范(统一落到 NFS

约定所有容器统一挂载 NFS 到 /mnt/shared,并在其中固定目录结构:

  • /mnt/shared/code/:代码(可选:按版本/分支隔离)
  • /mnt/shared/datasets/:数据集(如 gsm8k/
  • /mnt/shared/hf/HuggingFace 缓存(设置 HF_HOME=/mnt/shared/hf
  • /mnt/shared/ray/Ray 运行期临时目录(可选:设置 RAY_TMPDIR=/mnt/shared/ray/tmp
  • /mnt/shared/outputs/训练输出根目录Hydra/日志/ckpt 统一落这里)
    • /mnt/shared/outputs/logs/<job_id>/
    • /mnt/shared/outputs/checkpoints/<job_id>/

5.2 最小集群形态

  • 1 个 HeadCPU 容器)
    • ray start --head --dashboard-host=0.0.0.0
    • 暴露 8265 给 Desktop/用户查看 Job 状态
  • 1~2 个 WorkerGPU 容器)
    • ray start --address=<head_ip>:6379 加入集群
    • (可选)通过 --resources='{\"gpu_pool_a\": 1}' 给节点打标签

5.3 最小训练任务

  • 目标任务:跑通一次 verl.trainer.main_ppo(以 GSM8K 为例)
  • 要求:
    • data.train_files / data.val_files 指向 /mnt/shared/datasets/...
    • HuggingFace 模型下载缓存落到 /mnt/shared/hf
    • 训练输出Hydra outputs、checkpoint、stdout/stderr落到 /mnt/shared/outputs/...

建议在提交命令里显式覆盖 Hydra 输出目录(示例,具体目录名按需调整):

  • hydra.run.dir=/mnt/shared/outputs/logs/${JOB_TAG}

6. 实施步骤Checklist

6.1 一次性准备

  • 确认所有容器已挂载 NFS 到同一路径:/mnt/shared
  • /mnt/shared/ 下创建目录:datasets/ hf/ outputs/ ray/
  • 在所有容器中设置/注入环境变量(推荐写入统一脚本):
    • HF_HOME=/mnt/shared/hf
    • HF_ENDPOINT=https://hf-mirror.com(如需)
    • RAY_TMPDIR=/mnt/shared/ray/tmp(可选)

6.2 启动集群Head + Worker

  • 在 Head 容器启动 Ray Head并记录 head_ip:6379
  • 在每个 Worker 容器执行 ray start --address=... 加入集群
  • 在 Head 上通过 ray status / Dashboard 验证节点已注册

6.3 准备数据与模型

  • 数据集下载到:/mnt/shared/datasets/gsm8k/
  • 模型缓存落到:/mnt/shared/hf/(拉取一次即可多任务复用)

6.4 提交训练任务

  • ray job submit --address=http://<head>:8265 ... 提交 PPO 训练
  • 训练日志与 checkpoint 在 /mnt/shared/outputs/ 可见

7. 验收标准V1

  • Ray Head/Worker 能稳定加入同一集群Dashboard 可见)
  • PPO 训练任务可提交并跑通(至少完成若干 step/epoch
  • 数据集、HF 缓存、训练输出均在 /mnt/shared/ 下可复用(容器重启后仍在)
  • 有一份“从零到跑通”的命令清单(或脚本)可复现

8. 未决问题(记录待补齐)

  • Ray 节点标签/亲和性调度:是否统一用 ray start --resources,以及命名规范如何设计
  • RL workload 的 Driver 放置策略:先按 verl 默认即可,后续再按 specs/hl_design_v2.md 收敛到“Driver-on-Head / Placement Group”等模式

9. 下一步(进入 V2

当 V1 达到“可复现 + 产物可落盘”的验收标准后,下一阶段工作见:specs/mvp_plan_v2.md