2

模型微调平台 · 模型训练与发布

在云端完成一次完整微调:准备数据 → LoRA 训练 → 转换 → 云端部署或端侧下载

📚

参考资料

本节内容,参考 vivo AI 技术开发部 何月华 工程师《大模型微调方法宣讲》整理。

平台入口

入口: 模型微调平台 (需先登录竞赛账号)。 训练数据可直接 下载示例数据集(1000 条 STEM 纯文本,zip 结构已校验); 也可修改手册附带的 模型训练数据集模板/ 或平台「下载模板」。 训练方式目前仅支持 LoRA。首次使用时,请确保数据正确并采用默认超参数;解决参数校验提示后,先完成全流程验证,再进行参数优化。

本模块学习路径
① 准备数据 ② 模型训练 ③ 模型转换

平台顶部三个页签「模型训练 / 模型转换 / 模型部署」对应 ②③④a;端侧路径使用转换后的下载产物。

模型微调平台首页

图 2-1 平台总览:上方开发流程说明,下方三个页签

2.1 为什么要微调?监督微调与 LoRA

预训练模型擅长「续写文本」,但缺乏指令跟随能力。监督微调用 (prompt, response) 标注数据,激发模型完成特定任务——这正是应用赛道将创意应用于 vivo 终端前的关键一步。

全参数微调 vs 高效微调

维度全参数微调LoRA 微调QLoRA 微调
可训练参数量全部模型参数少量低秩矩阵低秩矩阵 + 4-bit 基座
显存需求(3B 量级)约 42 GB(bf16)约 8 GB约 3 GB
推理影响模型结构不变可合并至原模型,通常不引入适配器的额外计算量化推理,需配合 bnb/gguf
适用场景通用底座、大算力垂直领域任务、小样本、主流方案极低资源、快速实验

本赛项模型微调平台仅支持 LoRA,与端侧加载 LoRA 权重(模块四)一致,是参赛团队的首选路径。

监督微调

用「问题 → 标准回答」标注数据继续训练已有大模型,使其更贴合场景(术语、语气、任务格式等)。 本平台任务类型选「文本生成」即采用监督微调。

LoRA(低秩适配)

冻结预训练权重 W₀,仅训练旁路低秩矩阵 ABh = W₀·x + B·A·x。训练完成后可将 B·A 合并至 W₀,合并后通常不引入适配器的额外计算开销。

LoRA 原理示意

图 2-2 LoRA:原权重 W 冻结,只更新低秩支路 A、B

LoRA 超参数含义

参数含义常见取值 / 说明
r(rank)低秩矩阵维度4 / 8 / 16 / 32;任务越复杂可取越大,平台默认 16
lora_alpha(α)缩放因子有效缩放约 α / r;常设 α = 2r(如 r=8 → α=16)
lora_dropoutLoRA 层 dropout0.05~0.1;小数据集可略增大
target_modules应用 LoRA 的模块q_proj/v_projall;复杂任务可用 all

适当增大 rank 可提升模型容量,但不保证性能单调提升;随着 rank 增大,边际收益通常递减,需在欠拟合与过拟合之间权衡。

微调方法选择

方法特点推荐场景
全参数微调容量最大,需大显存通用大模型、数据充足、算力充沛
Freeze冻结大部分层,仅训练后几层多模态、迁移学习
LoRA低资源、可合并、在部分任务中可取得接近全参数微调的效果垂直领域场景、小样本、推荐首选
QLoRA基座量化 + LoRA,显存最低极低资源、快速验证想法
💡

选型建议

建议从 Chat/Instruct 模型出发,先尝试 LoRA;仅在 prompt 工程无法满足需求时再考虑微调。竞赛实操:先用平台默认参数完成流程验证,再按验证结果调整参数。

2.2 准备训练数据

中小学科创教育 · 示例训练集(推荐)

1000 条纯文本 STEM 问答(ShareGPT 格式),面向中小学科创教育场景; zip 根目录已按平台要求打包(dataset_info.json + my_data.jsonl), 满足默认超参 ≥160 条约束,下载后可直接上传

  • 文件名:stem-edu-sft.zip
  • 大小:约 63 KB
  • 场景:全国青少年科技创新大赛、STEM 项目指导等
