feat: 添加平台管理、计算模块适配器及前端页面更新
- 新增 platform API 端点和存储 - 新增 llama_factory 适配器 - 新增前端 compute、guide、system 等视图页面 - 新增 echarts 插件和 mock 数据 - 更新 Docker 配置、后端配置及文档 - 更新前端路由、API、侧边栏等组件 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -868,8 +868,8 @@ page=1&page_size=20&keyword=xxx&sort=-created_at
|
||||
"id": "uuid",
|
||||
"code": "gpu-node-01",
|
||||
"name": "A800 Node 01",
|
||||
"api_base_url": "http://10.10.20.31:9100",
|
||||
"file_gateway_url": "http://10.10.20.31:9101",
|
||||
"api_base_url": "http://10.10.20.31:19100",
|
||||
"file_gateway_url": "http://10.10.20.31:19101",
|
||||
"enabled": true,
|
||||
"scheduler_status": "online",
|
||||
"scheduler_weight": 100,
|
||||
|
||||
@@ -1,545 +0,0 @@
|
||||
# Demo 开发计划
|
||||
|
||||
本文档用于指导后续开发一个可演示的模型微调平台 Demo。Demo 不是纯前端展示,而是包含前端、FastAPI 后端、PostgreSQL、算力服务、GPU 状态、LLaMA-Factory 适配器和训练任务主链路的工程化演示版本。
|
||||
|
||||
## 1. Demo 目标
|
||||
|
||||
Demo 目标是在没有完整生产环境的条件下,跑通一条可信的模型微调平台主链路:
|
||||
|
||||
```text
|
||||
登录
|
||||
-> 数据集管理
|
||||
-> 模型管理
|
||||
-> 创建微调任务
|
||||
-> 自动/手动选择算力节点
|
||||
-> 检查模型/数据集资源副本
|
||||
-> 缺失资源则同步到目标节点
|
||||
-> 启动训练任务
|
||||
-> 查看 GPU 占用、训练日志、loss 曲线、checkpoint
|
||||
-> 训练完成后登记训练产物
|
||||
-> 可进入评测/推理演示
|
||||
```
|
||||
|
||||
Demo 支持两种算力运行模式:
|
||||
|
||||
| 模式 | 说明 | 适用场景 |
|
||||
| --- | --- | --- |
|
||||
| `simulator` | 模拟 GPU、训练进程、训练日志、loss、checkpoint | 无 GPU、无 LLaMA-Factory 环境 |
|
||||
| `real` | 调用 `nvidia-smi` 和 LLaMA-Factory 启动真实训练 | 有 GPU 和训练环境 |
|
||||
|
||||
第一版优先实现 `simulator`,同时保留 `real` 模式接口和适配器边界。
|
||||
|
||||
## 2. 技术范围
|
||||
|
||||
### 2.1 前端
|
||||
|
||||
基于现有 `frontend/` 页面开发,逐步从 Mock 切换到 Demo 后端接口。
|
||||
|
||||
优先联调页面:
|
||||
|
||||
- `/login`
|
||||
- `/dashboard`
|
||||
- `/dataset`
|
||||
- `/dataset/create`
|
||||
- `/dataset/:id/preview`
|
||||
- `/model-manage`
|
||||
- `/model-manage/create`
|
||||
- `/fine-tune`
|
||||
- `/fine-tune/create`
|
||||
- `/training-log/:id`
|
||||
- `/compute`
|
||||
- `/compute/gpus`
|
||||
- `/compute/queue`
|
||||
- `/compute/nodes`
|
||||
|
||||
### 2.2 后端
|
||||
|
||||
基于 `backend/` FastAPI 工程实现 Demo API:
|
||||
|
||||
- 用户登录和当前用户。
|
||||
- 数据集、模型、训练任务。
|
||||
- 算力节点、GPU、队列。
|
||||
- 资源副本和同步任务。
|
||||
- 训练日志、指标、checkpoint。
|
||||
- 审计日志最小记录。
|
||||
|
||||
### 2.3 数据库
|
||||
|
||||
开发阶段使用项目自带 PostgreSQL。Demo 使用 `docs/postgres-schema.sql` 的核心子集,并通过 seed 数据初始化演示数据。
|
||||
|
||||
### 2.4 算力服务
|
||||
|
||||
基于 `compute/` 开发内部 Compute API:
|
||||
|
||||
- `simulator` 模式:模拟 GPU 与训练生命周期。
|
||||
- `real` 模式:预留真实 GPU 和 LLaMA-Factory 调用。
|
||||
|
||||
每个算力节点仍按“单机多 GPU 节点”设计。多节点 Demo 可以通过多条 `compute_nodes` 记录模拟,也可以在多台机器上分别部署 `docker/compute`。
|
||||
|
||||
## 3. 模块开发清单
|
||||
|
||||
### 3.1 后端基础模块
|
||||
|
||||
目录建议:
|
||||
|
||||
```text
|
||||
backend/app/modules/
|
||||
auth/
|
||||
dataset/
|
||||
model/
|
||||
fine_tune/
|
||||
compute_gateway/
|
||||
audit/
|
||||
```
|
||||
|
||||
接口:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| POST | `/api/login` | 登录,Demo 可使用固定账号 |
|
||||
| GET | `/api/me` | 当前用户 |
|
||||
| GET | `/api/dashboard/overview` | Demo 看板 |
|
||||
| GET | `/api/health` | 应用健康检查 |
|
||||
|
||||
验收:
|
||||
|
||||
- 能通过前端登录。
|
||||
- 能返回菜单权限。
|
||||
- 前端退出后可重新登录。
|
||||
|
||||
### 3.2 数据集 Demo
|
||||
|
||||
接口:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| GET | `/api/dataset-manage` | 数据集列表 |
|
||||
| POST | `/api/dataset-manage` | 创建数据集 |
|
||||
| GET | `/api/dataset-manage/{id}` | 数据集详情 |
|
||||
| POST | `/api/dataset-manage/upload/{dataset_id}` | 上传或模拟上传文件 |
|
||||
| GET | `/api/dataset-manage/preview/{file_id}` | 文件预览 |
|
||||
| GET | `/api/dataset-manage/versions/{file_id}` | 文件版本 |
|
||||
|
||||
Demo 行为:
|
||||
|
||||
- 创建数据集后写入 PostgreSQL。
|
||||
- 文件内容可以存本地 demo 目录或数据库小样本字段。
|
||||
- 预览支持 JSONL 和文本。
|
||||
- 数据集创建后生成一条 `storage_objects` 记录。
|
||||
|
||||
### 3.3 模型 Demo
|
||||
|
||||
接口:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| GET | `/api/model-manage` | 模型列表 |
|
||||
| POST | `/api/model-manage` | 新增模型 |
|
||||
| GET | `/api/model-manage/{id}` | 模型详情 |
|
||||
| GET | `/api/model-manage/local-models` | 本地模型路径列表 |
|
||||
| GET | `/api/model-manage/trained-models` | 训练产物列表 |
|
||||
| POST | `/api/model-manage/merge` | 模拟权重合并任务 |
|
||||
|
||||
Demo 行为:
|
||||
|
||||
- 新增本地模型时登记路径,不要求真实权重存在。
|
||||
- 训练完成后自动生成 `trained_models` 记录。
|
||||
- 权重合并可创建一个 `compute_jobs` 模拟任务。
|
||||
|
||||
### 3.4 算力节点与 GPU Demo
|
||||
|
||||
接口:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| GET | `/api/compute/nodes` | 算力节点列表 |
|
||||
| POST | `/api/compute/nodes` | 新增节点 |
|
||||
| PUT | `/api/compute/nodes/{id}` | 编辑节点 |
|
||||
| POST | `/api/compute/nodes/{id}/test-connection` | 测试连接 |
|
||||
| POST | `/api/compute/nodes/{id}/enable` | 启用 |
|
||||
| POST | `/api/compute/nodes/{id}/disable` | 禁用 |
|
||||
| POST | `/api/compute/nodes/{id}/drain` | 维护模式 |
|
||||
| GET | `/api/compute/gpus` | GPU 状态 |
|
||||
| GET | `/api/compute/queue` | 队列 |
|
||||
|
||||
Demo 行为:
|
||||
|
||||
- 默认 seed 两个算力节点:
|
||||
- `gpu-node-01`,4 张模拟 GPU。
|
||||
- `gpu-node-02`,4 张模拟 GPU。
|
||||
- 支持节点标签:`A800`、`4090`、`80GB`、`llama_factory`。
|
||||
- 支持节点状态:`online`、`offline`、`draining`、`maintenance`。
|
||||
- GPU 状态随训练任务变化:`idle -> reserved -> running -> idle`。
|
||||
|
||||
### 3.5 资源副本与同步 Demo
|
||||
|
||||
接口:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| GET | `/api/compute/nodes/{id}/replicas` | 节点资源副本 |
|
||||
| POST | `/api/internal/compute-sync/resources` | 创建资源同步任务 |
|
||||
| GET | `/api/internal/compute-sync/resources/{id}` | 同步任务详情 |
|
||||
|
||||
Demo 行为:
|
||||
|
||||
- 训练任务启动前检查目标节点是否已有模型和数据集副本。
|
||||
- 如果缺失,创建 `resource_sync_jobs`。
|
||||
- 同步任务状态模拟:`pending -> running -> completed`。
|
||||
- 同步完成后写入 `resource_replicas`。
|
||||
- Demo 不需要真实复制大文件,可以创建本地占位文件或只写元数据。
|
||||
|
||||
### 3.6 微调任务 Demo
|
||||
|
||||
接口:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| GET | `/api/fine-tune` | 训练任务列表 |
|
||||
| POST | `/api/fine-tune` | 创建训练任务 |
|
||||
| POST | `/api/fine-tune/start` | 启动训练任务 |
|
||||
| GET | `/api/fine-tune/{id}` | 任务详情 |
|
||||
| GET | `/api/fine-tune/{id}/overview` | 训练概览 |
|
||||
| GET | `/api/fine-tune/{id}/events` | 训练事件 |
|
||||
| POST | `/api/fine-tune/{id}/stop` | 停止任务 |
|
||||
| POST | `/api/fine-tune/{id}/retry` | 重试任务 |
|
||||
| GET | `/api/fine-tune/{id}/checkpoints` | checkpoint 列表 |
|
||||
|
||||
创建任务参数需要支持:
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "demo-sft-task",
|
||||
"project_id": "uuid",
|
||||
"base_model_id": "uuid",
|
||||
"train_dataset_id": "uuid",
|
||||
"engine": "llama_factory",
|
||||
"scheduler": {
|
||||
"mode": "auto",
|
||||
"requested_node_id": null,
|
||||
"required_tags": ["llama_factory"],
|
||||
"min_gpu_memory_mb": 24000
|
||||
},
|
||||
"training_args": {
|
||||
"stage": "sft",
|
||||
"finetuning_type": "lora",
|
||||
"epochs": 3,
|
||||
"learning_rate": 0.0002
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Demo 行为:
|
||||
|
||||
- 自动调度:选择 `enabled + online` 节点,优先资源副本命中,按空闲 GPU、队列长度、权重排序。
|
||||
- 手动调度:使用用户指定的 `requested_node_id`。
|
||||
- 任务状态模拟:`pending -> syncing -> queued -> running -> completed`。
|
||||
- 训练期间每 2-5 秒追加日志和指标。
|
||||
- 完成后生成 checkpoint 和 trained model。
|
||||
|
||||
### 3.7 Compute API Demo
|
||||
|
||||
算力服务内部接口:
|
||||
|
||||
| 方法 | 路径 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| GET | `/health` | 节点健康 |
|
||||
| GET | `/api/v1/compute/health` | 节点详细健康 |
|
||||
| GET | `/compute/resources/gpus` | GPU 状态 |
|
||||
| POST | `/compute/jobs` | 创建任务 |
|
||||
| GET | `/compute/jobs/{id}` | 查询任务 |
|
||||
| POST | `/compute/jobs/{id}/stop` | 停止任务 |
|
||||
| GET | `/compute/jobs/{id}/logs` | 拉取日志 |
|
||||
| POST | `/compute/files/upload` | 文件网关上传 |
|
||||
| GET | `/compute/files/{id}/download` | 文件网关下载 |
|
||||
|
||||
`simulator` 模式行为:
|
||||
|
||||
- 在内存或 SQLite/PostgreSQL 中维护任务状态。
|
||||
- 使用后台线程/async task 模拟训练进度。
|
||||
- 生成结构化日志、loss 曲线和 checkpoint。
|
||||
|
||||
`real` 模式预留:
|
||||
|
||||
- `nvidia-smi` 采集 GPU。
|
||||
- `subprocess.Popen` 启动 LLaMA-Factory。
|
||||
- 解析真实训练日志。
|
||||
- 扫描真实 checkpoint 和 adapter。
|
||||
|
||||
### 3.8 LLaMA-Factory Adapter Demo
|
||||
|
||||
目录建议:
|
||||
|
||||
```text
|
||||
compute/engines/llama_factory/
|
||||
adapter.py
|
||||
schemas.py
|
||||
command_builder.py
|
||||
log_parser.py
|
||||
simulator.py
|
||||
```
|
||||
|
||||
能力:
|
||||
|
||||
- `validate_config(config)`:校验训练参数。
|
||||
- `prepare_workspace(job)`:准备工作目录。
|
||||
- `build_command(job)`:生成 LLaMA-Factory 命令。
|
||||
- `start(job)`:启动真实或模拟训练。
|
||||
- `stop(job_id)`:停止任务。
|
||||
- `status(job_id)`:查询状态。
|
||||
- `parse_log(line)`:解析 loss、epoch、step、learning rate。
|
||||
- `collect_artifacts(job_id)`:收集 checkpoint、adapter、merged model。
|
||||
|
||||
Demo 阶段必须完成:
|
||||
|
||||
- `dry_run` 命令生成。
|
||||
- `simulator` 训练。
|
||||
- 日志解析器单元测试。
|
||||
|
||||
真实训练阶段再完成:
|
||||
|
||||
- `real` 进程启动。
|
||||
- 真实停止。
|
||||
- 真实产物扫描。
|
||||
|
||||
## 4. 数据库 Demo 子集
|
||||
|
||||
第一版 Demo 最小使用表:
|
||||
|
||||
- `users`
|
||||
- `tenants`
|
||||
- `projects`
|
||||
- `models`
|
||||
- `trained_models`
|
||||
- `datasets`
|
||||
- `dataset_files`
|
||||
- `storage_objects`
|
||||
- `fine_tune_tasks`
|
||||
- `fine_tune_metrics`
|
||||
- `fine_tune_checkpoints`
|
||||
- `compute_nodes`
|
||||
- `compute_node_engines`
|
||||
- `gpu_devices`
|
||||
- `compute_jobs`
|
||||
- `gpu_allocations`
|
||||
- `resource_replicas`
|
||||
- `resource_sync_jobs`
|
||||
- `audit_logs`
|
||||
|
||||
Seed 数据:
|
||||
|
||||
- 管理员用户:`admin / admin123`。
|
||||
- 租户:`demo-tenant`。
|
||||
- 项目:`demo-project`。
|
||||
- 模型:
|
||||
- `Qwen2.5-7B-Instruct`
|
||||
- `Llama-3.1-8B-Instruct`
|
||||
- 数据集:
|
||||
- `finance-sft-demo`
|
||||
- `customer-service-demo`
|
||||
- 算力节点:
|
||||
- `gpu-node-01`
|
||||
- `gpu-node-02`
|
||||
- GPU:每个节点 4 张模拟 GPU。
|
||||
- 训练任务:至少 3 条,分别处于 `pending`、`running`、`completed`。
|
||||
|
||||
## 5. 目录和配置建议
|
||||
|
||||
### 5.1 应用后端配置
|
||||
|
||||
```env
|
||||
APP_ENV=demo
|
||||
DATABASE_URL=postgresql+asyncpg://yg_ft:change_me@postgres:5432/yg_ft
|
||||
REDIS_URL=redis://redis:6379/0
|
||||
COMPUTE_STATUS_SYNC_MODE=polling
|
||||
COMPUTE_POLL_INTERVAL_SECONDS=3
|
||||
DEMO_MODE=true
|
||||
```
|
||||
|
||||
### 5.2 算力服务配置
|
||||
|
||||
```env
|
||||
COMPUTE_MODE=simulator
|
||||
COMPUTE_HOST_ID=gpu-node-01
|
||||
LLAMA_FACTORY_HOME=/opt/LLaMA-Factory
|
||||
YG_FT_DATA_ROOT=/data/yg-ft
|
||||
ENABLE_APP_CALLBACK=false
|
||||
```
|
||||
|
||||
### 5.3 本地文件目录
|
||||
|
||||
```text
|
||||
runtime/
|
||||
app/
|
||||
data/
|
||||
logs/backend/
|
||||
compute/
|
||||
logs/
|
||||
training-logs/
|
||||
data/
|
||||
tenants/
|
||||
```
|
||||
|
||||
## 6. 开发阶段计划
|
||||
|
||||
### 阶段 1:后端和 DB 最小闭环
|
||||
|
||||
目标:
|
||||
|
||||
- FastAPI 能启动。
|
||||
- PostgreSQL 能初始化。
|
||||
- Seed 数据可导入。
|
||||
- 前端能登录并读取真实接口。
|
||||
|
||||
任务:
|
||||
|
||||
- 实现 DB session。
|
||||
- 建立 Alembic 或 SQL 初始化流程。
|
||||
- 实现 `auth`、`dashboard`、`dataset`、`model` 基础接口。
|
||||
- 完成 Docker app 启动说明。
|
||||
|
||||
验收:
|
||||
|
||||
- `GET /api/health` 正常。
|
||||
- `POST /api/login` 成功。
|
||||
- 前端模型/数据集列表来自后端 DB。
|
||||
|
||||
### 阶段 2:Compute Simulator
|
||||
|
||||
目标:
|
||||
|
||||
- 算力节点、GPU、队列可演示。
|
||||
- 训练任务可以模拟运行。
|
||||
|
||||
任务:
|
||||
|
||||
- 实现 `compute/api/main.py` 内部接口。
|
||||
- 实现模拟 GPU 状态。
|
||||
- 实现模拟任务生命周期。
|
||||
- 实现训练日志和 loss 生成。
|
||||
- 实现应用后端轮询同步。
|
||||
|
||||
验收:
|
||||
|
||||
- 前端 `/compute/gpus` 可看到 GPU 动态状态。
|
||||
- 创建训练任务后 GPU 状态变化。
|
||||
- `/training-log/:id` 能看到日志和曲线。
|
||||
|
||||
### 阶段 3:微调主链路
|
||||
|
||||
目标:
|
||||
|
||||
- 训练任务从创建到完成可完整演示。
|
||||
|
||||
任务:
|
||||
|
||||
- 实现调度器。
|
||||
- 实现资源副本检查。
|
||||
- 实现资源同步任务模拟。
|
||||
- 实现 checkpoint 和 trained model 登记。
|
||||
- 前端微调创建页接入真实后端。
|
||||
|
||||
验收:
|
||||
|
||||
- 自动调度能选择节点。
|
||||
- 手动指定节点能生效。
|
||||
- 缺资源时先同步再训练。
|
||||
- 训练完成后模型产物出现在模型管理页。
|
||||
|
||||
### 阶段 4:LLaMA-Factory Adapter Dry Run
|
||||
|
||||
目标:
|
||||
|
||||
- 即使没有真实 GPU,也能展示平台如何生成 LLaMA-Factory 命令和配置。
|
||||
|
||||
任务:
|
||||
|
||||
- 实现参数校验。
|
||||
- 实现 YAML/命令生成。
|
||||
- 实现日志解析器。
|
||||
- 在训练详情页展示命令预览。
|
||||
|
||||
验收:
|
||||
|
||||
- 创建训练任务后能查看 LLaMA-Factory 命令。
|
||||
- 参数错误能返回可读错误。
|
||||
- 日志解析器能从样例日志提取 loss。
|
||||
|
||||
### 阶段 5:真实 GPU/LLaMA-Factory 可选接入
|
||||
|
||||
目标:
|
||||
|
||||
- 在有 GPU 环境时可切换为真实训练。
|
||||
|
||||
任务:
|
||||
|
||||
- 接入 `nvidia-smi`。
|
||||
- 检查 CUDA/Driver/PyTorch。
|
||||
- 启动 LLaMA-Factory 训练进程。
|
||||
- 停止训练进程。
|
||||
- 扫描真实 checkpoint。
|
||||
|
||||
验收:
|
||||
|
||||
- `COMPUTE_MODE=real` 时能读取真实 GPU。
|
||||
- 能启动一个最小 LLaMA-Factory 样例任务。
|
||||
- 真实日志能显示在训练日志页。
|
||||
|
||||
## 7. 前后端联调顺序
|
||||
|
||||
1. 登录。
|
||||
2. 看板。
|
||||
3. 模型列表。
|
||||
4. 数据集列表。
|
||||
5. 算力节点和 GPU。
|
||||
6. 微调创建。
|
||||
7. 训练任务列表。
|
||||
8. 训练日志详情。
|
||||
9. 模型产物列表。
|
||||
10. 推理对话 Mock/后端接口。
|
||||
|
||||
## 8. Demo 验收标准
|
||||
|
||||
必须满足:
|
||||
|
||||
- 不依赖真实 GPU 时,Demo 仍可完整跑通。
|
||||
- 前端核心页面不再只依赖静态 Mock。
|
||||
- 数据写入 PostgreSQL,刷新页面后仍存在。
|
||||
- 训练任务状态会自动流转。
|
||||
- GPU 状态会随任务变化。
|
||||
- 训练日志会持续追加。
|
||||
- loss 曲线会随训练推进变化。
|
||||
- 训练完成后生成 checkpoint 和训练产物。
|
||||
- 多算力节点页面能展示节点权重、标签、启用状态和维护状态。
|
||||
- 资源副本页面能展示模型/数据集在哪些节点已有缓存。
|
||||
|
||||
可选满足:
|
||||
|
||||
- 接入真实 `nvidia-smi`。
|
||||
- 接入真实 LLaMA-Factory。
|
||||
- 支持真实文件上传到算力节点本地磁盘。
|
||||
|
||||
## 9. 风险和约束
|
||||
|
||||
| 风险 | 影响 | Demo 处理 |
|
||||
| --- | --- | --- |
|
||||
| 无 GPU 环境 | 不能真实训练 | 使用 `COMPUTE_MODE=simulator` |
|
||||
| 无 LLaMA-Factory | 不能启动训练框架 | 使用 adapter `dry_run` 和 simulator |
|
||||
| 文件太大 | 本地 Demo 慢或失败 | Demo 只使用小样本和占位文件 |
|
||||
| 前端页面仍有 Mock 依赖 | 联调不完整 | 逐页替换 API,不一次性重写 |
|
||||
| 多节点真实网络不可用 | 无法多机演示 | 用多条 `compute_nodes` 模拟多节点 |
|
||||
|
||||
## 10. 建议第一批开发任务
|
||||
|
||||
第一批建议只做 8 个任务:
|
||||
|
||||
1. 后端 DB session 和配置。
|
||||
2. Seed 数据脚本。
|
||||
3. 登录、模型、数据集基础接口。
|
||||
4. Compute simulator 基础接口。
|
||||
5. GPU 动态状态模拟。
|
||||
6. 微调任务创建和状态机。
|
||||
7. 训练日志/指标模拟。
|
||||
8. 前端微调主链路接入后端。
|
||||
|
||||
完成这 8 个任务后,就可以形成第一版可演示 Demo。
|
||||
@@ -111,11 +111,11 @@ flowchart LR
|
||||
| 服务 | 端口 | 暴露范围 |
|
||||
| --- | --- | --- |
|
||||
| Nginx | 80/443 | 用户网段 |
|
||||
| Backend API | 8000 | 仅 Nginx、本机 |
|
||||
| Compute API | 9100 | 仅 Backend API、本机 |
|
||||
| File Gateway | 9101 | 仅 Backend API、本机 |
|
||||
| PostgreSQL | 5432 | 本机或内网 |
|
||||
| Redis | 6379 | 本机或内网 |
|
||||
| Backend API | 17861 | 仅 Nginx、本机 |
|
||||
| Compute API | 19100 | 仅 Backend API、本机 |
|
||||
| File Gateway | 19101 | 仅 Backend API、本机 |
|
||||
| PostgreSQL | 15432 | 本机或内网 |
|
||||
| Redis | 16379 | 本机或内网 |
|
||||
|
||||
## 5. 方案二:应用服务与算力/训练服务独立部署
|
||||
|
||||
@@ -275,9 +275,9 @@ API_PREFIX=/api
|
||||
DATABASE_URL=postgresql+asyncpg://yg_ft:***@postgres:5432/yg_ft
|
||||
REDIS_URL=redis://redis:6379/0
|
||||
LOG_DIR=/opt/yg-ft/logs/backend
|
||||
COMPUTE_API_BASE_URL=https://compute.internal:9100
|
||||
COMPUTE_API_BASE_URL=https://compute.internal:19100
|
||||
COMPUTE_SERVICE_TOKEN=***
|
||||
FILE_GATEWAY_BASE_URL=https://compute.internal:9101
|
||||
FILE_GATEWAY_BASE_URL=https://compute.internal:19101
|
||||
COMPUTE_STATUS_SYNC_MODE=polling
|
||||
COMPUTE_POLL_INTERVAL_SECONDS=10
|
||||
COMPUTE_POLL_BATCH_SIZE=100
|
||||
@@ -288,12 +288,11 @@ COMPUTE_POLL_BATCH_SIZE=100
|
||||
```env
|
||||
COMPUTE_ENV=prod
|
||||
COMPUTE_HOST_ID=gpu-node-01
|
||||
COMPUTE_API_PORT=9100
|
||||
FILE_GATEWAY_PORT=9101
|
||||
COMPUTE_API_PORT=19100
|
||||
FILE_GATEWAY_PORT=19101
|
||||
COMPUTE_SERVICE_TOKEN=***
|
||||
ENABLE_APP_CALLBACK=false
|
||||
LLAMA_FACTORY_HOME=/opt/LLaMA-Factory
|
||||
LLAMA_FACTORY_HOST_PATH=/opt/LLaMA-Factory
|
||||
LLAMA_FACTORY_HOME=/app/LLaMA-Factory
|
||||
YG_FT_DATA_ROOT=/data/yg-ft
|
||||
LOG_DIR=/opt/yg-ft/logs/compute
|
||||
CUDA_VISIBLE_DEVICES=0,1,2,3
|
||||
@@ -360,8 +359,7 @@ docker/
|
||||
```bash
|
||||
cd docker/app
|
||||
cp .env.example .env
|
||||
docker compose --profile build run --rm frontend-builder
|
||||
docker compose up -d --build
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
算力服务器启动:
|
||||
@@ -369,14 +367,14 @@ docker compose up -d --build
|
||||
```bash
|
||||
cd docker/compute
|
||||
cp .env.example .env
|
||||
docker compose up -d --build
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
应用服务器与算力服务器独立部署时,需要在 `docker/app/.env` 中配置:
|
||||
|
||||
```env
|
||||
COMPUTE_API_BASE_URL=http://<compute-server-ip>:9100
|
||||
FILE_GATEWAY_BASE_URL=http://<compute-server-ip>:9101
|
||||
COMPUTE_API_BASE_URL=http://<compute-server-ip>:19100
|
||||
FILE_GATEWAY_BASE_URL=http://<compute-server-ip>:19101
|
||||
COMPUTE_SERVICE_TOKEN=change_me
|
||||
```
|
||||
|
||||
@@ -385,9 +383,9 @@ COMPUTE_SERVICE_TOKEN=change_me
|
||||
多节点后,每台算力服务器各自进入 `docker/compute` 启动一套算力服务,并在应用平台中登记为一条 `compute_nodes` 记录:
|
||||
|
||||
```text
|
||||
gpu-node-01 -> http://10.10.20.31:9100 / http://10.10.20.31:9101
|
||||
gpu-node-02 -> http://10.10.20.32:9100 / http://10.10.20.32:9101
|
||||
gpu-node-03 -> http://10.10.20.33:9100 / http://10.10.20.33:9101
|
||||
gpu-node-01 -> http://10.10.20.31:19100 / http://10.10.20.31:19101
|
||||
gpu-node-02 -> http://10.10.20.32:19100 / http://10.10.20.32:19101
|
||||
gpu-node-03 -> http://10.10.20.33:19100 / http://10.10.20.33:19101
|
||||
```
|
||||
|
||||
算力服务器需要在 `docker/compute/.env` 中配置:
|
||||
@@ -395,7 +393,6 @@ gpu-node-03 -> http://10.10.20.33:9100 / http://10.10.20.33:9101
|
||||
```env
|
||||
ENABLE_APP_CALLBACK=false
|
||||
COMPUTE_SERVICE_TOKEN=change_me
|
||||
LLAMA_FACTORY_HOST_PATH=/opt/LLaMA-Factory
|
||||
YG_FT_DATA_ROOT_HOST=/data/yg-ft
|
||||
```
|
||||
|
||||
|
||||
135
docs/first-version-development-plan.md
Normal file
135
docs/first-version-development-plan.md
Normal file
@@ -0,0 +1,135 @@
|
||||
# 第一版系统开发计划
|
||||
|
||||
> 说明:本计划虽然以“可演示闭环”为阶段目标,但实现内容按正式系统第一版开发,不在工程模块、配置项、接口标签、数据库对象中使用临时代码命名。初始化数据仅作为样例种子数据,后续可在此基础上继续扩展为生产能力。
|
||||
|
||||
## 1. 阶段目标
|
||||
|
||||
第一版系统需要在没有完整生产环境、没有真实 GPU 或没有 LLaMA-Factory 运行环境时,仍然可以跑通模型微调平台的主链路:
|
||||
|
||||
```text
|
||||
登录
|
||||
-> 模型管理
|
||||
-> 数据集管理
|
||||
-> 创建微调任务
|
||||
-> 调度算力节点与 GPU
|
||||
-> 模拟资源副本检查和同步
|
||||
-> 启动训练任务
|
||||
-> 查看任务状态、GPU 占用、训练日志、loss 曲线
|
||||
-> 训练完成后登记训练产物
|
||||
```
|
||||
|
||||
该阶段不是一次性展示代码,而是后续系统继续开发的基础版本。算力、训练框架、资源同步、任务状态机均按真实平台边界设计,当前仅以 `simulator` 模式补齐无 GPU 环境下的可运行能力。
|
||||
|
||||
## 2. 运行模式
|
||||
|
||||
| 模式 | 说明 | 当前状态 |
|
||||
| --- | --- | --- |
|
||||
| `simulator` | 模拟 GPU、训练进程、日志、指标、checkpoint 和训练产物 | 第一版默认实现 |
|
||||
| `real` | 预留真实 `nvidia-smi`、LLaMA-Factory 进程启动、真实日志解析和产物扫描 | 后续接入 |
|
||||
|
||||
第一版实现必须保留 `real` 模式边界,不允许把训练命令直接写死在应用平台后端。训练相关能力统一沉淀在 `compute/engines/` 适配层。
|
||||
|
||||
## 3. 第一批开发范围
|
||||
|
||||
### 3.1 应用平台后端
|
||||
|
||||
对应目录:
|
||||
|
||||
```text
|
||||
backend/app/
|
||||
api/v1/endpoints/platform.py
|
||||
db/platform_store.py
|
||||
db/session.py
|
||||
```
|
||||
|
||||
已覆盖能力:
|
||||
- 统一 API 响应结构 `{ code, message, data }`。
|
||||
- 初始化样例用户、模型、数据集、算力节点、GPU 和微调任务。
|
||||
- 登录、当前用户、用户列表与权限。
|
||||
- 模型管理、训练产物列表、权重合并任务占位。
|
||||
- 数据集管理、文件上传、预览、版本管理和下载。
|
||||
- 微调任务创建、启动、停止、删除、进度查询、checkpoint 查询。
|
||||
- 系统健康指标、系统信息、训练日志、系统日志。
|
||||
- 算力节点、GPU、队列、资源副本、资源同步任务接口。
|
||||
|
||||
开发约定:
|
||||
- 当前本地可运行存储使用 SQLite,配置项为 `LOCAL_DB_PATH`。
|
||||
- 生产数据库仍以 PostgreSQL 为目标,正式表结构以 `docs/postgres-schema.sql` 为准。
|
||||
- `backend/app/db/session.py` 已提供 SQLAlchemy session 入口,后续替换正式 ORM 时从此处收口。
|
||||
|
||||
### 3.2 算力平台服务
|
||||
|
||||
对应目录:
|
||||
|
||||
```text
|
||||
compute/
|
||||
api/main.py
|
||||
engines/llama_factory/adapter.py
|
||||
```
|
||||
|
||||
已覆盖能力:
|
||||
- `/health` 与 `/api/v1/compute/health` 节点健康检查。
|
||||
- `/compute/resources/gpus` GPU 状态模拟。
|
||||
- `/compute/jobs` 创建、查询、停止训练任务。
|
||||
- `/compute/jobs/{id}/logs` 拉取训练日志与解析指标。
|
||||
- `/compute/files/upload` 与 `/compute/files/{id}/download` 文件网关占位。
|
||||
- LLaMA-Factory 参数校验、命令生成、日志指标解析。
|
||||
|
||||
设计约定:
|
||||
- 多算力节点阶段,每台单机多 GPU 服务器都部署一套 Compute API、Agent、File Gateway 和训练框架。
|
||||
- 应用平台通过 `compute_nodes` 中维护的 `api_base_url`、`file_gateway_url` 主动轮询算力节点。
|
||||
- 算力节点之间默认不互访,资源副本和同步状态由应用平台统一编排。
|
||||
|
||||
### 3.3 前端页面
|
||||
|
||||
已接入页面:
|
||||
- `/login`:登录接口。
|
||||
- `/model-manage`:模型列表与模型来源。
|
||||
- `/dataset`、`/dataset/:id/preview`:数据集列表、预览和版本。
|
||||
- `/fine-tune`、`/fine-tune/create`:微调任务创建、启动、状态轮询。
|
||||
- `/training-log/:id`:训练日志和 loss 曲线。
|
||||
- `/hardware`:平台 GPU 与系统性能。
|
||||
- `/compute`:算力节点、GPU、队列、资源副本。
|
||||
|
||||
新增前端能力:
|
||||
- `frontend/src/api/modules/compute.ts`:算力节点 API 包装。
|
||||
- `frontend/src/views/compute/ComputeNodesView.vue`:节点、GPU、队列、资源副本四个视图。
|
||||
- 权限枚举增加 `compute`,菜单增加“算力节点”入口。
|
||||
|
||||
### 3.4 数据库
|
||||
|
||||
第一版运行时使用本地 SQLite 以降低开发环境门槛,但数据库模型仍按 PostgreSQL 正式设计推进。
|
||||
|
||||
核心表范围:
|
||||
- 用户、租户、项目、角色、权限。
|
||||
- 模型、训练产物、数据集、数据集文件、存储对象。
|
||||
- 微调任务、训练指标、checkpoint、审计日志。
|
||||
- 算力节点、GPU 设备、算力任务、GPU 分配。
|
||||
- 资源副本、资源同步任务。
|
||||
|
||||
优化方向:
|
||||
- 任务状态、租户/项目隔离字段、资源副本定位字段需要建立索引。
|
||||
- 审计日志、训练指标、日志归档后续建议按时间分区。
|
||||
- 大文件只落本地磁盘或对象存储,数据库保存元数据和版本关系。
|
||||
|
||||
## 4. 验收标准
|
||||
|
||||
第一版完成后应满足:
|
||||
- 前端不启用静态 Mock 时,可以通过 FastAPI 获取主要页面数据。
|
||||
- 登录后可以看到模型、数据集、微调任务和算力节点。
|
||||
- 创建微调任务后可以启动任务,任务状态自动流转。
|
||||
- GPU 状态会随任务进入 `syncing`、`queued`、`running` 发生变化。
|
||||
- 训练日志持续生成,日志详情页能解析 loss、grad norm、learning rate、epoch。
|
||||
- 任务完成后训练产物出现在模型管理的训练产物列表中。
|
||||
- 算力节点页面可展示节点地址、权重、标签、启用状态、队列和资源副本。
|
||||
- 工程命名、配置和接口分组均可作为后续正式开发基础。
|
||||
|
||||
## 5. 后续开发计划
|
||||
|
||||
| 阶段 | 重点 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 第二阶段 | PostgreSQL ORM 与 Alembic | 将 `platform_store.py` 的能力迁移为正式 ORM、迁移脚本和 repository/service 分层 |
|
||||
| 第三阶段 | 真实 Compute Agent | 接入 `nvidia-smi`、GPU 锁定、进程管理、训练日志文件采集 |
|
||||
| 第四阶段 | LLaMA-Factory 真实训练 | 生成 YAML/命令、启动训练进程、停止任务、扫描 checkpoint 和 adapter |
|
||||
| 第五阶段 | 企业治理 | 多租户、项目/模型/数据集隔离、审批流、审计留存、配额和资源申请 |
|
||||
| 第六阶段 | 多节点调度 | 基于 `compute_nodes`、资源副本和节点标签实现自动/手动调度策略 |
|
||||
@@ -431,9 +431,9 @@ Expected: 三项检查全部 PASS。
|
||||
|
||||
- [ ] **Step 3: 启动页面并逐步验证四步交互**
|
||||
|
||||
Run: `cd frontend && npm run dev -- --host 0.0.0.0 --port 6801`
|
||||
Run: `cd frontend && npm run dev -- --host 0.0.0.0 --port 16801`
|
||||
|
||||
Browser checks at `http://localhost:6801/data-process/create`:
|
||||
Browser checks at `http://localhost:16801/data-process/create`:
|
||||
|
||||
1. 第一步上传文本并选择非结构化数据。
|
||||
2. 第二步点击至少三个右侧切片,确认左侧滚动目标和高亮范围变化。
|
||||
|
||||
Reference in New Issue
Block a user