K8s Lab 把当前仓库文档整理成一个可阅读的网页站点

Repository Reading Site

训练模块 — 功能设计与页面规划

--- | 方式 | 原理 | 训练参数量 | 显存需求 | 训练时间 | 效果 | 适用场景 | |------|------|-----------|---------|---------|------|---------| | **LoRA** | 冻结原模型,只训练低秩矩阵 | 原始的 0.1-1% | 低(7B→8GB) | 快 | 好 | 绝大多

Markdownsaas-platform/docs/training-module-design.md2026年4月9日 15:58

训练模块 — 功能设计与页面规划

一、训练在平台中的定位

用户的核心需求:
  "我有一堆客服对话数据,想让通用大模型变成我的专属客服模型"
  "我有行业文档,想让模型说我们行业的术语"
  "通用模型回答不够好,我想让它按我的风格回答"

平台提供:
  选基座 → 传数据 → 点开始 → 等完成 → 一键部署
  用户不需要懂 PyTorch、不需要有 GPU、不需要写训练代码

二、训练方式

2.1 方式对比

方式 原理 训练参数量 显存需求 训练时间 效果 适用场景
LoRA 冻结原模型,只训练低秩矩阵 原始的 0.1-1% 低(7B→8GB) 绝大多数场景
QLoRA LoRA + 4bit 量化基座 同 LoRA 更低(7B→4GB) 稍快 接近 LoRA GPU 显存有限
全量微调 更新所有参数 100% 极高(7B→28GB+) 最好 大预算/追求极致
Prompt Tuning 只训练 prompt 向量 极少 极低 极快 一般 快速实验
RLHF/DPO 基于人类偏好对齐 取决于方法 对齐人类偏好 安全/风格对齐

2.2 为什么 LoRA 是首选?

全量微调 7B 模型:
  模型参数: 7B × 2 bytes (FP16) = 14GB
  梯度:     7B × 2 bytes = 14GB
  优化器:   7B × 8 bytes (Adam) = 56GB
  总计:     ~84GB → 需要 A100 80G

LoRA 微调 7B 模型:
  基座模型 (冻结): 14GB
  LoRA 矩阵:       ~50MB (rank=16)
  梯度+优化器:      ~200MB
  总计:             ~15GB → A10 24G 就够

LoRA 原理:
  原始权重矩阵 W (4096×4096) — 冻结不动
  新增两个小矩阵: A (4096×16) × B (16×4096)
  推理时: output = W·x + A·B·x
  
  只训练 A 和 B,参数量从 16M 降到 131K(降低 99.2%)
  但效果能达到全量微调的 90-95%

2.3 DPO 对齐训练

场景: 模型能回答问题了,但有时候回答不够好
     比如: 太啰嗦、语气不对、格式不好

DPO (Direct Preference Optimization) 流程:
  1. 准备偏好数据:
     问题 + 好的回答(chosen) + 差的回答(rejected)
  2. 训练目标:
     让模型更倾向于生成 chosen 风格的回答
     远离 rejected 风格

数据格式:
  {"prompt": "退货流程是什么",
   "chosen": "退货流程:\n1. 打开订单页...\n2. 点击退货...",
   "rejected": "你好亲,退货的话要看具体情况呢,一般来说是这样的...(太啰嗦)"}

三、训练全流程

┌────────┐    ┌────────┐    ┌────────┐    ┌────────┐    ┌────────┐
│ 1.选模型 │───→│ 2.选数据│───→│ 3.配参数│───→│ 4.训练  │───→│ 5.评估  │
└────────┘    └────────┘    └────────┘    └────────┘    └────────┘
                                              │              │
                                              ▼              ▼
                                         ┌────────┐    ┌────────┐
                                         │ 6.部署  │←──│ 7.对比  │
                                         └────────┘    └────────┘

步骤 1: 选择基座模型

可微调的基座模型:

