5.6 KiB
5.6 KiB
MVP 计划(V1)
本文档目标:把当前“口述/实验记录”整理成可复现、可验收的 MVP 计划,并明确下一步最小闭环。
1. 背景与目标
我们要验证的最小闭环是:
- 在“Head(CPU 容器)+ Worker(GPU 容器)”的 Ray Cluster 上,能够跑通一次
verl的 PPO 训练。 - 训练所需的 数据集 / 模型缓存 / 训练产物(checkpoint)/ 日志 不落在容器临时文件系统里,而是落在共享存储(NFS),容器重启后可继续使用。
- 所有步骤能写成一套清晰命令/脚本,新人可照着复现。
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 Head(Dashboard 端口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)
- 下载 GSM8K 数据集(
结论:训练脚本可以跑通。
4. 当前主要问题(从实验到平台化 MVP 的差距)
- 数据 / 模型 / 输出落在容器内:容器重启/替换后不可复用;也不利于多人共享与审计。
- 缓存路径不规范:HuggingFace cache、Ray 临时目录、Hydra 输出目录等可能分散在容器默认路径。
- 可复现不足:缺少明确的目录规范、统一的启动/提交流程、验收口径。
- 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 个 Head(CPU 容器)
- 跑
ray start --head --dashboard-host=0.0.0.0 - 暴露
8265给 Desktop/用户查看 Job 状态
- 跑
- 1~2 个 Worker(GPU 容器)
- 跑
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/hfHF_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。