⬇ 下载训练集

若需自定义数据,可修改手册附带的 模型训练数据集模板/,或在创建任务页选择平台「下载模板」。固定文件名不要改。

数据来源与质量控制

推荐数据来源
  • 业务真实日志 / 标注数据(最推荐)
  • 开源指令数据集(如 BELLE、Firefly、UltraChat 等)
  • GPT / 自研模型辅助生成(Self-Instruct、Evol-Instruct)
  • 传统 NLP 任务模板化改写
质量控制原则
  • 分布 + 质量 >> 数量
  • 任务类型覆盖均衡、中英文比例合理
  • 去重、过滤低质样本、答案润色
  • 构造测试集,指导训练优化(见 §2.6)

数据增强可选:指令复杂化 / 进化、Few-shot / CoT、输入反转、答案验证等。参考工作:LIMA(Less Is More for Alignment)、SCAR(Data Selection via Style Consistency)。

text
模型训练数据集模板/
├── dataset_info.json   # 注册信息;键名必须是 my_data
├── my_data.jsonl       # 样本:每行一条 JSON(ShareGPT 风格)
├── images/             # 图文样本用的图片
│   └── cat.jpg
└── 说明文档.txt

dataset_info.json(BlueLM 模板)

json
{
  "my_data": {
    "file_name": "my_data.jsonl",
    "formatting": "sharegpt",
    "columns": {
      "messages": "conversations",
      "images": "image"
    },
    "tags": {
      "role_tag": "from",
      "content_tag": "value",
      "user_tag": "human",
      "assistant_tag": "gpt"
    }
  }
}

单条 JSONL 示例

jsonl
{"conversations":[{"from":"human","value":"中国的首都是哪里?"},{"from":"gpt","value":"中国的首都是北京。"}],"image":null}
{"conversations":[{"from":"human","value":"<image>\n请描述一下图片中的内容"},{"from":"gpt","value":"图片中是一只可爱的橘猫……"}],"image":"images/cat.jpg"}
  • 纯文本image 必须为 null,不能省略
  • 带图片:human 的 value 开头须含 <image>image 填相对路径
  • dataset_info.json 里数据集键名必须是 "my_data",与平台模板严格对齐
⚠️

样本数量要求(常见问题)

默认超参下平台要求: 样本数 ≥ Checkpoint间隔 × batch × 梯度累积10 × 4 × 4 = 160。 上方示例数据集已含 1000 条,可直接使用;若自建数据,须保证 my_data.jsonl ≥160 条后再打包 zip。 原理见 §2.3。

zip 打包注意事项(常见错误)
  • zip 根目录必须直接是 dataset_info.jsonmy_data.jsonl(及可选的 images/),不能多套一层文件夹
  • ❌ 错误:右键压缩整个数据文件夹 → 解压后是 某文件夹/dataset_info.json
  • ✅ 正确:进入文件夹内部,选中 dataset_info.jsonmy_data.jsonl(和 images 若有)再压缩;或用命令行(见下)
  • 解开后第一层应直接看到上述文件,而不是先看到一个多余的外层目录
  • 总包 ≤ 1GB;建议 ≤5000 条;图片 ≤5000 张、单张 < 500KB
  1. 下载示例数据集或自备 zip(≥160 条,文件名与结构正确)

2.3 创建训练任务(按界面步骤操作)

打开「模型训练」页签 → 选择新增任务。一页表单大致分三段:基础信息 → 数据集与方法 → 参数配置。

① 基础信息

创建任务 - 基础信息

图 2-3 基础信息

字段填写
任务名称 *自定,≤30 字,便于列表辨认
任务类型「文本生成」
任务描述可选,写清数据场景即可
模型选择 *「蓝心大模型 / BlueLM-VL-3B
  1. 填写任务名称,并选择模型 BlueLM-VL-3B

② 数据集与训练方法

创建任务 - 数据集