模型                参数    LoRA 显存   训练速度         推荐场景
Qwen2.5-1.5B       1.5B   3GB        极快(5min/epoch)  快速实验/轻量场景
Qwen2.5-7B         7B     8GB        快(20min/epoch)   主力选择
Qwen2.5-14B        14B    16GB       中(40min/epoch)   高质量需求
Qwen2.5-72B        72B    多卡       慢(3h/epoch)      顶级需求
Llama-3.2-3B       3B     5GB        快(10min/epoch)   英文场景
CodeLlama-7B       7B     8GB        快(20min/epoch)   代码生成

选择建议:
  数据 < 1000条: 选 1.5B-3B,大模型容易过拟合
  数据 1000-10000条: 选 7B,性价比最高
  数据 > 10000条: 可选 14B+
  预算有限: QLoRA + 7B

步骤 2: 数据准备

数据要求:
  格式: JSONL 对话格式
  最少: 100 条(建议 500+)
  最多: 无上限(但要考虑费用)
  质量: 比数量更重要

数据质量检查清单:
  ✅ 格式正确且一致
  ✅ 回答质量高(不是敷衍回答)
  ✅ 覆盖主要场景(不要 90% 都是同一种问题)
  ✅ 回答风格一致(不要有的长有的短)
  ✅ 无矛盾数据(同一问题不同答案)
  ✅ 无敏感/有害内容
  ✅ Token 长度适中(过长会截断,过短学不到东西)

步骤 3: 训练参数配置

关键超参数:

┌─────────────────────────────────────────────────────────────┐
│ 参数              │ 默认值  │ 范围      │ 说明              │
├─────────────────────────────────────────────────────────────┤
│ epochs            │ 3      │ 1-10     │ 遍历数据集次数      │
│ learning_rate     │ 2e-5   │ 1e-6~1e-4│ 太大震荡,太小不动  │
│ batch_size        │ 4      │ 1-32     │ 受显存限制          │
│ lora_rank         │ 16     │ 4-128    │ 越大能力越强但越慢  │
│ lora_alpha        │ 32     │ rank的2倍│ 缩放因子           │
│ lora_target       │ 全部    │ 可选层   │ 对哪些层做 LoRA    │
│ max_seq_length    │ 2048   │ 512-8192 │ 最大序列长度        │
│ warmup_ratio      │ 0.1    │ 0-0.2    │ 学习率预热比例      │
│ gradient_accumulation│ 4   │ 1-16     │ 等效增大 batch_size │
│ weight_decay      │ 0.01   │ 0-0.1    │ 正则化防过拟合      │
└─────────────────────────────────────────────────────────────┘

预设方案(降低用户门槛):
  🟢 快速体验: epochs=1, lr=5e-5, rank=8       — 5分钟出结果
  🟡 标准训练: epochs=3, lr=2e-5, rank=16      — 推荐
  🔴 精细训练: epochs=5, lr=1e-5, rank=64      — 耗时但效果最好
  ⚙️ 自定义:   全部参数可调

步骤 4: 训练执行

K8s 执行流程:

用户提交训练请求
    │
    ▼
Training Service 创建 TrainingJob CR
    │
    ▼
Training Operator 检测到 CR
    │
    ├── 检查 GPU 资源 → 不足则排队
    │
    ▼
创建 K8s Job:
    ├── Init Container: 下载基座模型到本地(如果未缓存)
    ├── Main Container: 执行训练脚本
    │     ├── 加载数据集 (从 S3/NFS)
    │     ├── 加载基座模型
    │     ├── 配置 LoRA
    │     ├── 训练循环
    │     │     ├── 每 N 步: 记录 loss → Prometheus
    │     │     ├── 每 N 步: 保存 Checkpoint → S3
    │     │     └── 每 epoch: 在验证集上评估
    │     ├── 保存最终模型
    │     └── 上传模型到 S3
    └── Sidecar Container: 指标上报 (GPU 利用率/显存/进度)

    │
    ▼
训练完成 → 更新 TrainingJob CR Status
    │
    ▼
