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

121 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# MVP 计划V1
本文档目标:把当前“口述/实验记录”整理成**可复现、可验收**的 MVP 计划,并明确下一步最小闭环。
## 1. 背景与目标
我们要验证的最小闭环是:
1) 在“HeadCPU 容器)+ WorkerGPU 容器)”的 Ray Cluster 上,能够跑通一次 `verl` 的 PPO 训练。
2) 训练所需的 **数据集 / 模型缓存 / 训练产物checkpoint/ 日志** 不落在容器临时文件系统里,而是落在**共享存储NFS**,容器重启后可继续使用。
3) 所有步骤能写成一套**清晰命令/脚本**,新人可照着复现。
## 2. 环境与假设
- 机器H20 机器(具体规格由算力平台提供)
- 访问方式:通过 `ssh h1a` 远程登录(进入算力平台/宿主访问入口)
- 容器:算力平台可申请 CPU 容器(对外暴露端口)与若干 GPU 容器(可 SSH 互通)
- 共享存储:所有容器可挂载同一套 NFS`specs/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`