图 2-4 上传数据集、勾选说明;训练方法为 lora(平台目前仅支持这一种)

  • 拖拽或点击上传 zip;也可选择右侧「下载模板」对照格式
  • 勾选数据集使用说明(赛期存平台、赛后清理等)
  • 训练方法:界面显示 lora——当前平台只支持 LoRA,无需(也无法)改成全量微调等其他方式
  • 上传成功后,「训练数据数量」应自动变为你的样本条数;若仍为 0,优先检查 zip 结构与文件名
  1. 上传 zip,勾选说明,确认数据条数非 0(训练方式为 lora)

③ 参数配置:先满足参数约束,再进行调优

参数配置与约束

图 2-5 参数区(上):蓝字为约束,红字表示当前组合会失败

⚠️

必须满足

训练数据数量 ≥ Checkpoint保存间隔 × 批处理大小 × 梯度累积次数
默认参数下右侧乘积为 160。不满足会提示「将导致训练失败」,后续转换也可能失败。 处理方法:增加数据,或减小间隔 / batch / 累积次数(三者乘积变小即可)。

📐

约束原理

优化器每真正更新一次权重称为 1 个 step。 本平台可近似理解为: 有效批量 ≈ batch × 梯度累积(默认 4×4=16 条样本更新一次)。 Checkpoint 按「每隔 N 个 step 保存」计数,因此「至少生成一次 Checkpoint」所需样本数就是间隔 × batch × 累积。

更多超参数

图 2-6 参数区(下):epoch、学习率、LoRA 相关项;无参数校验提示后再提交

首次训练建议全部使用默认值,只保证「训练数据数量」≥ 右侧乘积。下面按表单项说明含义与调整方法(用于理解表单,无须一次掌握)。

参数详解 · 步进与保存

训练数据数量 num samples 自动解析

来自 my_data.jsonl 行数,不可手填。它是约束不等式的左侧。

为 0 → 返回 §2.2 检查 zip / my_data 键名。

批处理大小 batch size 4

一次前向/反向并行处理的样本数。数值越大,吞吐量通常越高、梯度越稳定,但显存近似随 batch 上升。

出现参数校验提示或显存紧张时,可优先降低至 2 或 1。

梯度累积次数 grad accumulation 4

使用较小 batch 连续计算若干次再统一更新,近似「更大有效批量」,峰值显存仍接近小 batch。

与 batch 成对出现:调整其中一项即可降低「间隔×batch×累积」乘积。

Checkpoint 保存间隔 save steps 10

每隔多少 step 保存一次。间隔过小将增加保存频率、延长训练时间;间隔过大则回退点较少,且直接放大约束右端。

样本偏少时,可优先将间隔调小(如 5),通常能最快解决参数校验提示。

参数详解 · 训练强度

迭代轮次 epochs 3

训练集完整遍历的次数。太少易欠拟合;数据少却轮次过多易过拟合(记忆训练集)。

几百~几千条时,3 是稳妥起点;过拟合减到 1~2,欠拟合时再略增。

学习率 learning rate 0.0003(3e-4)

每一步沿梯度方向更新参数的幅度。过大:loss 震荡/发散;过小:收敛极慢。LoRA 常用 lr 可比全量微调略大,平台已给推荐值。

首次训练务必用默认;有 loss 日志后再小幅调整,不建议跨数量级调整。

序列长度 max seq length 2048

单条样本允许的最大 token 长度,超出截断。越长越消耗计算资源与显存。

短问答为主时可降到 512/1024 提速;确有长文再保留 2048。

参数详解 · LoRA

loraRank rank r 16

低秩宽度:越大适配器容量越大、越能拟合复杂任务,也更易过拟合、体积更大。端侧常见 16 / 32

轻度风格/问答用 16;垂直领域任务复杂且数据充足时再试 32。不是越大越好。

loraDropout dropout 0.05

LoRA 支路上的随机丢弃,缓解过拟合。

默认即可;明确过拟合时可试 ~0.1,不必优先调它。

lora 所有线性层 target modules all

LoRA 应用于哪些线性层。all 覆盖更全、表达更强;仅应用于部分注意力投影则更轻。

竞赛实践保持 all,除非平台/端侧包另有要求。

推荐训练流程(由小规模逐步扩展)
  1. 在 Chat 模型上先调 prompt,确认必须微调后再启动训练。
  2. 准备小批量高质量数据,快速开展 LoRA 试验(可用上方示例数据集)。
  3. 观察 loss 曲线与验证集指标。
  4. 逐步扩量、调参、加入数据增强。