Training Service 通知用户(WebSocket/邮件/Webhook)

步骤 5: 模型评估

自动评估:
  1. 在验证集上计算 loss
  2. 生成样本回答 → 与参考答案对比(BLEU/ROUGE)
  3. 与基座模型对比 → 计算提升幅度

人工评估:
  1. 随机抽取 N 个问题
  2. 基座模型 + 微调模型各回答一次
  3. 用户盲评:哪个更好
  4. 统计胜率

步骤 6: 部署上线

微调产出:
  LoRA: adapter_model.safetensors (~50-200MB)
  
部署方式:
  方式 A: LoRA 挂载(推荐)
    基座模型共享 + LoRA 权重按需加载
    优点: 省显存,一张卡可服务多个 LoRA 模型
    vLLM 支持多 LoRA 并行推理

  方式 B: 合并部署
    基座 + LoRA 合并为完整模型
    优点: 推理速度略快
    缺点: 不能共享基座,每个模型占满显存

多 LoRA 共享推理:
  ┌──────────────────────────────┐
  │ vLLM 推理实例                 │
  │                              │
  │ 基座: Qwen2.5-7B (共享)      │
  │                              │
  │ LoRA A: 客服模型 (50MB)      │ ← 用户 A 的请求
  │ LoRA B: 法律模型 (50MB)      │ ← 用户 B 的请求
  │ LoRA C: 医疗模型 (50MB)      │ ← 用户 C 的请求
  │                              │
  │ 显存: 14GB + 150MB ≈ 14.2GB │
  └──────────────────────────────┘
  一张 A10 24G 可以同时服务 数十个 LoRA 模型

四、功能清单

4.1 训练任务管理

功能 说明 优先级
创建训练任务 向导式:选模型→选数据→配参数→提交 P0
任务列表 查看所有训练任务(运行中/排队/完成/失败) P0
任务详情 进度/指标/日志/产出 P0
取消任务 运行中的任务可取消 P0
排队管理 查看排队位置、预计等待时间 P0
任务克隆 基于已有任务快速创建新任务(改参数) P1
批量训练 自动尝试多组超参数,选最优 P2
定时训练 每天/每周自动用新数据重新训练 P2

4.2 训练监控

功能 说明 优先级
Loss 曲线实时 训练 loss + 验证 loss 实时图表 P0
学习率曲线 学习率 warmup + decay 可视化 P1
GPU 监控 显存/利用率/温度 实时 P0
训练日志 实时日志流(WebSocket/SSE) P0
ETA 预估 预计剩余时间 P0
早停通知 验证 loss 不再下降时通知用户 P1
异常告警 loss 异常飙升/NaN/OOM 告警 P0

4.3 Checkpoint 管理

功能 说明 优先级
自动保存 每 N 步/每 epoch 自动保存 checkpoint P0
Checkpoint 列表 查看所有保存点及其指标 P0
从 Checkpoint 恢复 断点续训(任务失败后恢复) P1
选择最优 Checkpoint 不一定用最后一个,选验证 loss 最低的 P1
Checkpoint 清理 只保留 Top-N 个,自动清理旧的 P1
Checkpoint 导出 下载 checkpoint 到本地 P1

4.4 评估与对比

功能 说明 优先级
自动评估 训练完在验证集上自动跑评估 P0
基座对比 微调模型 vs 基座模型指标对比 P0
版本对比 v1 vs v2 微调模型对比 P1
逐条对比 抽样展示两个模型的回答 P1
人工评测 标注员盲评,统计胜率 P2
A/B 测试 线上分流,用真实流量评估 P2

4.5 训练计费

