112 lines
6.4 KiB
Markdown
112 lines
6.4 KiB
Markdown
# 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 worker),head 不使用 nvidia runtime;worker0/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`,确保训练使用持久化缓存与数据路径。
|