基座选择:从 Chat/Instruct 模型出发,只需准备专项任务数据即可。

训练常见问题排查
现象排查方向
显存不足优先降低 batch_size;如需维持有效批量,可相应增大 gradient_accumulation
loss 不降检查数据格式、学习率、模板一致性
过拟合增加 dropout、降低 r、早停、扩充数据
建议调参顺序
  1. 格式正确 + 条数满足约束(否则无法完成训练)。
  2. 其余参数使用默认值,完成训练 → 转换 → 部署/下载流程验证。
  3. 再按需微调:短文本降序列长度;先检查数据覆盖,确认欠拟合后再略增 epoch / rank;过拟合则减 epoch 或略增 dropout——每次仅调整 1~2 个参数。
参数默认一句话
训练数据数量自动jsonl 行数;约束不等式左侧
批处理大小4并行样本数;影响显存/速度
梯度累积次数4用多次小 batch 形成有效批量
Checkpoint 间隔10每 N step 保存;参与约束
迭代轮次3数据完整遍历次数
学习率0.0003更新步长
loraRank16适配器容量;端侧常见 16/32
loraDropout0.05缓解过拟合
lora 所有线性层all应用 LoRA 的层
序列长度2048单条最大长度

学生调参速查

💡

三项原则

先完成流程验证再调整参数;每次仅调整 1~2 个参数;固定 5 个测试问题对比前后效果。 数据质量往往比将 epoch 调至过大更重要。

第 0 步:训练任务无法提交
现象优先处理方式暂不调整
红字「参数不满足约束」增加数据至 ≥160 条,或减小 Checkpoint 间隔 / batch / 梯度累积epoch、学习率、rank
训练数据数量 = 0检查 zip 根目录、my_data 键名、文件名
训练失败 / loss 不动优先检查数据格式是否正确盲目加大 epoch
第 1 步:首次训练

其余参数全部用平台默认,只保证数据 ≥160 条、格式正确、模型选 BlueLM-VL-3B。 完成训练、转换与部署流程,并选取 3~5 个固定问题评估效果。

第 2 步:测试结果未达预期 —— 根据现象选择方案
现象可能原因可尝试
领域适配效果不足 领域数据覆盖不足或训练程度不足 先检查领域数据是否覆盖目标场景;数据覆盖充分且验证结果显示欠拟合时,可尝试 epoch 3→4 或 loraRank 16→32(端侧包会变大)
能复述训练集原话,但换一种提问方式即出错 过拟合 epoch 3→1~2;loraDropout 0.05→0.1;检查数据是否重复过多
回答重复、乱码、不稳定 学习率过大或 checkpoint 不佳 保持 lr 默认,选用更早的 checkpoint 部署;勿加大 lr
某几类题持续答错(如机器人、竞赛) 数据未覆盖该类场景 补充 20~50 条该类问答,参数仍用默认
训练耗时过长 序列过长 序列长度 2048→1024(短问答场景通常已足够)
快速决策参考
text
训练失败 / 出现参数校验提示 → 增加数据或减小「间隔×batch×累积」,暂不调整 epoch/lr
首次训练?       → 使用默认参数,先完成全流程验证
领域适配效果不足? → 先检查数据覆盖;确认欠拟合后再调整 epoch/rank
复述原话但泛化差? → epoch -1,或 dropout 略增
部分问题持续答错? → 补充数据,而非调整参数
回答重复或出现乱码? → 选用更早 checkpoint,暂不加大 lr
竞赛推荐「安全默认」(约 1000 条数据时)
参数建议说明
epoch3稳妥起点;过拟合再减,欠拟合时再增加
学习率0.0003(默认)首次训练不要改
loraRank16端侧友好;确认欠拟合后再试 32
序列长度1024~2048短问答可用 1024 提速
其余使用默认值batch=4,梯度累积=4,dropout=0.05

训练完成后,建议用模块三 API 对同一批 STEM 问题做微调前后对比,再决定补数据还是调整 epoch / rank。

2.4 提交任务并等待训练

确认页面无红色约束报错后点击「提交」。成功后回到「模型训练」列表。

提交成功