计费项 计算方式 说明
GPU 时长 GPU型号 × 卡数 × 秒数 从 Job 启动到结束
数据存储 GB × 天 数据集和 Checkpoint
模型存储 GB × 天 产出的 LoRA 权重
费用预估公式:
  GPU 费用 = 单价/小时 × 预估时间

  预估时间(LoRA) ≈ 
    数据条数 × 平均Token数 × epochs
    ─────────────────────────────── × 1.2 (overhead)
    batch_size × tokens_per_second

  示例:
    10000 条 × 200 token × 3 epochs = 6,000,000 tokens
    batch_size=4 × 2000 tokens/s = 8000 tokens/s
    时间 = 6,000,000 / 8,000 × 1.2 = 15 分钟
    费用 = ¥5/小时 × 0.25小时 = ¥1.25

五、CRD 设计

5.1 TrainingJob CRD

apiVersion: ai.platform.io/v1
kind: TrainingJob
metadata:
  name: acmecorp-cs-finetune-003
  namespace: training
  labels:
    org-id: acmecorp
    user-id: user-123
spec:
  # ── 基座模型 ──
  baseModel:
    name: qwen2.5-7b-instruct
    source: registry                       # 从平台模型仓库拉取
    
  # ── 训练方式 ──
  method: lora                             # lora / qlora / full / dpo
  
  # ── 数据集 ──
  dataset:
    train: s3://datasets/acmecorp/cs-train.jsonl
    validation: s3://datasets/acmecorp/cs-eval.jsonl
    format: conversation                   # conversation / completion / dpo
    
  # ── 超参数 ──
  hyperparameters:
    epochs: 3
    learningRate: "2e-5"
    batchSize: 4
    gradientAccumulation: 4
    maxSeqLength: 2048
    warmupRatio: 0.1
    weightDecay: 0.01
    # LoRA 参数
    loraRank: 16
    loraAlpha: 32
    loraDropout: 0.05
    loraTargetModules: "all-linear"        # all-linear / qkv / specific
    
  # ── GPU 资源 ──
  resources:
    gpu:
      type: nvidia-a10
      count: 1
    memory: 32Gi
    
  # ── Checkpoint ──
  checkpoint:
    enabled: true
    saveSteps: 500                         # 每 500 步保存
    saveEpochs: true                       # 每 epoch 结束保存
    maxKeep: 3                             # 只保留最近 3 个
    path: s3://checkpoints/acmecorp-cs-003/
    
  # ── 输出 ──
  output:
    modelName: acmecorp-cs-v3
    path: s3://models/acmecorp/cs-v3/
    autoEval: true                         # 训练完自动评估
    autoDeploy: false                      # 不自动部署(需手动确认)
    
  # ── 通知 ──
  notification:
    onComplete: true
    onFailed: true
    webhook: https://hooks.slack.com/xxx
    
  # ── 优先级 ──  
  priority: normal                         # low / normal / high (高优先级插队)
  
  # ── 断点续训 ──
  resumeFrom: ""                           # 填 checkpoint 路径可断点续训

status:
  phase: Running                           # Queued/Initializing/Running/Evaluating/Completed/Failed
  queuePosition: 0                         # 排队位置(0=不排队)
  
  progress:
    currentEpoch: 2
    totalEpochs: 3
    currentStep: 1250
    totalSteps: 1875
    percentage: 67
    
  metrics:
    trainLoss: 0.4523
    evalLoss: 0.5102
    learningRate: 0.000018
    tokensPerSecond: 2150
    
  resources:
    gpuUtilization: 92
    gpuMemoryUsed: "15.2Gi"
    gpuMemoryTotal: "24Gi"
    
  timing:
    startedAt: "2026-04-09T14:00:00Z"
    eta: "2026-04-09T14:45:00Z"
    elapsed: "30m"
    
  checkpoints:
    - step: 500
      path: s3://checkpoints/acmecorp-cs-003/step-500/
      evalLoss: 0.62
    - step: 1000
      path: s3://checkpoints/acmecorp-cs-003/step-1000/
      evalLoss: 0.53
      
  output:
    modelPath: ""                          # 完成后填入
    modelSize: ""
    evalResults: {}
    
  conditions:
    - type: GPUAllocated
      status: "True"
    - type: DataLoaded
      status: "True"
    - type: Training
      status: "True"

