# MVP v3.6 详细设计方案(基于 v3.5) > 设计基线:当前线上已具备 v3.5 能力(PPO/GRPO/SFT + Advanced TaskSpec + SFTPGo 数据管理 + WebUI)。 > v3.6 的架构草图见:`specs/mvp/v3.6/Snipaste_2026-01-05_10-56-34.png` ## 0. 目标与范围 ### 0.1 v3.6 目标 1) **Weights & Biases(W&B)集成** - 训练/任务运行时自动打点到 W&B local server。 - 采用“共享 W&B 账号(license 只支持 1 user) + 为每个 MVP 用户创建独立 project”的方式隔离可视化与检索体验。 - 平台提供 W&B 的跳转链接、以及每个 task 对应 run 的可定位信息(最小闭环)。 2) **New Task 增加 Evaluation 模板** - 在 New Task 页面提供一个最小可用的 “Evaluation” 任务模板(用于离线评估/打分),并能把结果落到 job 输出与(可选)W&B。 ### 0.2 非目标(v3.6 不做) - 不引入新的 node management 机制;保持 v3.5 的 head discovery + worker watchdog stateless pool。 - 不做 Serving/IB/RDMA/断点续训/多版本 verl code_path 等(仍按 v3.5 的范围)。 - 不做多租户安全隔离(W&B API Key 注入属于内部可信环境)。 --- ## 1. W&B local server(部署与连通) > 资料参考:`specs/mvp/v3.6/wandb.md`。**文档中 license/token 属敏感信息,v3.6 设计不在代码/文档里写死。** ### 1.1 部署方式(dev/h1) 建议在 `src/mvp/docker-compose.yaml` 新增 `wandb` 服务(与现有 ray_head / sftpgo 同一 compose network): - 镜像:`wandb/local:latest` - 容器端口:`8080` - 宿主机端口:建议 `8090:8080`(避免和 MVP API `8080`、SFTPGo `8081` 冲突) - 持久化:挂载到 NFS/共享目录(例如 `/private/common/wandb`)以持久化 runs/artifacts - 首次启动后由管理员在 W&B System Admin 页面粘贴 license(见 `wandb.md`) ### 1.1.1 持久化策略(必须) v3.6 约定 **W&B server 的元数据必须持久化**(否则会丢 license/账号/API key、历史 runs/project 索引等): - W&B server 数据目录(`/vol`)挂载到共享目录(NFS):例如 `/private/common/wandb:/vol` - 这部分数据由平台/管理员长期保留(不跟随单个 job 清理) 与之相对,**每个 Ray job 对应的本地 W&B run 文件**放在 job 目录下(见 §2.3 的 `WANDB_DIR`),并由现有 janitor 随 job 一起清理: - `WANDB_DIR=/private/users//jobs//wandb` - janitor 对 job 的策略是“结束后 3 天移入回收站、7 天后删除”,因此该目录会被一并处理 > 说明:W&B 的最终“事实数据”在 server 侧持久化(runs/metrics/可视化);job 目录下的 `WANDB_DIR` 更像运行期缓存/临时文件与调试材料。 ### 1.2 容器内访问 W&B 的 base_url 在 v3.5 经验中,Ray head 容器对 docker 内部 DNS 名称解析不稳定(`Temporary failure in name resolution`)。 为避免再次踩坑,v3.6 统一采用 **“docker bridge 网关 + host 映射端口”** 的方式让容器访问 W&B: - `WANDB_BASE_URL=http://172.22.0.1:8090`(其中 `172.22.0.1` 为 `mvp_argus-ray-net` 网关) > 注意:如果未来 dev 环境 network 网段变化,需要把网关地址做成配置项(见 §2)。 --- ## 2. 平台侧 W&B 集成(API/Scheduler/Ray Job runtime_env) ### 2.1 配置设计(YAML) 在 `configs/dev.yaml`(以及生产配置)中新增一段 W&B 配置,建议结构: ```yaml tracking: wandb: enabled: true base_url: "http://172.22.0.1:8090" api_key_env: "WANDB_API_KEY" entity: "" # 可选;verL 通过 env WANDB_ENTITY 读取 project_suffix: "_project" # 例如 alice_project # 可选:代理(verL 支持 trainer.wandb_proxy) proxy: null ``` 平台读取 `api_key_env` 对应的环境变量,并在 job 维度注入 `WANDB_API_KEY`。 **不在配置文件中存明文 API KEY**(避免泄露)。 ### 2.2 项目/命名规范(共享账号 + user project) 由于 W&B local license 限制 “最多 1 user”,v3.6 采用: - **同一个 W&B 账号**(同一个 `WANDB_API_KEY`) - 每个 MVP user 使用不同 project: - `project_name = + project_suffix` - 示例:`alice_project` - 每个 Ray job attempt 对应一个 run: - `experiment_name = `(保证 attempt 唯一;也便于从 dashboard 反查) verL 内部 `wandb.init(project=project_name, name=experiment_name, entity=$WANDB_ENTITY)`(见 `verl/utils/tracking.py`)。 ### 2.3 Ray Job 注入(runtime_env env_vars) 当 `tracking.wandb.enabled=true` 时,在 scheduler 提交 ray job 时,统一注入: - `WANDB_BASE_URL`(来自配置) - `WANDB_API_KEY`(来自 env `tracking.wandb.api_key_env`) - `WANDB_ENTITY`(可选) - `WANDB_MODE=online`(默认在线;可在 dev/离线时切换) - `WANDB_DIR=/private/users//jobs//wandb`(保证每个 job 的本地 run 文件落到对应 job 目录;便于随 job 一起被 janitor 清理) > 对 Advanced TaskSpec:平台无法替用户改 command,但仍可注入上述 env,让用户在 command 中自行启用 wandb。 ### 2.4 verL 训练任务自动开启 wandb logger 对平台内置 workload(PPO/GRPO/SFT),平台将 hydra overrides 改为: - `trainer.logger=[console,wandb]`(替代 v3.5 的 `trainer.logger=console`) - `trainer.project_name=_project` - `trainer.experiment_name=` - 可选:如果配置了 `tracking.wandb.proxy`,注入 `trainer.wandb_proxy=...` 兼容性说明: - `trainer.logger` 在 verL 的 ppo/sft config 中本身是 list(示例为 `["console","wandb"]`),因此不会破坏 verL 配置解析。 - 现有 v3.5 的 checkpoint/log dir 仍按 job_dir 注入,不依赖 `trainer.default_local_dir`。 ### 2.5 数据库存储与 API 输出(最小闭环) v3.6 需要让用户能在 WebUI/Task 详情中 “点一下跳转到 W&B”: 建议在 DB(sqlite)里新增 attempt 级字段(或 metadata JSON): - `wandb_project`:如 `alice_project` - `wandb_run_name`:如 `` - `wandb_base_url`:如 `http://:8090` - `wandb_url`:拼出来的最终链接(若 W&B local 的 URL 结构不稳定,可只存前 3 项,由前端拼接) API 侧在: - `GET /api/v2/tasks/` 的 `latest_attempt` 增加 `wandb` 字段(或顶层增加 `tracking` 字段) - `GET /api/v2/me` 增加 `wandb` 信息(base_url、project_name),便于页面展示 “Open W&B” > W&B local 的 URL 路径结构需要在接入时确认;若不确定,先只提供 base_url + project/run 名称,用户可在 W&B UI 搜索。 --- ## 3. WebUI 变更(v3.6) ### 3.1 Data / Login 页 - 在 Data 或 Login 页新增: - “Open W&B” 链接(跳转到 `tracking.wandb.base_url` 的 Web UI) - 展示当前用户的 project 名称(例如 `alice_project`),并提供 Copy 按钮 ### 3.2 Tasks / Task Detail - Task list 无需大改;Task detail 页面增加: - W&B run 信息(project / run name / link) - 若任务失败,W&B 仍可用于查看已上报的中间日志(对训练类任务有价值) ### 3.3 New Task 增加 Evaluation 模板 New Task 页面新增一个 “Evaluation example”: #### 方案 A(推荐,最小改动):作为 Advanced TaskSpec 模板 - 直接提供 `kind: advanced` 的模板,command 运行 verL 自带评估入口: - `python3 -m verl.trainer.main_eval data.path=... custom_reward_function.path=... +ray_kwargs.ray_init.address=auto` - 优点:不需要扩展 TaskSpec schema / scheduler 逻辑 - 缺点:Evaluation 在平台侧不可结构化(仍属于 advanced) #### 方案 B(更产品化):新增内置 workload: evaluation(后续可选) 若希望在任务分类/队列中把 evaluation 作为一类“内置任务”,可新增: ```yaml workload: evaluation code_path: /private/common/code/verl/verl_repo nnodes: 1 n_gpus_per_node: 0 data_path: $HOME/common/datasets/<...>.parquet response_key: responses data_source_key: data_source reward_model_key: reward_model custom_reward_path: $HOME/code/reward.py # 可选 custom_reward_name: compute_score # 可选 ``` 平台把它编译成 `verl.trainer.main_eval` 的 hydra overrides + ray init address;并可选择把结果解析后上报 W&B。 v3.6 建议先落地 **方案 A**(模板即可),方案 B 作为 v3.7+ 的演进。 --- ## 4. 验收标准(v3.6) ### 4.1 W&B(训练任务) - 提交 PPO/GRPO/SFT 任一任务: - W&B local server 能看到对应 project(如 `alice_project`) - 能看到 run 名称为该任务 attempt 的 `ray_submission_id` - run 内能持续刷新 metrics(至少包含 loss/step 等 verL 默认上报) - WebUI: - 能打开 W&B UI 链接 - Task detail 能展示 project/run(或至少可检索信息) ### 4.2 Evaluation 模板 - New Task 中出现 “Evaluation example” - 复制模板提交后: - 任务能在 Ray 上运行(CPU 即可,`+ray_kwargs.ray_init.address=auto` 连接集群) - 输出 metrics(`main_eval.py` 默认 print dict) - (可选)若用户在 command 里启用 wandb,则能在对应 project 下看到评估 run --- ## 5. 兼容性影响评估 - 对现有 v3.5 功能: - 默认行为改变:PPO/GRPO/SFT 会默认多一个 logger(wandb),并对外发起 HTTP 请求到 W&B server。 - 若 W&B server 不可用/配置缺失: - 建议行为:平台自动降级为 `trainer.logger=[console]` 并在 task 状态中给出 warning(避免训练直接失败)。 - 初版也可选择 fail-fast:缺少 `WANDB_API_KEY` 时拒绝开启 wandb(由配置开关控制)。 - 对资源/存储: - W&B server 自身会写入一定量数据(license 限制 10GB);需配合 retention 策略做清理(v3.6 先手动,后续可自动)。 - job 目录下的 `WANDB_DIR` 会随 jobs retention 被清理;不会无限增长。 --- ## 6. 已确认的落地约定 - W&B server 对外端口:`8090` - Project 命名:`_project`(不使用 `WANDB_ENTITY`) - Evaluation:先只提供 **Advanced 模板**(New Task 页面提供示例即可) --- ## 7. 运维与验收流程(dev/h1) ### 7.1 启动服务(docker compose) 1) 启动/重启 compose(Ray head/worker + SFTPGo + W&B): ```bash cd /home2/argus/infra/mvp/src/mvp docker compose up -d ``` 2) 访问 UI: - MVP WebUI:`http://:8080/ui` - Ray Dashboard:`http://:8265` - SFTPGo Web:`http://:8081/web/` - W&B Web:`http://:8090` > W&B 容器数据目录已挂载到共享盘:`/private/common/wandb`(容器内 `/vol`)。 ### 7.2 初始化 W&B(管理员一次性操作) 1) 打开 `http://:8090/system-admin` 粘贴 license(详见 `specs/mvp/v3.6/wandb.md`)。 2) 进入 W&B UI 创建/登录到共享账号(license 只支持 1 user)。 3) 在 W&B UI 的用户设置页面生成 API Key(通常位于 “User Settings / API Keys”)。 ### 7.3 启动 API server(需要注入 WANDB_API_KEY) 平台不会把 `WANDB_API_KEY` 写入配置文件;必须在启动 API server 时通过环境变量提供。 示例(在宿主机): ```bash export MVP_INTERNAL_TOKEN="my-dev-token" export WANDB_API_KEY="...从 W&B UI 复制..." cd /home2/argus/infra/mvp/src/mvp/scripts ./60_start_api.sh ``` > 说明:`./60_start_api.sh` 会把 `WANDB_API_KEY` 透传给 head 容器内运行的 API server。 ### 7.4 验收(最小闭环) 1) 在 WebUI Login 页面能看到 W&B 区块(Open W&B + project copy)。 2) 提交一个 PPO/GRPO/SFT 任务(任意一个即可): - W&B project 为 `_project`(如 `alice_project`) - run name 为该 attempt 的 `ray_submission_id` 3) 提交 Evaluation 模板(Advanced)能在 Ray 上运行并输出评估结果(stdout / logs)。