6.4 KiB
6.4 KiB
MVP V1 远程实验行动文档(待确认后执行)
1. 任务复述(我理解的需求)
你希望我在远程机器 argus@h1 上,进入目录 /home2/argus/infra/mvp,把 MVP V1 的“原本流程”手动完整跑一遍并验证。要求:
- 在宿主机上编写脚本,脚本通过
docker exec在容器内执行命令,负责协调启动顺序(先 head、后 worker)。 - 集群拓扑改为:
- 1 个 Ray Head:没有 GPU,并且 Head 的 Ray 资源
CPU=0(防止 Ray 把训练任务调度到 head)。 - 2 个 Ray Worker:各自 4 GPU(总 8 GPU)。
- 1 个 Ray Head:没有 GPU,并且 Head 的 Ray 资源
- PPO 训练需要“轻量化”,把
total_epochs改为1。 - 先在本地仓库
src/mvp/v1/写好脚本与 compose 文件;再拷贝到远程目录执行与验证。 - 在你确认这份行动文档没问题之前,我不执行远程操作。
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. 拷贝到远程(我执行前会再次征求你确认)
从本地(本机)同步到远程:
- 同步脚本与 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
verl/默认不需要同步(远程会 clone)。如果你更希望固定版本/避免网络波动,也可以手动同步:rsync -av --delete ./verl/ argus@h1:/home2/argus/infra/mvp/verl/
5. 远程执行步骤(在宿主机上)
在远程机器执行:
- 进入目录:
cd /home2/argus/infra/mvp
- 确保脚本可执行(首次同步后需要做一次):
chmod +x ./src/mvp/v1/scripts/*.sh
- 启动容器:
./src/mvp/v1/scripts/01_up.sh
- 安装 editable 版
verl(保证python -m verl...可用):./src/mvp/v1/scripts/10_install_verl_editable.sh
- 启动 Ray Head(禁止调度到 head):
./src/mvp/v1/scripts/20_start_head.sh
- 启动两个 Ray Worker 加入集群:
./src/mvp/v1/scripts/21_start_workers.sh
- 准备数据 + 预下载模型(落到
./shared):./src/mvp/v1/scripts/30_prepare_data_and_model.sh
- 提交 PPO(
total_epochs=1,必须用ray job submit在 head 提交;通过--entrypoint-resources强制 driver 调度到 worker):./src/mvp/v1/scripts/40_submit_ppo_epoch1.sh
- 观察状态:
./src/mvp/v1/scripts/50_status.sh- 打开 Ray Dashboard:
http://<h1宿主机IP>:8265
也可以一键跑:
./src/mvp/v1/scripts/run_all.sh
6. 验收与验证点(执行时我会逐项检查)
- Head 节点无 GPU:在 head 容器内
nvidia-smi应不可用或无设备(worker 内可见 4 张)。 - Head 的 Ray 逻辑资源为
CPU=0, GPU=0:head 不应承载训练任务调度资源(通过ray start --num-cpus=0 --num-gpus=0)。 - 集群节点数量正确:
ray status中应看到 1 head + 2 worker。 - 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)。 - PPO 训练只跑 1 个 epoch:提交参数包含
trainer.total_epochs=1。 - checkpoint 落盘:
/mnt/shared/jobs/<job_id>/checkpoints/有产物(脚本通过trainer.default_local_dir强制指向该目录;不设置trainer.default_hdfs_dir)。 - 数据与缓存落盘:
/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 个问题(你已确认,我按此执行)
verl/:脚本会在远程自动git clone https://github.com/volcengine/verl.git(如你希望固定版本,可改成同步或 checkout tag/commit)。- GPU:
0-7可用(worker0 用0-3,worker1 用4-7)。 - PPO:用满 8 GPU(
nnodes=2, n_gpus_per_node=4)。
9. 你新增的关键要求(我已纳入脚本)
- 数据与模型必须落在
/mnt/shared(由宿主机./sharedbind mount 提供),并且具备幂等:- 数据:如果
train.parquet/test.parquet已存在则跳过下载。 - 模型:优先检测本地 cache(
HF_HOME=/mnt/shared/hf);存在则跳过,否则才下载。
- 数据:如果
- 提交 job 时显式注入
HF_HOME/HUGGINGFACE_HUB_CACHE/TRANSFORMERS_CACHE,确保训练使用持久化缓存与数据路径。