六、页面设计

6.1 页面总览

训练中心
│
├── 训练任务列表
├── 创建训练任务(4步向导)
│   ├── Step 1: 选择基座模型
│   ├── Step 2: 选择数据集
│   ├── Step 3: 配置训练参数
│   └── Step 4: 确认并提交
├── 训练监控看板
├── Checkpoint 管理
├── 模型评估对比
└── 训练费用明细

6.2 训练任务列表

┌──────────────────────────────────────────────────────────────────┐
│ 训练中心                                        [+ 创建训练任务]  │
├──────────────────────────────────────────────────────────────────┤
│ 筛选: [全部状态 ▼]  [全部模型 ▼]  [最近30天 ▼]                    │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ 🟡 排队中  客服模型 v4                                  04-09    │
│   基座: Qwen2.5-7BLoRA12,450条 │ 排队位置: #2              │
│   预计等待: ~30分钟                              [取消]           │
│                                                                  │
│ 🟢 运行中  客服模型 v3                                  04-09    │
│   基座: Qwen2.5-7BLoRA12,450条 │ Epoch 2/3 (67%)          │
│   [████████████████████░░░░░░░░░] ETA: 15min    [查看] [取消]    │
│   loss: 0.45GPU: 92% │ A10 × 1                               │
│                                                                  │
│ ✅ 已完成  客服模型 v2                                  04-08    │
│   基座: Qwen2.5-7BLoRA10,200条 │ 耗时: 42分钟             │
│   eval_loss: 0.38 │ 费用: ¥3.50      [查看] [部署] [克隆]        │
│                                                                  │
│ ✅ 已完成  产品问答 v1                                  04-07    │
│   基座: Qwen2.5-14BLoRA5,000条 │ 耗时: 1小时15分          │
│   eval_loss: 0.41 │ 费用: ¥8.20      [查看] [部署] [克隆]        │
│                                                                  │
│ ❌ 失败    代码助手 v1                                  04-06    │
│   基座: CodeLlama-7BLoRA3,000条 │ OOM 显存不足             │
│   原因: batch_size=8 超出 A10 显存    [查看] [克隆并修改]         │
│                                                                  │
│                                                    第 1/3 页  >  │
└──────────────────────────────────────────────────────────────────┘

6.3 创建训练任务 — Step 1: 选择基座模型

┌──────────────────────────────────────────────────────────────────┐
│ 创建训练任务                                                      │
│ ① 选择模型 → ② 选择数据 → ③ 配置参数 → ④ 确认提交               │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ 选择基座模型: 
│                                                                  │
│ ┌─ 推荐 ─────────────────────────────────────────────────────┐  │
│ │                                                             │  │
│ │  ● Qwen2.5-7B-Instruct           ★ 推荐                   │  │
│ │    7B 参数 │ 中文/英文 │ A10 即可                           │  │
│ │    适合: 大多数中文微调场景,性价比最高                       │  │
│ │    训练速度: ~20min/epoch (10K条数据)                       │  │
│ │                                                             │  │
│ │  ○ Qwen2.5-1.5B-Instruct         快速实验                  │  │
│ │    1.5B 参数 │ 显存需求极低                                 │  │
│ │    适合: 数据少(<1000条)、快速验证思路                       │  │
│ │                                                             │  │
│ │  ○ Qwen2.5-14B-Instruct          高质量                    │  │
│ │    14B 参数 │ 需要 A100 40G                                │  │
│ │    适合: 数据充足、追求更好效果                              │  │
│ │                                                             │  │
│ └─────────────────────────────────────────────────────────────┘  │
│                                                                  │
│ ┌─ 更多模型 ──────────────────────────────────────────────────┐  │
│ │  ○ Llama-3.2-3B          英文场景                           │  │
│ │  ○ Qwen2.5-72B           顶级效果,需多卡                   │  │
│ │  ○ CodeLlama-7B          代码生成专用                       │  │
│ └─────────────────────────────────────────────────────────────┘  │
│                                                                  │
│ 训练方式: 
│   ● LoRA (推荐,性价比高)                                        │
│   ○ QLoRA (显存更省,速度略慢)                                    │
│   ○ 全量微调 (需要大显存,效果最好)                               │
│                                                                  │
│                                              [下一步: 选数据 →]  │
└──────────────────────────────────────────────────────────────────┘

