- 将 Dockerfile 和 docker-compose.yml 迁移至 docker/ 目录下统一管理 - 新增 compute 计算模块(API 入口、依赖配置) - 新增 docker/app 和 docker/compute 部署配置 - 新增 demo-development-plan.md 演示开发计划文档 - 更新后端 API 设计、部署计划、架构需求等文档 - 更新 postgres 数据库 schema Co-Authored-By: Claude <noreply@anthropic.com>
773 lines
31 KiB
Markdown
773 lines
31 KiB
Markdown
# 模型训练平台架构与功能需求设计
|
||
|
||
> 本文基于当前前端页面、已有接口/数据库设计,以及用户补充的 6 条约束进行补全。目标是把平台从“单前端原型 + 后端接口草案”扩展为企业可落地的模型训练平台方案。
|
||
|
||
## 1. 补充需求结论
|
||
|
||
### 1.1 已确认约束
|
||
|
||
1. 部署形态:单机多 GPU。
|
||
2. 文件存储:本地磁盘。
|
||
3. 训练框架:当前固定 LLaMA-Factory,但要预留其他训练平台接入标准。
|
||
4. 权限粒度:需要到项目、模型、数据集级隔离。
|
||
5. 企业治理:需要多租户、审批流、审计留存周期。
|
||
6. 部署边界:算力平台与应用平台分开部署。
|
||
|
||
### 1.2 对整体设计的影响
|
||
|
||
- 不能只做页面级 RBAC,需要引入“租户 -> 项目 -> 资源 -> 成员/角色/ACL”的资源权限模型。
|
||
- 单机多 GPU 不等于简单指定 GPU ID,需要有 GPU 资源池、锁定、排队、抢占策略和异常释放机制。
|
||
- 本地磁盘存储与应用/算力分离存在天然冲突:文件不能只存应用服务器本地,也不能让应用直接读算力服务器目录。建议将训练文件、模型文件、日志文件统一落在算力节点本地磁盘,由算力平台提供文件网关 API;应用平台只保存元数据和访问路径。
|
||
- LLaMA-Factory 应作为第一个训练引擎插件,而不是写死到业务流程里。后续接入其他平台时只需实现同一套训练引擎协议。
|
||
- 审批流、审计和保留策略必须从第一版进入数据模型和接口,否则后期补会牵动大量资源表。
|
||
|
||
## 2. 总体架构设计
|
||
|
||
### 2.1 逻辑分层
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
U["用户浏览器"] --> APP["应用平台 Web / FastAPI"]
|
||
APP --> DB["PostgreSQL"]
|
||
APP --> REDIS["Redis / 任务队列"]
|
||
APP --> CPAPI["算力平台 API"]
|
||
CPAPI --> AGENT["算力节点 Agent"]
|
||
AGENT --> GPU["单机多 GPU"]
|
||
AGENT --> DISK["本地磁盘工作区"]
|
||
AGENT --> LF["LLaMA-Factory 引擎"]
|
||
```
|
||
|
||
### 2.2 应用平台职责
|
||
|
||
应用平台负责业务编排和企业治理,不直接执行训练命令:
|
||
|
||
- 用户、租户、项目、权限、审批、审计。
|
||
- 模型、数据集、任务、评测、推理任务元数据。
|
||
- 前端 API、OpenAPI、统一认证、统一响应。
|
||
- 训练/评测/数据处理任务创建、状态查询、审批校验。
|
||
- 与算力平台通信,下发任务、查询进度、拉取日志、下载产物。
|
||
|
||
建议部署组件:
|
||
|
||
- Nginx:静态前端与反向代理。
|
||
- FastAPI:业务 API。
|
||
- PostgreSQL:业务元数据。
|
||
- Redis:缓存、任务队列、SSE 状态缓存、分布式锁。
|
||
- Worker:审批通知、审计归档、周期清理、异步导出。
|
||
|
||
### 2.3 算力平台职责
|
||
|
||
算力平台负责“实际占用 GPU 和磁盘”的事情:
|
||
|
||
- GPU 发现、资源上报、锁定、释放。
|
||
- 本地磁盘工作区管理。
|
||
- 数据集文件接收、校验、解压、版本目录管理。
|
||
- LLaMA-Factory 命令生成、执行、停止、日志采集。
|
||
- 训练产物、LoRA adapter、merged model、checkpoint 管理。
|
||
- 推理服务进程管理、端口分配、健康检查。
|
||
- 系统/GPU 监控指标采集。
|
||
|
||
建议部署组件:
|
||
|
||
- Compute API:只暴露给应用平台访问。
|
||
- Compute Agent:本机服务,具备启动/停止进程权限。
|
||
- 本地文件网关:上传、下载、预览、断点续传、文件校验。
|
||
- Engine Adapter:LLaMA-Factory 适配器,后续扩展其他训练引擎。
|
||
|
||
### 2.4 应用与算力平台通信
|
||
|
||
建议统一使用内部 HTTP/gRPC API,并配置服务间认证:
|
||
|
||
- 应用平台调用算力平台必须携带 `X-Service-Token` 或 mTLS 证书。
|
||
- 算力平台不信任前端用户身份,只信任应用平台下发的租户、项目、任务和资源上下文。
|
||
- 第一阶段不默认启用算力侧回调,应用平台通过定时轮询 Compute API 同步任务状态;如未来启用回调,必须带签名,避免伪造状态。
|
||
|
||
核心通信接口:
|
||
|
||
| 方向 | 接口 | 说明 |
|
||
| --- | --- | --- |
|
||
| 应用 -> 算力 | `POST /compute/jobs` | 创建训练/评测/数据处理/推理任务 |
|
||
| 应用 -> 算力 | `POST /compute/jobs/{id}/stop` | 停止任务 |
|
||
| 应用 -> 算力 | `GET /compute/jobs/{id}` | 查询任务状态 |
|
||
| 应用 -> 算力 | `GET /compute/jobs/{id}/logs` | 拉取日志 |
|
||
| 应用 -> 算力 | `GET /compute/resources/gpus` | 查询 GPU 状态 |
|
||
| 应用 -> 算力 | `POST /compute/files/upload` | 上传文件到算力本地磁盘 |
|
||
| 应用 -> 算力 | `GET /compute/files/{object_id}/download` | 下载文件 |
|
||
| 应用 -> 算力 | `GET /compute/jobs?status=running` | 定时轮询任务状态、指标、产物索引 |
|
||
|
||
## 3. 本地磁盘存储设计
|
||
|
||
### 3.1 存储根目录
|
||
|
||
由于算力和应用分离,建议文件主存储放在算力节点本地磁盘:
|
||
|
||
```text
|
||
/data/ft-platform/
|
||
tenants/{tenant_id}/
|
||
projects/{project_id}/
|
||
datasets/{dataset_id}/
|
||
models/base/{model_id}/
|
||
models/trained/{trained_model_id}/
|
||
jobs/{job_id}/
|
||
input/
|
||
output/
|
||
logs/
|
||
checkpoints/
|
||
tmp/
|
||
```
|
||
|
||
应用平台数据库保存:
|
||
|
||
- `storage_type=local`。
|
||
- `storage_node_id`。
|
||
- `relative_path`。
|
||
- `checksum_sha256`。
|
||
- `byte_size`。
|
||
- `tenant_id/project_id/resource_id`。
|
||
|
||
### 3.2 文件访问原则
|
||
|
||
- 前端不直接访问磁盘路径。
|
||
- 应用平台生成短时下载凭证,转发或重定向到算力文件网关。
|
||
- 预览内容只读取前 N 行或指定区间,避免大文件撑爆 API。
|
||
- 大文件上传必须支持分片上传、校验、断点续传。
|
||
- 删除操作采用软删除 + 延迟清理,等待审计留存和审批结果。
|
||
|
||
### 3.3 磁盘配额
|
||
|
||
配额应分三层:
|
||
|
||
- 租户配额:总容量、模型容量、数据容量、日志容量。
|
||
- 项目配额:可用容量、最大文件大小、最大任务产物保留数。
|
||
- 用户配额:可上传文件总量、并发任务产物占用。
|
||
|
||
超过配额时:
|
||
|
||
- 禁止新建任务或上传文件。
|
||
- 允许下载和清理。
|
||
- 提示可清理的 checkpoint、过期日志、失败任务临时目录。
|
||
|
||
## 4. 单机多 GPU 资源调度
|
||
|
||
第一版可以先以单个算力节点跑通主链路,但数据模型、接口和页面需要按多算力节点预留。多节点阶段仍然采用“每台 GPU 服务器 = 一个单机多 GPU 节点”的模式,不引入 Kubernetes。
|
||
|
||
### 4.1 GPU 资源模型
|
||
|
||
每张 GPU 需要记录:
|
||
|
||
- `gpu_index`、`uuid`、型号、显存、驱动版本。
|
||
- 当前利用率、显存占用、温度、功耗。
|
||
- 当前锁定任务、进程 PID、端口。
|
||
- 状态:`idle`、`reserved`、`running`、`draining`、`offline`、`error`。
|
||
|
||
### 4.2 调度策略
|
||
|
||
第一版建议支持三种模式:
|
||
|
||
- 手动指定 GPU:兼容当前前端选择 GPU 的模式。
|
||
- 自动选择 GPU:按空闲显存、温度、任务队列选择。
|
||
- 项目配额调度:项目最多可占用 N 张 GPU,避免单项目占满机器。
|
||
|
||
训练任务启动流程:
|
||
|
||
1. 应用平台校验权限、配额、审批状态。
|
||
2. 生成任务,状态为 `pending`。
|
||
3. 算力平台尝试锁定 GPU。
|
||
4. 锁定成功后创建工作区并启动 LLaMA-Factory。
|
||
5. Agent 持续上报进度、日志、指标。
|
||
6. 任务完成后释放 GPU,登记模型产物。
|
||
|
||
### 4.3 并发与排队
|
||
|
||
- 同一 GPU 同时只允许一个训练任务。
|
||
- 推理服务可与训练互斥,默认不允许混跑;如后续允许,需要显存保留策略。
|
||
- 数据处理如果只调用 API 模型,可以不占 GPU;如果调用本地模型生成,需要占用 GPU。
|
||
- 支持任务队列优先级:`low`、`normal`、`high`、`urgent`。
|
||
- 高优任务是否可抢占低优任务,需要审批或管理员权限。
|
||
|
||
### 4.4 多算力节点升级策略
|
||
|
||
多算力节点阶段的推荐决策:
|
||
|
||
- 每个可执行训练任务的 GPU 节点都部署 `Compute API`、`Compute Agent`、`File Gateway`、LLaMA-Factory、CUDA/PyTorch 训练环境和本地数据盘。
|
||
- 应用服务器可以主动访问所有算力节点的 `Compute API/File Gateway`。
|
||
- 算力节点之间默认不互相访问,不做节点间点对点同步;所有调度、状态同步和资源分发由应用平台统一编排。
|
||
- 长期坚持每台算力服务器本地磁盘,因此需要 `resource_replicas` 记录数据集、基座模型、checkpoint、adapter、导出模型在哪些节点已有本地副本。
|
||
- 调度前必须检查目标节点是否已有模型和数据集副本;缺失时由应用平台通过目标节点 File Gateway 创建同步任务,完成后再启动训练。
|
||
- 调度支持自动和手动两种模式:普通用户默认自动调度,管理员/高级用户可手动指定节点、GPU、标签或节点组。
|
||
|
||
多节点自动调度建议:
|
||
|
||
1. 过滤 `enabled = true` 且 `scheduler_status = online` 的节点。
|
||
2. 按训练引擎、GPU 型号、显存、节点标签、租户/项目配额过滤。
|
||
3. 优先选择已存在所需模型/数据集副本的节点,减少跨节点复制。
|
||
4. 同等条件下按空闲 GPU、队列长度、节点权重和最近健康检查排序。
|
||
5. `draining` 节点不接收新任务,但允许已有任务完成。
|
||
|
||
## 5. 训练引擎接入标准
|
||
|
||
### 5.1 引擎抽象
|
||
|
||
LLaMA-Factory 是第一实现,但业务系统只依赖统一训练引擎接口:
|
||
|
||
```text
|
||
TrainingEngine
|
||
validate_config(config)
|
||
prepare_workspace(job_context)
|
||
build_command(job_context)
|
||
start(job_context)
|
||
stop(job_id)
|
||
parse_progress(log_line)
|
||
collect_artifacts(job_id)
|
||
export_model(job_id, export_config)
|
||
```
|
||
|
||
### 5.2 引擎注册信息
|
||
|
||
每个训练引擎需要声明:
|
||
|
||
- 引擎编码:`llama_factory`。
|
||
- 支持任务:`SFT`、`DPO`、`CPT`。
|
||
- 支持方法:`lora`、`qlora`、`full`。
|
||
- 支持模型模板:`qwen`、`llama3` 等。
|
||
- 支持数据格式:Alpaca、ShareGPT、DPO pair、pretrain text。
|
||
- 支持量化和导出格式。
|
||
- 参数 schema。
|
||
- 命令模板或启动方式。
|
||
|
||
### 5.3 LLaMA-Factory 适配要求
|
||
|
||
LLaMA-Factory 适配器负责:
|
||
|
||
- 将平台训练参数转换为 YAML/CLI 参数。
|
||
- 根据项目工作区生成数据集配置。
|
||
- 自动设置 `CUDA_VISIBLE_DEVICES`。
|
||
- 解析训练日志中的 loss、epoch、learning_rate、ETA。
|
||
- 收集 checkpoint、adapter、merged model、training_args、trainer_state。
|
||
- 支持训练停止和失败恢复。
|
||
|
||
### 5.4 后续接入其他平台的标准
|
||
|
||
其他训练平台只要实现以下契约即可接入:
|
||
|
||
- 输入:模型引用、数据集引用、训练配置、资源需求、输出目录。
|
||
- 输出:任务状态、进度、日志、指标、产物清单、失败原因。
|
||
- 生命周期:`prepare`、`start`、`running`、`stop`、`complete`、`cleanup`。
|
||
- 安全:不能越权访问其他租户/项目目录。
|
||
- 可观测:必须输出结构化事件和日志。
|
||
|
||
## 6. 多租户与项目级隔离
|
||
|
||
### 6.1 租户模型
|
||
|
||
需要新增租户管理:
|
||
|
||
- 租户名称、编码、状态。
|
||
- 租户管理员。
|
||
- 租户资源配额:GPU 并发数、磁盘容量、最大项目数。
|
||
- 租户审计策略、保留周期、审批策略。
|
||
|
||
### 6.2 项目空间
|
||
|
||
所有业务资源必须归属项目:
|
||
|
||
- 数据集。
|
||
- 模型。
|
||
- 训练任务。
|
||
- 评测任务。
|
||
- 推理任务。
|
||
- 数据处理任务。
|
||
- 自定义工具。
|
||
|
||
项目字段:
|
||
|
||
- 项目名称、描述、所属租户。
|
||
- 项目管理员、成员。
|
||
- 默认资源权限。
|
||
- GPU/磁盘/任务并发配额。
|
||
- 项目状态:启用、归档、禁用。
|
||
|
||
### 6.3 资源级权限
|
||
|
||
建议采用 RBAC + ACL 混合:
|
||
|
||
- RBAC 决定用户是否能访问模块,例如能否进入模型管理。
|
||
- 项目角色决定用户是否能管理项目内资源。
|
||
- 资源 ACL 处理特殊授权,例如某个数据集只给指定成员可读。
|
||
|
||
项目角色建议:
|
||
|
||
| 角色 | 权限 |
|
||
| --- | --- |
|
||
| Project Owner | 项目设置、成员、资源、审批策略全权限 |
|
||
| Project Maintainer | 创建/编辑模型、数据集、任务,可发起发布和删除 |
|
||
| Developer | 创建训练、评测、推理、数据处理任务 |
|
||
| Reviewer | 审批、复核、查看评测结果 |
|
||
| Viewer | 只读查看 |
|
||
|
||
资源权限建议:
|
||
|
||
- `read`:查看资源。
|
||
- `write`:编辑元数据和内容。
|
||
- `execute`:用于训练/评测/推理。
|
||
- `download`:下载文件和模型。
|
||
- `delete`:删除或申请删除。
|
||
- `manage_acl`:管理资源授权。
|
||
|
||
### 6.4 数据隔离要求
|
||
|
||
- API 查询必须默认带 `tenant_id` 和用户可访问项目范围。
|
||
- 数据库所有核心资源表增加 `tenant_id`、`project_id`。
|
||
- 本地磁盘路径包含租户和项目 ID,防止路径混用。
|
||
- 算力任务上下文必须携带租户/项目,Agent 只允许访问对应工作区。
|
||
- 日志、审计、下载链接也必须按租户隔离。
|
||
|
||
## 7. 企业治理设计
|
||
|
||
### 7.1 审批流
|
||
|
||
建议第一版支持可配置审批模板:
|
||
|
||
| 场景 | 是否建议审批 | 原因 |
|
||
| --- | --- | --- |
|
||
| 删除数据集 | 是 | 数据不可逆风险高 |
|
||
| 删除模型 | 是 | 影响训练/推理依赖 |
|
||
| 模型发布为可推理服务 | 是 | 影响生产资源 |
|
||
| 停止他人训练任务 | 是或管理员直通 | 影响计算成本和他人工作 |
|
||
| 导出模型 | 可配置 | 涉及资产外流 |
|
||
| 下载敏感数据集 | 可配置 | 涉及数据安全 |
|
||
| 提高 GPU 配额 | 是 | 涉及资源竞争 |
|
||
|
||
审批流能力:
|
||
|
||
- 发起审批。
|
||
- 指定审批人/审批组。
|
||
- 多级审批。
|
||
- 通过、驳回、撤回、转交。
|
||
- 审批超时提醒。
|
||
- 审批结果回写原业务动作。
|
||
|
||
### 7.2 审计留存周期
|
||
|
||
建议支持租户级配置:
|
||
|
||
- 操作审计:默认 180 天,可配置 90/180/365/永久。
|
||
- 登录审计:默认 180 天。
|
||
- 训练日志:默认 90 天。
|
||
- 系统监控:原始采样默认 30 天,聚合指标保留 1 年。
|
||
- 模型产物:默认长期保留,删除需审批。
|
||
- 临时文件:默认 7 天清理。
|
||
- 失败任务工作区:默认 14 天清理。
|
||
|
||
审计不可被普通管理员物理删除,只能由系统归档任务按策略处理。
|
||
|
||
### 7.3 安全策略
|
||
|
||
需要补充:
|
||
|
||
- API Key 加密存储和脱敏展示。
|
||
- 外部数据源密码加密存储或不落库。
|
||
- 下载链接短时有效。
|
||
- 敏感操作二次确认。
|
||
- 审批通过后动作有效期,例如 24 小时内执行。
|
||
- IP 白名单和服务间 token。
|
||
- 操作审计记录 before/after 数据。
|
||
|
||
## 8. 需要补全的页面和功能
|
||
|
||
### 8.1 租户与项目页面
|
||
|
||
当前前端缺失,建议新增:
|
||
|
||
1. 租户管理页
|
||
- 租户列表、创建、禁用、配额设置、审计策略。
|
||
- 仅平台管理员可见。
|
||
|
||
2. 项目空间页
|
||
- 项目列表、创建项目、归档项目。
|
||
- 展示项目资源概览:模型数、数据集数、任务数、磁盘占用、GPU 使用。
|
||
|
||
3. 项目成员页
|
||
- 添加/移除成员。
|
||
- 设置项目角色。
|
||
- 查看成员最近操作。
|
||
|
||
4. 项目资源权限页
|
||
- 模型/数据集/任务级授权。
|
||
- 支持按用户、用户组、项目角色授权。
|
||
|
||
### 8.2 用户中心补全
|
||
|
||
前端路由已有但页面文件缺失或未完成:
|
||
|
||
- `PermissionDeniedView.vue`
|
||
- `UserSettingsView.vue`
|
||
- `UserCreateView.vue`
|
||
- `UserPermissionView.vue`
|
||
|
||
建议功能:
|
||
|
||
- 用户列表、创建、禁用、重置密码。
|
||
- 角色管理。
|
||
- 页面权限管理。
|
||
- 用户所属租户/项目。
|
||
- 用户可用 GPU/磁盘配额查看。
|
||
- 登录记录和操作审计入口。
|
||
|
||
### 8.3 审批中心
|
||
|
||
新增页面:
|
||
|
||
- 我的申请。
|
||
- 待我审批。
|
||
- 已办审批。
|
||
- 审批详情。
|
||
- 审批模板配置。
|
||
|
||
审批详情需要展示:
|
||
|
||
- 申请人、申请时间、动作类型、目标资源。
|
||
- 变更前后信息。
|
||
- 风险提示。
|
||
- 审批记录。
|
||
- 通过/驳回意见。
|
||
|
||
### 8.4 算力资源中心
|
||
|
||
当前只有硬件监控页,建议扩展为算力资源中心:
|
||
|
||
- GPU 拓扑和状态。
|
||
- GPU 当前任务占用。
|
||
- GPU 锁定/释放记录。
|
||
- 队列中的任务。
|
||
- 资源配额:租户/项目/用户维度。
|
||
- 算力节点 Agent 状态。
|
||
- 算力节点新增/编辑、连接测试、启用/禁用、维护模式。
|
||
- 节点权重、标签、训练引擎版本、LLaMA-Factory 健康状态。
|
||
- 节点本地资源副本:数据集、模型、checkpoint、adapter 和导出模型缓存。
|
||
- 训练引擎健康状态。
|
||
|
||
### 8.5 文件与存储管理
|
||
|
||
新增页面:
|
||
|
||
- 存储总览。
|
||
- 租户/项目磁盘占用。
|
||
- 大文件列表。
|
||
- 临时文件清理。
|
||
- Checkpoint 管理。
|
||
- 日志保留策略。
|
||
- 文件下载审计。
|
||
|
||
### 8.6 训练引擎管理
|
||
|
||
新增页面:
|
||
|
||
- 引擎列表。
|
||
- LLaMA-Factory 版本和路径。
|
||
- 引擎能力声明。
|
||
- 参数 schema 管理。
|
||
- 引擎健康检查。
|
||
- 引擎接入文档。
|
||
|
||
### 8.7 任务队列与运行控制
|
||
|
||
新增页面:
|
||
|
||
- 全局任务队列。
|
||
- 项目任务队列。
|
||
- 任务优先级调整。
|
||
- 任务重试。
|
||
- 任务停止审批。
|
||
- 失败任务诊断。
|
||
|
||
### 8.8 模型发布与服务治理
|
||
|
||
当前推理/对比页面已有基础能力,但缺少企业化发布能力:
|
||
|
||
- 模型发布申请。
|
||
- 推理服务实例配置。
|
||
- 端口、GPU、并发、超时、最大上下文限制。
|
||
- 服务启停记录。
|
||
- 调用统计。
|
||
- 服务下线审批。
|
||
|
||
## 9. 后端模块补全
|
||
|
||
### 9.1 新增核心模块
|
||
|
||
| 模块 | 职责 |
|
||
| --- | --- |
|
||
| tenant | 租户管理、租户配额、租户策略 |
|
||
| project | 项目空间、成员、项目角色 |
|
||
| resource_acl | 模型/数据集/任务级资源授权 |
|
||
| approval | 审批模板、审批实例、审批动作 |
|
||
| quota | GPU、磁盘、任务并发配额 |
|
||
| compute_gateway | 应用平台与算力平台通信 |
|
||
| file_gateway | 本地磁盘文件上传、下载、预览 |
|
||
| engine_registry | 训练引擎注册与能力发现 |
|
||
| retention | 审计、日志、临时文件保留策略 |
|
||
|
||
### 9.2 数据模型补充
|
||
|
||
在前一版 SQL 基础上,应新增或调整:
|
||
|
||
- `tenants`
|
||
- `tenant_users`
|
||
- `projects`
|
||
- `project_members`
|
||
- `resource_acl`
|
||
- `approval_templates`
|
||
- `approval_instances`
|
||
- `approval_steps`
|
||
- `quotas`
|
||
- `quota_usage`
|
||
- `compute_nodes`
|
||
- `gpu_devices`
|
||
- `gpu_allocations`
|
||
- `compute_jobs`
|
||
- `training_engines`
|
||
- `retention_policies`
|
||
|
||
核心资源表需要补充字段:
|
||
|
||
- `tenant_id`
|
||
- `project_id`
|
||
- `visibility`
|
||
- `owner_id`
|
||
- `approval_status`
|
||
- `storage_node_id`
|
||
|
||
需要调整的已有表:
|
||
|
||
- `models`
|
||
- `trained_models`
|
||
- `datasets`
|
||
- `dataset_files`
|
||
- `data_process_tasks`
|
||
- `fine_tune_tasks`
|
||
- `eval_tasks`
|
||
- `inference_tasks`
|
||
- `custom_tools`
|
||
- `audit_logs`
|
||
- `storage_objects`
|
||
|
||
### 9.3 接口补充
|
||
|
||
租户:
|
||
|
||
- `GET /api/tenants`
|
||
- `POST /api/tenants`
|
||
- `GET /api/tenants/{id}`
|
||
- `PUT /api/tenants/{id}`
|
||
- `PUT /api/tenants/{id}/quota`
|
||
- `PUT /api/tenants/{id}/retention-policy`
|
||
|
||
项目:
|
||
|
||
- `GET /api/projects`
|
||
- `POST /api/projects`
|
||
- `GET /api/projects/{id}`
|
||
- `PUT /api/projects/{id}`
|
||
- `POST /api/projects/{id}/archive`
|
||
- `GET /api/projects/{id}/members`
|
||
- `POST /api/projects/{id}/members`
|
||
- `PUT /api/projects/{id}/members/{user_id}`
|
||
- `DELETE /api/projects/{id}/members/{user_id}`
|
||
|
||
资源授权:
|
||
|
||
- `GET /api/resources/{resource_type}/{resource_id}/acl`
|
||
- `PUT /api/resources/{resource_type}/{resource_id}/acl`
|
||
- `POST /api/resources/{resource_type}/{resource_id}/share`
|
||
|
||
审批:
|
||
|
||
- `GET /api/approvals`
|
||
- `POST /api/approvals`
|
||
- `GET /api/approvals/{id}`
|
||
- `POST /api/approvals/{id}/approve`
|
||
- `POST /api/approvals/{id}/reject`
|
||
- `POST /api/approvals/{id}/cancel`
|
||
|
||
算力:
|
||
|
||
- `GET /api/compute/nodes`
|
||
- `GET /api/compute/gpus`
|
||
- `GET /api/compute/queue`
|
||
- `POST /api/compute/jobs/{id}/retry`
|
||
- `POST /api/compute/jobs/{id}/priority`
|
||
|
||
训练引擎:
|
||
|
||
- `GET /api/training-engines`
|
||
- `GET /api/training-engines/{id}`
|
||
- `POST /api/training-engines/{id}/health-check`
|
||
- `GET /api/training-engines/{id}/schema`
|
||
|
||
## 10. 端到端业务流程
|
||
|
||
### 10.1 数据集上传
|
||
|
||
1. 用户进入项目空间。
|
||
2. 用户创建数据集。
|
||
3. 应用平台校验项目写权限和磁盘配额。
|
||
4. 前端上传文件到应用平台。
|
||
5. 应用平台转发到算力文件网关,保存到项目目录。
|
||
6. 算力平台返回文件元数据和 checksum。
|
||
7. 应用平台登记数据集文件版本。
|
||
8. 审计记录上传行为。
|
||
|
||
### 10.2 微调训练
|
||
|
||
1. 用户选择项目、模型、数据集、训练参数和 GPU。
|
||
2. 应用平台检查模型/数据集 `execute` 权限。
|
||
3. 检查项目 GPU 并发配额。
|
||
4. 如果策略要求审批,先创建审批单。
|
||
5. 审批通过后创建 compute job。
|
||
6. 算力平台锁定 GPU,生成 LLaMA-Factory 配置,启动训练。
|
||
7. 训练日志和指标实时回传。
|
||
8. 完成后登记 trained model。
|
||
9. 如启用自动合并,进入合并任务。
|
||
10. 审计记录任务全生命周期。
|
||
|
||
### 10.3 模型发布
|
||
|
||
1. 用户选择训练产物。
|
||
2. 提交发布申请。
|
||
3. 审批通过后算力平台启动推理服务。
|
||
4. 分配端口和 GPU。
|
||
5. 应用平台登记服务实例。
|
||
6. 前端推理页面调用服务。
|
||
7. 监控调用量、延迟、错误率、GPU 占用。
|
||
|
||
## 11. 当前功能完整性评估
|
||
|
||
补充 6 条需求后,平台设计已经覆盖完整模型训练平台的主链路:
|
||
|
||
- 数据准备。
|
||
- 数据处理。
|
||
- 模型登记。
|
||
- 微调训练。
|
||
- 训练日志和指标。
|
||
- 模型合并和导出。
|
||
- 模型评测。
|
||
- 推理服务。
|
||
- 模型对比。
|
||
- 用户、权限、租户、项目隔离。
|
||
- 审批、审计、保留策略。
|
||
- 算力资源调度。
|
||
|
||
但如果目标是企业级生产平台,还建议继续确认以下缺口。
|
||
|
||
## 12. 仍需确认的问题
|
||
|
||
1. 本地磁盘是否在算力服务器上,应用服务器是否完全不保存训练文件?如果应用服务器也要保存上传临时文件,需要确认临时文件保留周期和容量。
|
||
2. 单机多 GPU 是否需要支持 MIG、GPU 分片或多进程共享,还是一张 GPU 同一时间只给一个任务?
|
||
3. 是否允许训练任务抢占?高优先级任务是否能停止低优先级任务?
|
||
4. 是否需要离线导入已有模型和已有数据集目录,还是所有文件都必须从平台上传?
|
||
5. 模型发布是否区分“测试服务”和“生产服务”?生产发布是否必须审批?
|
||
6. 是否需要数据集脱敏、敏感字段识别和数据质量评分作为内置流程?
|
||
7. 是否需要人工评测/人工复核结果沉淀为新数据集?
|
||
8. 是否需要训练任务失败后的断点续训?
|
||
9. 是否需要 checkpoint 自动清理策略,例如只保留最近 N 个或最好 N 个?
|
||
10. 是否需要对外提供标准 API 给其他系统调用训练、评测、推理能力?
|
||
11. 是否需要接入企业统一身份认证,例如 LDAP、OIDC、企业微信、钉钉?
|
||
12. 是否需要成本核算:按租户/项目统计 GPU 小时、磁盘占用、模型调用量?
|
||
13. 多算力节点是否需要节点组、租户绑定节点或项目绑定节点策略?
|
||
14. 跨节点资源同步是否需要限速、同步窗口和管理员审批?
|
||
|
||
## 13. 推荐决策补充
|
||
|
||
`system-development-plan.md` 已对上述问题给出第一版建议,需求设计以以下决策为准。
|
||
|
||
1. 本地磁盘主存储放在算力服务器,应用服务器只保留上传临时文件。临时文件默认保留 24 小时,成功转发到算力文件网关后可立即进入清理队列。
|
||
2. 第一版不支持 MIG、GPU 分片和多任务共享同一张 GPU。一张 GPU 同一时间只分配给一个训练任务或一个推理服务。GPU 数据模型预留 `partition_type`、`parent_gpu_uuid`、`memory_total_mb`,便于后续扩展 MIG。
|
||
3. 第一版不做自动抢占。支持任务优先级和排队;停止他人任务需要审批或平台管理员权限。
|
||
4. 多算力节点仍按“单机多 GPU 节点”管理,每个节点独立部署算力服务和 LLaMA-Factory;节点之间不互相访问,由应用平台统一调度和资源同步。
|
||
5. 多节点调度默认自动选择节点,同时支持管理员/高级用户手动指定节点;调度优先考虑节点健康、标签、权重、空闲 GPU、队列长度和资源副本是否已存在。
|
||
6. 第一版必须支持离线导入已有模型和数据集目录。导入由算力 Agent 扫描、校验、登记,并归属指定租户和项目。
|
||
7. 模型发布区分测试服务和生产服务。测试服务项目内可启动并默认限流;生产服务必须审批。
|
||
8. 数据脱敏和数据质量评分作为数据处理模块的一等能力进入第一期,先实现规则版脱敏、格式校验、重复率、完整性、长度分布等指标。
|
||
9. 人工评测/复核作为第二期功能,但第一期需在数据库和页面入口预留人工复核状态与修订字段。
|
||
10. 第一版支持从 checkpoint 手动恢复训练,不做自动失败续训。失败任务可选择 checkpoint 重试。
|
||
11. 第一版必须支持 checkpoint 自动清理策略:默认保留最近 3 个、最优 2 个;已发布模型关联 checkpoint 不自动删除;失败任务 checkpoint 默认保留 14 天。
|
||
12. 第一版提供内部 API,第二期再开放面向其他系统的标准 API、API Key、限流和 Webhook。
|
||
13. 第一版使用本地账号,预留 OIDC/LDAP 字段和认证 provider 抽象;第二期接入企业统一身份认证。
|
||
14. 第一版做 GPU 小时、磁盘占用、任务时长、推理调用量等用量统计;第二期再做成本单价和账单核算。
|
||
|
||
以上决策需要同步反映在接口文档、数据库 SQL、前端页面和部署方案中。第一版实现不再阻塞于这些问题的反复确认,除非实际部署环境与假设明显冲突。
|
||
|
||
## 14. 页面功能模块映射
|
||
|
||
本节用于帮助前端、后端、DB 和测试人员理解需求对应到哪些页面与功能模块。页面路径以当前 Vue 路由和新增规划路由为准。
|
||
|
||
### 14.1 平台入口与全局能力
|
||
|
||
| 页面模块 | 路由/入口 | 对应需求 | 主要功能 |
|
||
| --- | --- | --- | --- |
|
||
| 登录页 | `/login` | 用户认证、本地账号、后续预留 OIDC/LDAP | 登录、会话创建、权限加载 |
|
||
| 主布局 | `/` | 全局项目上下文、权限控制 | 菜单、顶部状态、项目切换器、用户信息 |
|
||
| 无权限页 | `/permission-denied` | 页面权限和资源权限兜底 | 展示无权限原因、返回可访问页面 |
|
||
| 服务看板 | `/dashboard` | 平台运行总览 | 服务健康、任务概览、训练统计、用户操作分布 |
|
||
|
||
### 14.2 租户、项目与权限治理
|
||
|
||
| 页面模块 | 建议路由 | 对应需求 | 主要功能 |
|
||
| --- | --- | --- | --- |
|
||
| 租户管理 | `/tenants`、`/tenants/:id` | 多租户、租户配额、留存策略 | 租户列表、创建/禁用租户、配额、审计留存策略 |
|
||
| 项目空间 | `/projects`、`/projects/:id` | 项目级隔离、项目资源聚合 | 项目列表、项目概览、资源统计、项目归档 |
|
||
| 项目成员 | `/projects/:id/members` | 项目角色 | 添加成员、移除成员、设置 owner/maintainer/developer/reviewer/viewer |
|
||
| 资源授权 | `/projects/:id/permissions` 或资源详情弹窗 | 模型/数据集/任务级 ACL | 按用户、项目角色授权 read/write/execute/download/delete/manage_acl |
|
||
| 用户中心 | `/user-settings`、`/user-settings/create`、`/user-settings/:id/permission` | 用户、角色、页面权限 | 用户列表、创建用户、禁用、重置密码、分配页面权限和项目 |
|
||
|
||
### 14.3 数据链路
|
||
|
||
| 页面模块 | 路由/入口 | 对应需求 | 主要功能 |
|
||
| --- | --- | --- | --- |
|
||
| 数据集列表 | `/dataset` | 数据集管理、项目隔离 | 列表、搜索、下载、删除审批入口 |
|
||
| 数据集创建/编辑 | `/dataset/create`、`/dataset/:id/edit` | 上传、本地磁盘、文件网关 | 创建数据集、上传文件、离线导入、元数据编辑 |
|
||
| 数据集预览 | `/dataset/:id/preview` | 文件版本、在线编辑、乐观锁 | 文件预览、版本切换、保存新版本、下载 |
|
||
| 数据处理列表 | `/data-process` | 数据处理任务管理 | 任务列表、状态、输出数据集跳转、删除审批 |
|
||
| 数据处理创建向导 | `/data-process/create` | 清洗、切片、生成、质量评分、脱敏 | 任务配置、模型选择、源文件/外部源、预览切片、生成、结果编辑、发布数据集 |
|
||
| 数据处理详情 | `/data-process/:id` | 处理统计和结果追踪 | 运行信息、处理统计、失败原因、结果明细 |
|
||
| 数据转换 | `/data-convert` | JSON/JSONL 转换 | 上传 JSON、转换任务、下载结果 |
|
||
|
||
### 14.4 模型训练链路
|
||
|
||
| 页面模块 | 路由/入口 | 对应需求 | 主要功能 |
|
||
| --- | --- | --- | --- |
|
||
| 模型管理 | `/model-manage` | 模型登记、离线导入、资源 ACL | 基座模型/API 模型列表、用途变更、授权、删除审批 |
|
||
| 模型创建/编辑 | `/model-manage/create`、`/model-manage/:id/edit` | 本地模型/API 模型登记 | 选择本地路径、填写 API 模型信息、加密 API Key |
|
||
| 权重合并 | `/model-manage/merge` | LoRA 合并、产物管理 | 选择训练产物、合并权重、生成 merged model |
|
||
| 微调任务列表 | `/fine-tune` | 训练任务管理 | 任务列表、状态、进度、停止/删除审批 |
|
||
| 微调创建 | `/fine-tune/create` | LLaMA-Factory 训练配置、GPU 调度 | 选择模型/数据集/GPU、训练参数、量化导出、提交审批或启动 |
|
||
| 训练日志详情 | `/training-log/:id` | 日志、指标、checkpoint、恢复训练 | 日志 tail、loss 曲线、GPU 状态、checkpoint 列表、恢复/重试 |
|
||
| 训练引擎管理 | `/training-engines` | LLaMA-Factory 插件化和后续引擎接入 | 引擎列表、能力声明、schema、健康检查 |
|
||
|
||
### 14.5 评测、推理和发布
|
||
|
||
| 页面模块 | 路由/入口 | 对应需求 | 主要功能 |
|
||
| --- | --- | --- | --- |
|
||
| 评测列表 | `/model-eval` | 模型评测 | 评测任务列表、状态、分数、删除 |
|
||
| 评测创建 | `/model-eval/create` | 自动评测、LLM Judge、基础指标 | 选择模型/数据集/维度/GPU、配置指标、启动评测 |
|
||
| 评测详情 | `/model-eval/:id` | 样本级结果、人工复核预留 | 综合评价、维度汇总、样本评分、错误类型 |
|
||
| 评测维度 | `/model-eval/dimension/:id/edit` | 维度和评测 Prompt 管理 | 创建/编辑维度、评分范围、Prompt、启用状态 |
|
||
| 推理列表 | `/model-inference` | 测试推理服务 | 推理任务列表、加载/卸载、服务状态 |
|
||
| 推理创建 | `/model-inference/create` | 模型服务资源申请 | 选择模型、GPU、端口策略、并发参数 |
|
||
| 推理对话 | `/model-inference/chat/:id` | 模型对话 | 单模型流式对话、会话记录 |
|
||
| 模型对比 | `/model-compare/chat/:id`、`/model-compare/result` | 多模型对比 | 多模型加载、并行对话、对比结果 |
|
||
| 模型发布治理 | `/model-services`、`/model-services/:id` | 测试/生产服务、发布审批 | 测试服务启动、生产发布申请、调用统计、下线审批 |
|
||
|
||
### 14.6 算力、审批、审计和运维
|
||
|
||
| 页面模块 | 建议路由 | 对应需求 | 主要功能 |
|
||
| --- | --- | --- | --- |
|
||
| 算力资源中心 | `/compute`、`/compute/gpus` | 单机多 GPU、资源锁定、队列 | GPU 卡片、任务占用、节点状态、队列、优先级 |
|
||
| 存储管理 | `/storage` | 本地磁盘、配额、清理 | 租户/项目占用、大文件、临时文件、checkpoint 清理 |
|
||
| 审批中心 | `/approvals`、`/approvals/pending`、`/approvals/mine`、`/approvals/:id` | 审批流 | 我的申请、待我审批、审批详情、通过/驳回/撤回 |
|
||
| 审批模板 | `/approval-settings` | 审批策略配置 | 按动作配置审批人、超时、风险级别 |
|
||
| 审计中心 | `/audit-logs`、`/login-logs`、`/download-logs` | 操作审计和留存 | 操作审计、登录审计、下载审计、筛选导出 |
|
||
| 平台性能 | `/hardware` | 系统监控 | CPU、内存、磁盘、GPU、进程 |
|
||
| 系统日志 | `/logs` | 日志查看 | 系统日志、训练日志、tail/offset 查询 |
|