# 平台治理功能使用指南

> 版本：v1.1
> 日期：2026-08-13
> 适用版本：YG Fine-Tune Platform v1.0+
> 更新说明：移除页面权限码设计，改为基于角色的简化权限模型

---

## 目录

1. [快速入门](#1-快速入门)
2. [用户与权限管理](#2-用户与权限管理)
3. [GPU 算力分配](#3-gpu-算力分配)
4. [资源可见性与隔离](#4-资源可见性与隔离)
5. [审批流程管理](#5-审批流程管理)
6. [审计日志查询](#6-审计日志查询)
7. [常见问题与排查](#7-常见问题与排查)

---

## 1. 快速入门

### 1.1 平台治理是什么？

平台治理是一套**多租户、多角色、细粒度权限控制**体系，用于在多人协作使用 AI 微调平台时，确保：

- 每个用户只能看到和操作自己有权限的资源
- GPU 算力按需分配，避免资源争抢
- 高风险操作（删除、停止任务）有审批记录可追溯
- 所有操作都有审计日志

### 1.2 三种内置角色

| 角色 | 能做什么 | 不能做什么 |
|---|---|---|
| **超级管理员 (admin)** | 全部操作；管理用户、分配 GPU、审批、查看全部资源 | — |
| **操作员 (operator)** | 创建数据集/模型、训练/评测/推理任务 | 管理用户、分配 GPU、修改他人权限 |
| **观察员 (viewer)** | 查看被授权的资源 | 创建或修改任何资源 |

### 1.3 入口在哪里？

所有治理功能集中在左侧导航栏的 **「系统设置」** 和 **「平台治理」** 分组下：

```
系统设置
├── 用户设置        ← 用户 CRUD + 角色权限 + 密码管理（仅 admin）
├── 平台性能        ← 系统监控
└── 查看日志        ← 日志查看

平台治理
├── 租户管理        ← 组织/团队（仅 admin）
├── 项目空间        ← 项目级资源隔离（仅 admin）
├── 审批模板        ← 定义哪些操作需要审批（仅 admin）
├── 审批中心        ← 处理待审批请求（仅 admin）
└── 审计日志        ← 查看所有操作记录（仅 admin）

算力资源
└── 算力节点        ← GPU 分配与管理（仅 admin）
```

> ⚠️ 以上菜单**只有 admin 用户能看到**。普通用户登录后不会出现这些入口。
>
> **重要变更（v1.1）**：非 admin 用户**默认可以访问所有业务功能菜单**（模型训练、评测、推理、数据集、数据处理等），无需管理员单独分配权限。

---

## 2. 用户与权限管理

### 2.1 权限模型概述（v1.1 更新）

平台采用**基于角色的简化权限模型**：

| 用户类型 | 可见菜单 | 说明 |
|---------|---------|------|
| **admin（管理员）** | **全部菜单** | 包括用户设置、平台治理、算力节点等管理功能 |
| **非 admin 用户** | **除管理功能外的所有业务菜单** | 模型训练/评测/推理、数据集、数据处理、日志等 |

> **核心原则**：
> - 非 admin 用户**默认拥有所有业务功能的访问权限**，无需单独分配
> - 仅以下功能**仅管理员可见**：
>   - `用户设置`（用户 CRUD、角色管理）
>   - `平台治理`（租户管理、项目空间、审批模板/中心、审计日志）
>   - `算力节点`（GPU 分配）
>
> 资源级别的访问控制通过 **ACL（访问控制列表）** 实现，详见第 4 章。

### 2.2 创建用户

**路径**：`用户设置` → `创建用户`

1. 以 admin 身份登录平台
2. 进入「用户设置」页面
3. 点击右上角「创建用户」按钮
4. 填写信息：
   - **账号**：登录用户名（如 `zhangsan`）
   - **显示名称**：如 `张三`
   - **密码**：初始密码（默认 `Platform@123`）
   - **角色**：选择 `admin` / `operator` / `viewer`
5. 点击保存

创建后用户可以立即用该账号登录，**无需额外分配页面权限**。

### 2.3 管理员专属功能

以下功能**仅 admin 角色可见**，对其他用户隐藏：

| 功能分组 | 包含菜单 | 路由前缀 |
|---------|---------|----------|
| 系统设置 - 用户设置 | 用户列表、创建用户、重置密码 | `/user-settings` |
| 平台治理 - 租户管理 | 租户列表、配额设置 | `/tenants` |
| 平台治理 - 项目空间 | 项目列表、成员管理、ACL | `/projects` |
| 平台治理 - 审批模板 | 审批流程定义 | `/approval-templates` |
| 平台治理 - 审批中心 | 待审批请求处理 | `/approval-instances` |
| 平台治理 - 审计日志 | 操作记录查询与导出 | `/audit-logs` |
| 算力资源 - 算力节点 | GPU 分配与管理 | `/compute` |

### 2.4 重置用户密码

**两种方式**：

**方式一：管理员重置**
1. 在用户列表中找到目标用户
2. 点击「重置密码」
3. 输入新密码，确认

**方式二：用户自行修改**
1. 用户登录后在「用户设置」页面点击「修改密码」按钮
2. 输入旧密码 + 新密码（至少 6 位）
3. 确认修改

### 2.5 删除用户

**路径**：`用户设置` → 用户列表 → 操作列「删除」

> ⚠️ 删除用户时会**级联清理**其所有关联数据：
> - 该用户创建的数据集、基座模型、微调产物、评测任务
> - 该用户的 ACL 授权记录、GPU 分配记录
> - 该用户的审批实例、审计日志、项目成员关系、登录会话
> - **训练任务保留不删**（避免算力节点上的物理任务数据不一致）

---

## 3. GPU 算力分配

### 3.1 为什么需要 GPU 分配？

当服务器有多张 GPU 卡（如 8×A800）时，需要指定**哪个用户能用哪张卡**：

- 避免两个人同时选同一张卡导致训练冲突
- 按团队/项目隔离算力资源
- 控制每个用户的 GPU 配额

### 3.2 分配 GPU（仅 admin）

**路径**：`算力节点` → `GPU 分配` 标签页

1. 以 admin 登录，进入「算力节点」页面
2. 点击顶部的 **「GPU 分配」** 标签（只有 admin 可见）
3. 点击 **「分配 GPU」** 按钮
4. 填写：
   - **算力节点**：选择节点（如 `gpu-node-01`）
   - **GPU 序号**：卡号（0, 1, 2, ... 7）
   - **用户**：选择要分配给谁
5. 点「确认分配」

示例：把节点 `gpu-node-01` 的第 0、1 号卡分配给用户 `zhangsan`：

```
┌─────────────────────────────────────┐
│  分配 GPU                    [×]  │
├─────────────────────────────────────┤
│  算力节点:  [gpu-node-01 ▼]         │
│  GPU 序号:  [0          ▲]         │
│  用户:      [zhangsan    ▼]         │
│                                     │
│       [取消]     [确认分配]         │
└─────────────────────────────────────┘
```

分配后的效果：

| 用户 | 可用 GPU |
|---|---|
| admin | 全部 GPU（不需要显式分配） |
| zhangsan | gpu-node-01 的 0、1 号卡 |
| lisi | （未分配，不可用） |

### 3.3 撤销分配

在 GPU 分配列表中，每条记录右侧有「撤销」按钮，点击后确认即可移除该分配。

### 3.4 用户视角：创建训练任务时的 GPU 选择

- **admin**：下拉列表显示全部可用 GPU
- **被分配了 GPU 的用户**：只显示被分配给自己的卡
- **未分配任何 GPU 的用户**：显示提示「未分配 GPU，请联系管理员」，无法提交训练任务

---

## 4. 资源可见性与隔离

### 4.1 自动生效的隔离规则

无需手动配置，以下规则自动生效：

| 资源类型 | admin 看到 | 普通用户看到 |
|---|---|---|
| **基座模型**（容器内注册的本地模型） | 全部 | **全部**（共享资源） |
| **数据集** | 全部 | **自己创建的** + 被 ACL 授权的 |
| **微调产物**（训练输出的模型） | 全部 | **自己训练的** + 被 ACL 授权的 |
| **评测任务** | 全部 | **自己创建的** + 被 ACL 授权的 |
| **推理/对比任务** | 全部 | **自己创建的** + 被 ACL 授权的 |

### 4.2 实际场景示例

假设有三个用户：**admin**、**zhangsan**（算法工程师）、**lisi**（标注员）

```
zhangsan 上传了数据集 ds_alpaca、ds_sharegpt
zhangsan 训练出了模型 ft_qwen_001
lisi 上传了数据集 ds_label
admin 注册了基座模型 Qwen3-1.7B
```

各用户看到的资源：

| 用户 | 数据集 | 基座模型 | 微调产物 |
|---|---|---|---|
| **admin** | ds_alpaca, ds_sharegpt, ds_label (3个) | Qwen3-1.7B | ft_qwen_001 |
| **zhangsan** | ds_alpaca, ds_sharegpt (2个) | Qwen3-1.7B | ft_qwen_001 |
| **lisi** | ds_label (1个) | Qwen3-1.7B | (无) |

### 4.3 ACL 资源授权（高级用法）

如果 zhangsan 想让 lisi 也能看到自己的数据集 `ds_alpaca`：

> 此功能需要在资源详情页提供「资源授权」按钮（前端已预留接口），当前可通过 API 直接操作：

```bash
# 授予 lisi 对 ds_alpaca 的读权限
curl -X PUT /modelTF/resources/dataset/ds_alpaca_id/acl \
  -H "Authorization: Bearer platform-token-admin" \
  -d '{
    "acls": [
      {"principal_type": "user", "principal_id": "lisi_id", "permission": "read"}
    ]
  }'
```

---

## 5. 审批流程管理

### 5.1 哪些操作会触发审批？

| 操作 | 触发条件 | 处理方式 |
|---|---|---|
| 删除他人的数据集 | 非 admin 删除别人创建的数据集 | 创建审批实例 或 admin 直接执行 |
| 删除他人的模型 | 非 admin 删除别人创建的模型 | 同上 |
| 停止他人的训练任务 | 非 admin 停止别人发起的任务 | 同上 |
| 归档/删除项目空间 | 存在待审批变更时 | 拒绝执行 |

**核心规则**：admin 做任何操作都直接执行（旁路）；普通用户操作他人资源时进入审批流程。

### 5.2 审批流程示意

```
普通用户 lisi 尝试删除 zhangsan 的数据集
                │
                ▼
    ┌───────────────────────┐
    │ 后端检查：是 admin 吗？ │
    └──────┬────────────────┘
           │ 否
           ▼
    ┌───────────────────────┐
    │ 创建审批实例            │
    │ status = pending       │
    │ 返回 202（待审批）     │
    └──────────┬────────────┘
               │
               ▼
    ┌───────────────────────┐
    │ admin 在「审批中心」看到 │
    │ 这条待审批请求           │
    │ 点击「通过」或「拒绝」   │
    └──────────┬────────────┘
           │
     ┌─────┴─────┐
     │           │
  通过        拒绝
     │           │
     ▼           ▼
 执行删除    不执行
+审计日志   +审计日志
```

### 5.3 管理审批

**路径**：`平台治理` → `审批中心`

1. 查看待审批列表（status=pending）
2. 点击某条记录查看详情
3. 决策：「通过」或「拒绝」
4. 决策结果自动执行对应操作并记录审计日志

**审批模板**（`平台治理` → `审批模板`）：定义每种操作需要几步审批、每步谁来审。默认模板都是单步（admin 审批即可）。

---

## 6. 审计日志查询

### 6.1 什么是审计日志？

平台上所有**写操作**和**敏感操作**都会自动记录审计日志，包括：

- 用户创建/删除/修改
- 权限变更
- GPU 分配/撤销
- 资源上传/删除
- 训练任务启动/停止
- 审批决策

### 6.2 查询审计日志

**路径**：`平台治理` → `审计日志`

支持筛选条件：

| 筛选项 | 说明 |
|---|---|
| 操作人 | 按用户 ID 过滤 |
| 动作类型 | 如 `user.create`, `dataset.delete`, `gpu.assign` 等 |
| 目标资源类型 | dataset / model / fine_tune_task 等 |
| 时间范围 | 开始时间 ~ 结束时间 |

### 6.3 导出审计日志

审计日志页面底部有「导出 CSV」按钮，导出的文件包含当前筛选条件下的全部记录，可用于合规审计或问题追溯。

### 6.4 日志保留策略

审计日志受**留存策略**控制（`平台治理` → 租户管理 → 绑定留存策略）。默认保留 30 天，超期自动清理。

---

## 7. 常见问题与排查

### Q1: 普通用户看不到某个菜单？

根据 v1.1 权限模型：
1. **业务菜单**（训练、评测、推理、数据集等）：普通用户**默认全部可见**，无需分配
2. **管理菜单**（用户设置、租户管理、算力节点等）：**仅 admin 可见**，这是设计如此

如果普通用户看不到业务菜单，请检查：
- 用户是否正常登录（token 是否有效）
- 用户状态是否为 `active`（未被停用）

### Q2: 用户创建训练任务时报错"无权使用所选 GPU"

说明该用户没有被分配所选择的 GPU 卡。解决方法：
1. admin 进入「算力节点」→「GPU 分配」标签页
2. 为该用户分配对应的 GPU
3. 用户刷新页面重新选择 GPU

### Q3: 删除用户后看板还显示残留数据？

正常情况下 `delete_user` 会级联清理关联数据。如果仍有残留：
- **训练任务**：设计上保留不删（避免算力节点物理数据不一致），这是预期行为
- **登录时长排行**：可能来自旧的 session 记录（已修复：改用 INNER JOIN 过滤已删除用户）

### Q4: 审批实例一直 pending 没人处理？

审批实例需要 admin 在「审批中心」手动处理。如果长时间无人处理：
- 可以在数据库中直接将 `approval_instances.status` 改为 `rejected`
- 或者由 admin 直接以自身身份执行该操作（admin 有旁路权限）

### Q5: 如何查看当前所有 GPU 分配情况？

```bash
# admin 调用接口
curl -H "Authorization: Bearer platform-token-admin" \
  /modelTF/compute/gpu-assignments
```

返回格式：
```json
{
  "data": [
    {
      "id": "ga_xxx",
      "node_name": "A800 训练节点",
      "gpu_index": 0,
      "display_name": "张三",
      "assigned_at": "2026-08-10T10:00:00"
    }
  ]
}
```

### Q6: 用户忘记密码怎么办？

两种方案：
1. **admin 重置**：在「用户设置」→ 用户列表 →「重置密码」
2. **用户自助修改**：用户登录后点击「修改密码」（需知道旧密码）

如果是完全忘记且不是 admin，只能由 admin 重置。

### Q7: 为什么移除了「页面权限」功能？（v1.1 变更说明）

旧版本要求管理员为每个用户单独分配页面权限码，这导致：
- 新用户创建后需要额外操作才能使用系统
- 权限配置复杂，容易出错
- 与实际使用场景不匹配（大多数用户需要访问大部分功能）

**新模型（v1.1）**简化为：
- 非 admin 用户**默认拥有所有业务功能的访问权限**
- 仅管理员专属功能（用户管理、平台治理、算力节点）受角色限制
- 资源级别控制通过 ACL 实现，更灵活

---

## 附录：API 快速参考

| 功能 | 方法 | 路径 | 鉴权 |
|---|---|---|---|
| 查看我的 GPU | GET | `/compute/my-gpus` | 登录用户 |
| 查看 GPU 分配 | GET | `/compute/gpu-assignments` | admin |
| 分配 GPU | POST | `/compute/gpu-assignments` | admin |
| 撤销 GPU 分配 | DELETE | `/compute/gpu-assignments/{id}` | admin |
| 修改自己的密码 | POST | `/users/me/password` | 登录用户 |
| 查看审计日志 | GET | `/system/audit-logs` | admin |
| 导出审计日志 | GET | `/system/audit-logs/export` | admin |
| 查看审批列表 | GET | `/approvals` | 登录用户 |
| 审批决策 | POST | `/approvals/:id/steps/:idx/decision` | 审批人 |