6.4 创建训练任务 — Step 3: 配置参数

┌──────────────────────────────────────────────────────────────────┐
│ ① 选择模型 → ② 选择数据 → ③ 配置参数 → ④ 确认提交               │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ 训练参数预设: 
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐            │
│ │ 🟢 快速   │ │ 🟡 标准  │ │ 🔴 精细  │ │ ⚙️ 自定义 │            │
│ │ 5分钟     │ │ 30分钟   │ │ 2小时    │ │ 全部可调  │            │
│ │ ¥0.50    │ │ ¥2.50   │ │ ¥10     │ │          │            │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘            │
│                                                                  │
│ ═══ 当前: 标准方案 ═══                                           │
│                                                                  │
│ 基础参数: 
│   训练轮数 (epochs):     [3_____]  少=欠拟合 多=过拟合            │
│   学习率 (learning_rate): [2e-5___]  控制每步更新幅度             │
│   批次大小 (batch_size):  [4_____]  受显存限制                    │
│                                                                  │
│ LoRA 参数: 
│   秩 (rank):             [16____]  4=轻量 64=强力                │
│   缩放 (alpha):          [32____]  通常设为 rank 的 2 倍          │
│   Dropout:               [0.05__]  正则化                        │
│   目标层:                [全部线性层 ▼]                           │
│                                                                  │
│ 高级参数:                                         [展开 ▼]       │
│ ┌──────────────────────────────────────────────────────────┐     │
│ │ 最大序列长度:        [2048___]                            │     │
│ │ 梯度累积步数:        [4______]  等效 batch_size=16        │     │
│ │ 预热比例:            [0.1____]                            │     │
│ │ 权重衰减:            [0.01___]                            │     │
│ │ 学习率调度:          [cosine ▼]  linear/cosine/constant  │     │
│ │ 早停策略:            [验证loss不降3次 ▼]                   │     │
│ │ 混合精度:            [BF16 ▼]                             │     │
│ │ 梯度裁剪:            [1.0____]                            │     │
│ └──────────────────────────────────────────────────────────┘     │
│                                                                  │
│ Checkpoint: 
│   ☑ 自动保存 每 [500] 步  保留最近 [3] 个                        │
│   ☑ 每个 Epoch 结束时保存                                        │
│                                                                  │
│ GPU 资源: 
│   GPU 型号: [A10 24G ▼]  数量: [1 ▼]                             │
│   当前排队: 0 个任务                    预计立即开始               │
│                                                                  │
│                                     [← 上一步] [下一步: 确认 →]  │
└──────────────────────────────────────────────────────────────────┘

6.5 创建训练任务 — Step 4: 确认提交

┌──────────────────────────────────────────────────────────────────┐
│ ① 选择模型 → ② 选择数据 → ③ 配置参数 → ④ 确认提交               │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ 任务名称: [客服模型 v3_____________________]                     │
│                                                                  │
│ ── 确认信息 ──                                                   │
│                                                                  │
│ 基座模型:  Qwen2.5-7B-Instruct                                  │
│ 训练方式:  LoRA (rank=16, alpha=32)                              │
│ 训练数据:  customer-service v2 (12,294 条, 1.51M tokens)         │
│ 验证数据:  customer-service-eval (500 条)                        │
│ 训练轮数:  3 epochs                                              │
│ GPU:      A10 24G × 1                                           │
│                                                                  │
│ ── 费用预估 ──                                                   │
│                                                                  │
│ ┌──────────────────────────────────────────────────────────┐     │
│ │ 训练时间: ~35 分钟                                        │     │
│ │ GPU 费用: ¥5.00/小时 × 0.58小时 = ¥2.92                  │     │
│ │ 数据存储: ¥0.03                                           │     │
│ │ 模型存储: ¥0.01/天                                        │     │
│ │ ─────────────────────────────────                        │     │
│ │ 预估总计: ¥2.96                   当前余额: ¥156.80       │     │
│ └──────────────────────────────────────────────────────────┘     │
│                                                                  │
│ 训练完成后: 
│   ☑ 自动在验证集上评估                                           │
│   ☐ 自动部署为推理服务                                           │
│   ☑ 邮件通知训练结果                                              │
│   ☐ Webhook 通知                                                 │
│                                                                  │
│                              [← 上一步] [提交训练 (预估 ¥2.96)]  │
└──────────────────────────────────────────────────────────────────┘

