# MVP v3.6 迭代研发总结(基于 v3.5) > 时间基线:2026-01(H20 dev 环境:`argus@h1:/home2/argus/infra/mvp`) > v3.6 架构草图:`specs/mvp/v3.6/Snipaste_2026-01-05_10-56-34.png` ## 1. 迭代目标回顾 v3.6 在 v3.5(WebUI + API server + Ray stateless node pool + SFTPGo + Advanced TaskSpec)基础上,新增两块能力: 1) **Weights & Biases(W&B)local server 集成** - 训练任务(PPO/GRPO/SFT)默认可写入 W&B。 - 采用“共享 W&B 账号 + 按用户拆分 project(`_project`)”的隔离策略。 2) **New Task 增加 Evaluation 示例** - New Task 页面新增一个最小可用的 evaluation 模板(以 Advanced command 方式运行 `verl.trainer.main_eval`)。 ## 2. 交付内容(代码/配置/脚本) ### 2.1 部署形态(docker compose) v3.6 在 `src/mvp/docker-compose.yaml` 新增 W&B 服务: - 服务名:`wandb`(容器名:`argus-wandb`) - 宿主机端口:`8090:8080` - 持久化:`../../shared/common/wandb:/vol` - 同 network:`argus-ray-net`(便于 Ray 容器内访问) ### 2.2 平台配置(YAML) 在 `src/mvp/configs/dev.yaml` 增加/启用 W&B 配置: ```yaml tracking: wandb: enabled: true base_url: "http://172.22.0.1:8090" api_key_env: "WANDB_API_KEY" project_suffix: "_project" ``` 说明: - `base_url` 采用 docker bridge 网关 + 宿主机映射端口的方式,规避容器内 DNS 偶发解析失败问题。 - 不在 config 中写明文 key,统一通过启动 API server 时注入 `WANDB_API_KEY`。 ### 2.3 Ray Job runtime_env 注入(核心) v3.6 在**每个 Ray job attempt**提交时注入两类环境变量: 1) **始终注入(无论是否启用 W&B)**:便于 Advanced command 在不改模板的情况下能运行 - `MVP_TRAINER_LOGGER`:`console` 或 `[console,wandb]` - `MVP_WANDB_PROJECT`:`_project`(例如 `alice_project`) - `MVP_WANDB_RUN`:``(每次 attempt 唯一) 2) **当 W&B 有效启用时注入** - `WANDB_BASE_URL` - `WANDB_API_KEY` - `WANDB_MODE=online` - `WANDB_DIR=/wandb`(例如 `/private/users/alice/jobs//wandb`) 降级策略: - 当 `tracking.wandb.enabled=true` 但缺少 `WANDB_API_KEY` 时,平台会**降级为 console**(并在 attempt.message 中记录 warning),避免训练失败。 ### 2.4 WebUI 变更 1) **Login 页面** - 增加 “Open W&B” 跳转(指向 `tracking.wandb.base_url`) 2) **New Task 页面** - 新增 **Evaluation example** - Advanced example 更新为 v3.6: - `command: |` 内不再包含任何注释(避免 YAML/命令解析报错) - W&B 参数不再让用户手填,改为引用平台注入的 `${MVP_*}` env: - `trainer.logger=${MVP_TRAINER_LOGGER}` - `trainer.project_name=${MVP_WANDB_PROJECT}` - `trainer.experiment_name=${MVP_WANDB_RUN}` > 备注:driver 日志里会打印 `MVP_DRIVER_EXEC: bash -lc '...'`,此处看到 `${MVP_*}` 仍是“未替换”的字符串是正常现象;变量替换发生在 `bash` 执行阶段,而不是打印 argv 阶段。 ### 2.5 启动脚本 `src/mvp/scripts/60_start_api.sh` 支持将宿主机的 `WANDB_API_KEY` 透传进 head 容器内启动的 API server: - 宿主机设置:`export WANDB_API_KEY=...` - 启动 API:脚本会 `docker exec -e WANDB_API_KEY=...` 进入 head 容器启动 `python3 /workspace/mvp/py/server.py` ## 3. 用户侧操作流程(v3.6) ### 3.1 一次性初始化(只在首次启用/清空 /vol 时需要) 1) 打开 W&B UI:`http://:8090` 2) 在 System Admin 页面粘贴 license 完成初始化 3) 生成并记录 `WANDB_API_KEY`(local key) 4) 以后启动 API server 时注入该 key(`WANDB_API_KEY=...`) 只要保留 `shared/common/wandb`(即 `/vol` 持久化目录),重建容器无需再次进入 8090 配置。 ### 3.2 日常使用 1) WebUI 登录:`http://:8080/ui/login`(输入 user token) 2) New Task 提交任务:`http://:8080/ui/tasks/new` 3) 到 Tasks 查看状态/日志:`/ui/tasks` 与 task detail 4) 打开 W&B:`http://:8090`,在 `_project` 下查看 runs/metrics ## 4. 验收结果(本迭代应达成) 1) PPO/GRPO/SFT 任一任务运行后: - W&B local server 可见对应 project(如 `alice_project`) - run name 与 `ray_submission_id` 对齐(便于追踪每次 attempt) 2) Evaluation 示例: - 可作为 Advanced 任务提交并在 Ray 上执行 `verl.trainer.main_eval` - 支持用户在 command 内自行加入 reward overrides(平台不做封装) ## 5. 已知限制与后续建议 1) **W&B 初始化自动化** - 当前:首次仍需在 8090 页面粘贴 license、生成 key(更稳、侵入最小)。 - 若需要“从零部署也完全免页面操作”,可进一步调研 W&B local 的可用管理 API/启动参数(自动注入 license + 自动创建 key)。 2) **Advanced command 的自由度** - 平台只负责: - `$HOME` 宏替换 - runtime_env env_vars 注入 - 任务队列与 Ray job 提交 - command 的语义正确性仍由用户负责(例如 PPO 必需的 micro batch 等参数)。