训练模块 — 功能设计与页面规划
一、训练在平台中的定位
用户的核心需求:
"我有一堆客服对话数据,想让通用大模型变成我的专属客服模型"
"我有行业文档,想让模型说我们行业的术语"
"通用模型回答不够好,我想让它按我的风格回答"
平台提供:
选基座 → 传数据 → 点开始 → 等完成 → 一键部署
用户不需要懂 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
dataset:
train: s3://datasets/acmecorp/cs-train.jsonl
validation: s3://datasets/acmecorp/cs-eval.jsonl
format: conversation
hyperparameters:
epochs: 3
learningRate: "2e-5"
batchSize: 4
gradientAccumulation: 4
maxSeqLength: 2048
warmupRatio: 0.1
weightDecay: 0.01
loraRank: 16
loraAlpha: 32
loraDropout: 0.05
loraTargetModules: "all-linear"
resources:
gpu:
type: nvidia-a10
count: 1
memory: 32Gi
checkpoint:
enabled: true
saveSteps: 500
saveEpochs: true
maxKeep: 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
resumeFrom: ""
status:
phase: Running
queuePosition: 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-7B │ LoRA │ 12,450条 │ 排队位置: #2 │
│ 预计等待: ~30分钟 [取消] │
│ │
│ 🟢 运行中 客服模型 v3 04-09 │
│ 基座: Qwen2.5-7B │ LoRA │ 12,450条 │ Epoch 2/3 (67
│ [████████████████████░░░░░░░░░] ETA: 15min [查看] [取消] │
│ loss: 0.45 │ GPU: 92
│ │
│ ✅ 已完成 客服模型 v2 04-08 │
│ 基座: Qwen2.5-7B │ LoRA │ 10,200条 │ 耗时: 42分钟 │
│ eval_loss: 0.38 │ 费用: ¥3.50 [查看] [部署] [克隆] │
│ │
│ ✅ 已完成 产品问答 v1 04-07 │
│ 基座: Qwen2.5-14B │ LoRA │ 5,000条 │ 耗时: 1小时15分 │
│ eval_loss: 0.41 │ 费用: ¥8.20 [查看] [部署] [克隆] │
│ │
│ ❌ 失败 代码助手 v1 04-06 │
│ 基座: CodeLlama-7B │ LoRA │ 3,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 |