6.6 训练监控看板

┌──────────────────────────────────────────────────────────────────┐
│ 客服模型 v3  训练监控              状态: 🟢 Training  Epoch 2/3  │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ 进度: [████████████████████░░░░░░░░░] 67%  Step 1250/1875       │
│ 已用时: 23分钟  │  预计剩余: 12分钟  │  已花费: ¥1.92             │
│                                                                  │
│ ── Loss 曲线 ──                                                  │
│                                                                  │
│  1.2│╲                                                          │
│  1.0│ ╲                              train_loss ──              │
│  0.8│  ╲    ╱╲                       eval_loss  - -              │
│  0.6│   ╲╱╱  ╲╱╲                                               │
│  0.4│          ╲  ╲─────────                                    │
│  0.2│           ─  ─ ─ ─ ─ ─ ─                                 │
│  0.0│                                                            │
│     └──────────────────────────────────────                      │
│     Step 0    250    500    750    1000    1250                  │
│               ↑              ↑                                   │
│           Epoch 1 结束   Epoch 2 结束                            │
│                                                                  │
│ ── 实时指标 ──                                                   │
│                                                                  │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐            │
│ │ Train Loss│ │ Eval Loss│ │ 学习率    │ │ 速度      │            │
│ │  0.4523  │ │  0.5102  │ │ 1.8e-5   │ │ 2150 t/s │            │
│ │ ↓ 持续下降│ │ ↓ 持续下降│ │ Cosine   │ │ 稳定     │            │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘            │
│                                                                  │
│ ── GPU 监控 ──                                                   │
│                                                                  │
│ GPU 利用率:  [█████████░] 92%                                    │
│ 显存使用:    [██████░░░░] 15.2 / 24 GB                           │
│ GPU 温度:    68°C                                                │
│                                                                  │
│ ── Checkpoint ──                                                 │
│                                                                  │
│ Step 500:  eval_loss=0.62  [恢复] [导出] [部署]                  │
│ Step 1000: eval_loss=0.53  [恢复] [导出] [部署]  ← 目前最优      │
│                                                                  │
│ ── 日志 ──                                                       │
│                                                                  │
│ 14:23:01 Step 1250/1875 loss=0.4523 lr=1.8e-5 tokens/s=2150    │
│ 14:22:58 Step 1249/1875 loss=0.4531 lr=1.8e-5 tokens/s=2148    │
│ 14:22:55 Step 1248/1875 loss=0.4519 lr=1.8e-5 tokens/s=2155    │
│ ...                                          [查看完整日志 →]    │
│                                                                  │
│                            [暂停] [取消] [调整参数(下个Epoch)]    │
└──────────────────────────────────────────────────────────────────┘

6.7 训练完成页