图 2-7 提交成功:绿色提示(预计约 30 分钟,以平台为准)+ 列表状态常先为「排队中」

训练中

图 2-8 进入「训练中」:可用「查看 / 日志 / 终止」

训练成功

图 2-9 状态变为「训练成功」:操作列会出现「模型转换」「模型部署」入口,此时再进入下一节

  • 状态流转:排队中 → 训练中 → 训练成功(失败则看详情或日志后改数据/参数再提交)
  • 「查看」可查阅配置与详情;「日志」可观察训练过程;异常可用「终止」
  • 训练成功后,列表操作里可直接选择「模型转换 / 模型部署」,也可切到对应页签「新增…」
  • 训练耗时取决于数据量与参数,排队/训练期间可先准备其他模块所需内容
  1. 满足参数约束后提交,并等到列表状态变为「训练成功」

2.5 转换与发布(两条出口)

仅当训练状态为训练成功后再做(见图 2-9)。转换页、部署页在训练未完成时可能「暂无数据」,属正常。

模型转换(必做)

切到「模型转换」页签(训练未成功前可能暂无数据),选择新增模型转换

模型转换页签

图 2-10 「模型转换」列表页 → 选择「新增模型转换」

新增模型转换弹窗

图 2-11 填写转换名称(≤30 字),在「模型转换任务」中选中刚训练成功的任务 → 确定

转换任务排队中

图 2-12 提交成功后列表出现记录,状态多为「排队中」→ 转换中 → 转换成功

  • 「模型转换任务」须选择已训练成功的对应任务;转换名称填写错误不影响关联,但若选错任务将导致训练或转换对象错误
  • 转换成功后可下载端侧产物(接模块四);若用于云端 API,还需完成部署
  • 排队/转换期间可用「查看 / 终止」;预计时长以平台绿色提示为准

模型部署(云端出口)

切到「模型部署」页签,选择新增模型部署(须已有转换成功的产物):

模型部署页签

图 2-13 「模型部署」列表页 →「新增模型部署」

新增模型部署弹窗

图 2-14 填写部署名称,在「模型部署任务」中选中对应任务 → 确定;注意弹窗红字:新部署成功后,原已部署成功的模型会自动终止

部署后的 API 接口

图 2-15 部署成功后打开「API接口」:可见访问地址与 APP_ID / APP_KEY → 详细调用见 模块三

  • 等列表状态变为部署成功后,打开「API接口 / 访问凭据」,复制 APP_ID、APP_KEY → 模块三
  • 端侧不强制部署:转换成功后下载模型包即可 → 模块四
⚠️

部署注意

同一账号下新部署会终止原部署。请勿以明文将密钥写入前端代码,也请勿上传至公开代码库。

  1. 训练成功后完成转换,并选择云端部署或端侧下载之一

2.6 如何确认训练生效?

离线评估(客观)
  • 预留未参与训练的测试集
  • 自动指标:BLEU、ROUGE、Accuracy、F1 等
  • 按任务设计规则指标:抽取(字段召回、JSON 可解析率)、分类(Top-1/k)、生成(事实一致性、重复率)
主观评估(定性)
  • A/B 对比:微调前 vs 微调后、基座 vs LoRA
  • 鲁棒性:边界场景、对抗样本
  • 格式检查:特殊 token、函数调用输出
  • 多人盲评:指令跟随、风格一致性
💡

关键原则

客观指标 + 主观评估,缺一不可。训练完成后,建议用模块三 API 或模块四端侧,对固定 5~10 个 STEM 问题做微调前后对比。

BlueLM LoRA 微调落地清单
  1. 任务分析:先调 prompt,确认必须微调后再启动
  2. 数据准备:JSONL + dataset_info.json,严格对齐 BlueLM 模板
  3. 训练启动:从 LoRA 开始,先小批量试验,再扩量调整参数
  4. 调参重点:r、alpha、target_modules、learning_rate、dropout
  5. 部署 + 验证:测试集指标 + 主观 A/B + 边界场景(→ 模块三 / 模块四)

本模块完成检查

数据符合模板且条数满足要求;创建任务满足参数约束并训练成功;完成转换,并知道如何获取云端凭据或端侧包。