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

112 lines
6.4 KiB
Markdown
Raw 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 远程实验行动文档(待确认后执行)
## 1. 任务复述(我理解的需求)
你希望我在远程机器 `argus@h1` 上,进入目录 `/home2/argus/infra/mvp`,把 MVP V1 的“原本流程”**手动完整跑一遍并验证**。要求:
1) 在宿主机上编写脚本,脚本通过 `docker exec` 在容器内执行命令,负责协调启动顺序(先 head、后 worker
2) 集群拓扑改为:
- 1 个 Ray Head**没有 GPU**,并且 Head 的 Ray 资源 `CPU=0`(防止 Ray 把训练任务调度到 head
- 2 个 Ray Worker各自 **4 GPU**(总 8 GPU
3) PPO 训练需要“轻量化”,把 `total_epochs` 改为 `1`
4) 先在本地仓库 `src/mvp/v1/` 写好脚本与 compose 文件;再拷贝到远程目录执行与验证。
5) 在你确认这份行动文档没问题之前,我**不执行**远程操作。
## 2. 本地已准备的文件(在本仓库内)
- `src/mvp/v1/docker-compose.yaml`3 容器head + 2 workerhead 不使用 nvidia runtimeworker0/1 各限制 4 GPU。
- `src/mvp/v1/scripts/`:宿主机脚本(内部全部用 `docker exec`
- `01_up.sh`:起容器
- `20_start_head.sh`:启动 Ray head`--num-cpus=0 --num-gpus=0`
- `21_start_workers.sh`:启动 Ray worker 加入集群
- `30_prepare_data_and_model.sh`:准备 GSM8K 数据与预下载模型
- `40_submit_ppo_epoch1.sh`:提交 PPO`trainer.total_epochs=1`,并设置 `nnodes=2, n_gpus_per_node=4`
- `run_all.sh`:按顺序一键执行
## 3. 远程环境前置条件(需要你确认/保证)
`argus@h1` 上:
- Docker 可用,且有 `docker compose` 插件Compose v2
- NVIDIA runtime 可用worker 容器需要 `runtime: nvidia`),宿主机有至少 8 张 GPU。
- 不强制要求提前准备 `./verl`:脚本会在宿主机侧检查 `${PWD}/verl`,如果不存在会自动执行:
- `git clone https://github.com/volcengine/verl.git`
此外本实验默认写入持久化目录:`/home2/argus/infra/mvp/shared`(会自动创建)。
## 4. 拷贝到远程(我执行前会再次征求你确认)
从本地(本机)同步到远程:
1) 同步脚本与 compose
- `rsync -av ./src/mvp/v1/ argus@h1:/home2/argus/infra/mvp/src/mvp/v1/`
- `rsync -av ./specs/mvp/v1_action.md argus@h1:/home2/argus/infra/mvp/specs/mvp/v1_action.md`
2) `verl/` 默认不需要同步(远程会 clone。如果你更希望固定版本/避免网络波动,也可以手动同步:
- `rsync -av --delete ./verl/ argus@h1:/home2/argus/infra/mvp/verl/`
## 5. 远程执行步骤(在宿主机上)
在远程机器执行:
1) 进入目录:
- `cd /home2/argus/infra/mvp`
2) 确保脚本可执行(首次同步后需要做一次):
- `chmod +x ./src/mvp/v1/scripts/*.sh`
3) 启动容器:
- `./src/mvp/v1/scripts/01_up.sh`
4) 安装 editable 版 `verl`(保证 `python -m verl...` 可用):
- `./src/mvp/v1/scripts/10_install_verl_editable.sh`
5) 启动 Ray Head禁止调度到 head
- `./src/mvp/v1/scripts/20_start_head.sh`
6) 启动两个 Ray Worker 加入集群:
- `./src/mvp/v1/scripts/21_start_workers.sh`
7) 准备数据 + 预下载模型(落到 `./shared`
- `./src/mvp/v1/scripts/30_prepare_data_and_model.sh`
8) 提交 PPO`total_epochs=1`,必须用 `ray job submit` 在 head 提交;通过 `--entrypoint-resources` 强制 driver 调度到 worker
- `./src/mvp/v1/scripts/40_submit_ppo_epoch1.sh`
9) 观察状态:
- `./src/mvp/v1/scripts/50_status.sh`
- 打开 Ray Dashboard`http://<h1宿主机IP>:8265`
也可以一键跑:
- `./src/mvp/v1/scripts/run_all.sh`
## 6. 验收与验证点(执行时我会逐项检查)
1) Head 节点无 GPU在 head 容器内 `nvidia-smi` 应不可用或无设备worker 内可见 4 张)。
2) Head 的 Ray 逻辑资源为 `CPU=0, GPU=0`head 不应承载训练任务调度资源(通过 `ray start --num-cpus=0 --num-gpus=0`)。
3) 集群节点数量正确:`ray status` 中应看到 1 head + 2 worker。
4) PPO driver 不在 head`ray job list` 里该 `submission_id``driver_info.node_ip_address` 应该是 worker 的 IP`172.19.0.3/172.19.0.4`),不能是 head`172.19.0.2`)。
5) PPO 训练只跑 1 个 epoch提交参数包含 `trainer.total_epochs=1`
6) checkpoint 落盘:`/mnt/shared/jobs/<job_id>/checkpoints/` 有产物(脚本通过 `trainer.default_local_dir` 强制指向该目录;不设置 `trainer.default_hdfs_dir`)。
7) 数据与缓存落盘:`/home2/argus/infra/mvp/shared/` 下出现 datasets/hf/jobs 等目录。
补充(磁盘保护):
- checkpoint 不要每步保存(会非常占空间);当前脚本默认 `trainer.save_freq=10`(每 10 step 保存一次)。
## 10. 目录命名约定submission id
- 脚本默认会显式指定 `ray job submit --submission-id=$SUBMISSION_ID`,并使用同一个值作为输出目录名:
- 输出目录:`/mnt/shared/jobs/$SUBMISSION_ID/`
- 你可以在提交时自定义 ID推荐这样便于检索
- `SUBMISSION_ID=my_run_20251219_001 ./src/mvp/v1/scripts/40_submit_ppo_epoch1.sh`
## 7. 风险点与兜底
- 如果 `runtime: nvidia` 在该环境不生效:需要改成 compose 的 `gpus:` 写法(我会按远程 docker 版本调整)。
- 如果 Ray Jobs 的 driver 必须在 head 启动Ray 机制如此):这不影响“训练任务不调度到 head”但 head 仍会有一个 job driver 进程。
- 如果 `verl` 在镜像内已安装但版本不匹配:脚本会优先 `pip install -e /workspace/verl` 以保证行为一致。
## 8. 你需要确认的 3 个问题(你已确认,我按此执行)
1) `verl/`:脚本会在远程自动 `git clone https://github.com/volcengine/verl.git`(如你希望固定版本,可改成同步或 checkout tag/commit
2) GPU`0-7` 可用worker0 用 `0-3`worker1 用 `4-7`)。
3) PPO用满 8 GPU`nnodes=2, n_gpus_per_node=4`)。
## 9. 你新增的关键要求(我已纳入脚本)
- 数据与模型必须落在 `/mnt/shared`(由宿主机 `./shared` bind mount 提供),并且具备**幂等**
- 数据:如果 `train.parquet/test.parquet` 已存在则跳过下载。
- 模型:优先检测本地 cache`HF_HOME=/mnt/shared/hf`);存在则跳过,否则才下载。
- 提交 job 时显式注入 `HF_HOME/HUGGINGFACE_HUB_CACHE/TRANSFORMERS_CACHE`,确保训练使用持久化缓存与数据路径。