┌──────────────────────────────────────────────────────────────────┐
│ ✅ 客服模型 v3  训练完成                                          │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│ ── 训练摘要 ──                                                   │
│                                                                  │
│ 基座模型:    Qwen2.5-7B-Instruct                                │
│ 训练方式:    LoRA (rank=16)                                      │
│ 训练数据:    12,294 条                                           │
│ 训练时间:    35 分钟 (3 epochs, 1875 steps)                      │
│ 总费用:      ¥2.92                                               │
│                                                                  │
│ ── 评估结果 ──                                                   │
│                                                                  │
│ ┌────────────────┬──────────┬──────────┬────────────┐            │
│ │ 指标            │ 基座模型  │ 微调后   │ 提升        │            │
│ ├────────────────┼──────────┼──────────┼────────────┤            │
│ │ Eval Loss      │ 1.23     │ 0.38     │ 🟢 -69%    │            │
│ │ BLEU           │ 0.12     │ 0.51     │ 🟢 +325%   │            │
│ │ ROUGE-L        │ 0.35     │ 0.68     │ 🟢 +94%    │            │
│ │ 回答准确率      │ 45%      │ 87%      │ 🟢 +93%    │            │
│ └────────────────┴──────────┴──────────┴────────────┘            │
│                                                                  │
│ ── 样本展示 (随机3条) ──                                         │
│                                                                  │
│ Q: "快递没收到怎么办?"                                          │
│ 基座: 如果您的快递未收到,建议您联系快递公司查询物流状态...        │
│ 微调: 请您先在订单详情中查看物流状态。如果显示已签收但您未收到:   │
│       1. 查看是否放在快递柜或驿站                                │
│       2. 联系配送员确认 ...                                      │
│                                                                  │
│ ── 产出模型 ──                                                   │
│                                                                  │
│ 模型名称:   acmecorp-cs-v3                                       │
│ 类型:       LoRA adapter (156MB)                                 │
│ 最优 Checkpoint: Step 1500 (eval_loss=0.38)                      │
│                                                                  │
│ 下一步: 
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐              │
│ │ 🚀 部署上线   │ │ 📊 详细评估   │ │ 🔄 继续训练   │              │
│ │ 一键部署为    │ │ 上传评测集    │ │ 增加数据或    │              │
│ │ 推理服务      │ │ 深入测试     │ │ 调整参数继续  │              │
│ └──────────────┘ └──────────────┘ └──────────────┘              │
└──────────────────────────────────────────────────────────────────┘

七、异常处理

7.1 常见训练失败及处理

错误 原因 平台自动处理 用户建议
OOM (Out of Memory) batch_size 太大 / 序列太长 自动提示降低参数 减小 batch_size 或 max_seq_length
Loss NaN 学习率太大 / 数据有问题 自动停止并告警 降低 lr 或检查数据
Loss 不收敛 学习率太小 / 数据太少 30min 不降自动提醒 增大 lr 或增加数据
过拟合 train_loss↓ eval_loss↑ 早停策略 减少 epochs / 增加 dropout
GPU 故障 硬件错误 自动从 Checkpoint 恢复到新 GPU 无需操作
节点掉线 网络/硬件故障 自动迁移到其他节点续训 无需操作
磁盘满 Checkpoint 太多 自动清理旧 Checkpoint 减少保存频率

7.2 自动恢复机制

训练 Pod 被驱逐/节点故障:
  1. Training Operator 检测到 Pod 失败
  2. 查找最近的 Checkpoint (S3 上)
  3. 创建新 Pod,挂载 Checkpoint
  4. 从断点继续训练
  5. 用户端看到: "训练中断,已自动恢复 (从 step 1000 继续)"

对用户透明,不需要手动操作

八、页面汇总

序号 页面 路由 优先级
1 训练任务列表 /training/jobs P0
2 创建任务-选模型 /training/create/model P0
3 创建任务-选数据 /training/create/data P0
4 创建任务-配参数 /training/create/config P0
5 创建任务-确认 /training/create/confirm P0
6 训练监控看板 /training/jobs/:id/monitor P0
7 训练完成页 /training/jobs/:id/result P0
8 Checkpoint 管理 /training/jobs/:id/checkpoints P1
9 训练日志 /training/jobs/:id/logs P0
10 模型评估对比 /training/evaluate P1
11 训练费用明细 /training/billing P1
12 超参搜索(批量训练) /training/hyperparameter-search P2