argus-cluster/specs/mvp/v3.6/v3.6_design.md

281 lines
12 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 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 & BiasesW&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/<user_id>/jobs/<ray_submission_id>/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 = <user_id> + project_suffix`
- 示例:`alice_project`
- 每个 Ray job attempt 对应一个 run
- `experiment_name = <ray_submission_id>`(保证 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/<user_id>/jobs/<ray_submission_id>/wandb`(保证每个 job 的本地 run 文件落到对应 job 目录;便于随 job 一起被 janitor 清理)
> 对 Advanced TaskSpec平台无法替用户改 command但仍可注入上述 env让用户在 command 中自行启用 wandb。
### 2.4 verL 训练任务自动开启 wandb logger
对平台内置 workloadPPO/GRPO/SFT平台将 hydra overrides 改为:
- `trainer.logger=[console,wandb]`(替代 v3.5 的 `trainer.logger=console`
- `trainer.project_name=<user_id>_project`
- `trainer.experiment_name=<ray_submission_id>`
- 可选:如果配置了 `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”
建议在 DBsqlite里新增 attempt 级字段(或 metadata JSON
- `wandb_project`:如 `alice_project`
- `wandb_run_name`:如 `<ray_submission_id>`
- `wandb_base_url`:如 `http://<host>:8090`
- `wandb_url`:拼出来的最终链接(若 W&B local 的 URL 结构不稳定,可只存前 3 项,由前端拼接)
API 侧在:
- `GET /api/v2/tasks/<task_id>``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 会默认多一个 loggerwandb并对外发起 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 命名:`<user_id>_project`(不使用 `WANDB_ENTITY`
- Evaluation先只提供 **Advanced 模板**New Task 页面提供示例即可)
---
## 7. 运维与验收流程dev/h1
### 7.1 启动服务docker compose
1) 启动/重启 composeRay head/worker + SFTPGo + W&B
```bash
cd /home2/argus/infra/mvp/src/mvp
docker compose up -d
```
2) 访问 UI
- MVP WebUI`http://<HOST>:8080/ui`
- Ray Dashboard`http://<HOST>:8265`
- SFTPGo Web`http://<HOST>:8081/web/`
- W&B Web`http://<HOST>:8090`
> W&B 容器数据目录已挂载到共享盘:`/private/common/wandb`(容器内 `/vol`)。
### 7.2 初始化 W&B管理员一次性操作
1) 打开 `http://<HOST>: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 为 `<user_id>_project`(如 `alice_project`
- run name 为该 attempt 的 `ray_submission_id`
3) 提交 Evaluation 模板Advanced能在 Ray 上运行并输出评估结果stdout / logs