模型微调平台 · 模型训练与发布
在云端完成一次完整微调:准备数据 → LoRA 训练 → 转换 → 云端部署或端侧下载
参考资料
本节内容,参考 vivo AI 技术开发部 何月华 工程师《大模型微调方法宣讲》整理。
平台顶部三个页签「模型训练 / 模型转换 / 模型部署」对应 ②③④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 权重(模块四)一致,是参赛团队的首选路径。
用「问题 → 标准回答」标注数据继续训练已有大模型,使其更贴合场景(术语、语气、任务格式等)。 本平台任务类型选「文本生成」即采用监督微调。
冻结预训练权重 W₀,仅训练旁路低秩矩阵 A、B:
h = W₀·x + B·A·x。训练完成后可将 B·A 合并至 W₀,合并后通常不引入适配器的额外计算开销。
图 2-2 LoRA:原权重 W 冻结,只更新低秩支路 A、B
LoRA 超参数含义
| 参数 | 含义 | 常见取值 / 说明 |
|---|---|---|
r(rank) | 低秩矩阵维度 | 4 / 8 / 16 / 32;任务越复杂可取越大,平台默认 16 |
lora_alpha(α) | 缩放因子 | 有效缩放约 α / r;常设 α = 2r(如 r=8 → α=16) |
lora_dropout | LoRA 层 dropout | 0.05~0.1;小数据集可略增大 |
target_modules | 应用 LoRA 的模块 | q_proj/v_proj 或 all;复杂任务可用 all |
适当增大 rank 可提升模型容量,但不保证性能单调提升;随着 rank 增大,边际收益通常递减,需在欠拟合与过拟合之间权衡。
微调方法选择
| 方法 | 特点 | 推荐场景 |
|---|---|---|
| 全参数微调 | 容量最大,需大显存 | 通用大模型、数据充足、算力充沛 |
| Freeze | 冻结大部分层,仅训练后几层 | 多模态、迁移学习 |
| LoRA | 低资源、可合并、在部分任务中可取得接近全参数微调的效果 | 垂直领域场景、小样本、推荐首选 |
| QLoRA | 基座量化 + LoRA,显存最低 | 极低资源、快速验证想法 |
选型建议
建议从 Chat/Instruct 模型出发,先尝试 LoRA;仅在 prompt 工程无法满足需求时再考虑微调。竞赛实操:先用平台默认参数完成流程验证,再按验证结果调整参数。
2.2 准备训练数据
中小学科创教育 · 示例训练集(推荐)
1000 条纯文本 STEM 问答(ShareGPT 格式),面向中小学科创教育场景;
zip 根目录已按平台要求打包(dataset_info.json + my_data.jsonl),
满足默认超参 ≥160 条约束,下载后可直接上传。
若需自定义数据,可修改手册附带的 模型训练数据集模板/,或在创建任务页选择平台「下载模板」。固定文件名不要改。
数据来源与质量控制
- 业务真实日志 / 标注数据(最推荐)
- 开源指令数据集(如 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)。
模型训练数据集模板/
├── dataset_info.json # 注册信息;键名必须是 my_data
├── my_data.jsonl # 样本:每行一条 JSON(ShareGPT 风格)
├── images/ # 图文样本用的图片
│ └── cat.jpg
└── 说明文档.txt
dataset_info.json(BlueLM 模板)
{
"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 示例
{"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 根目录必须直接是
dataset_info.json、my_data.jsonl(及可选的images/),不能多套一层文件夹 - ❌ 错误:右键压缩整个数据文件夹 → 解压后是
某文件夹/dataset_info.json - ✅ 正确:进入文件夹内部,选中
dataset_info.json、my_data.jsonl(和images若有)再压缩;或用命令行(见下) - 解开后第一层应直接看到上述文件,而不是先看到一个多余的外层目录
- 总包 ≤ 1GB;建议 ≤5000 条;图片 ≤5000 张、单张 < 500KB
-
下载示例数据集或自备 zip(≥160 条,文件名与结构正确)
2.3 创建训练任务(按界面步骤操作)
打开「模型训练」页签 → 选择新增任务。一页表单大致分三段:基础信息 → 数据集与方法 → 参数配置。
① 基础信息
图 2-3 基础信息
| 字段 | 填写 |
|---|---|
| 任务名称 * | 自定,≤30 字,便于列表辨认 |
| 任务类型 | 「文本生成」 |
| 任务描述 | 可选,写清数据场景即可 |
| 模型选择 * | 「蓝心大模型 / BlueLM-VL-3B」 |
-
填写任务名称,并选择模型 BlueLM-VL-3B
② 数据集与训练方法
图 2-4 上传数据集、勾选说明;训练方法为 lora(平台目前仅支持这一种)
- 拖拽或点击上传 zip;也可选择右侧「下载模板」对照格式
- 勾选数据集使用说明(赛期存平台、赛后清理等)
- 训练方法:界面显示 lora——当前平台只支持 LoRA,无需(也无法)改成全量微调等其他方式
- 上传成功后,「训练数据数量」应自动变为你的样本条数;若仍为 0,优先检查 zip 结构与文件名
-
上传 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,除非平台/端侧包另有要求。
- 在 Chat 模型上先调 prompt,确认必须微调后再启动训练。
- 准备小批量高质量数据,快速开展 LoRA 试验(可用上方示例数据集)。
- 观察 loss 曲线与验证集指标。
- 逐步扩量、调参、加入数据增强。
基座选择:从 Chat/Instruct 模型出发,只需准备专项任务数据即可。
| 现象 | 排查方向 |
|---|---|
| 显存不足 | 优先降低 batch_size;如需维持有效批量,可相应增大 gradient_accumulation |
| loss 不降 | 检查数据格式、学习率、模板一致性 |
| 过拟合 | 增加 dropout、降低 r、早停、扩充数据 |
- 格式正确 + 条数满足约束(否则无法完成训练)。
- 其余参数使用默认值,完成训练 → 转换 → 部署/下载流程验证。
- 再按需微调:短文本降序列长度;先检查数据覆盖,确认欠拟合后再略增 epoch / rank;过拟合则减 epoch 或略增 dropout——每次仅调整 1~2 个参数。
| 参数 | 默认 | 一句话 |
|---|---|---|
| 训练数据数量 | 自动 | jsonl 行数;约束不等式左侧 |
| 批处理大小 | 4 | 并行样本数;影响显存/速度 |
| 梯度累积次数 | 4 | 用多次小 batch 形成有效批量 |
| Checkpoint 间隔 | 10 | 每 N step 保存;参与约束 |
| 迭代轮次 | 3 | 数据完整遍历次数 |
| 学习率 | 0.0003 | 更新步长 |
| loraRank | 16 | 适配器容量;端侧常见 16/32 |
| loraDropout | 0.05 | 缓解过拟合 |
| lora 所有线性层 | all | 应用 LoRA 的层 |
| 序列长度 | 2048 | 单条最大长度 |
学生调参速查
三项原则
先完成流程验证再调整参数;每次仅调整 1~2 个参数;固定 5 个测试问题对比前后效果。 数据质量往往比将 epoch 调至过大更重要。
| 现象 | 优先处理方式 | 暂不调整 |
|---|---|---|
| 红字「参数不满足约束」 | 增加数据至 ≥160 条,或减小 Checkpoint 间隔 / batch / 梯度累积 | epoch、学习率、rank |
| 训练数据数量 = 0 | 检查 zip 根目录、my_data 键名、文件名 | — |
| 训练失败 / loss 不动 | 优先检查数据格式是否正确 | 盲目加大 epoch |
其余参数全部用平台默认,只保证数据 ≥160 条、格式正确、模型选 BlueLM-VL-3B。 完成训练、转换与部署流程,并选取 3~5 个固定问题评估效果。
| 现象 | 可能原因 | 可尝试 |
|---|---|---|
| 领域适配效果不足 | 领域数据覆盖不足或训练程度不足 | 先检查领域数据是否覆盖目标场景;数据覆盖充分且验证结果显示欠拟合时,可尝试 epoch 3→4 或 loraRank 16→32(端侧包会变大) |
| 能复述训练集原话,但换一种提问方式即出错 | 过拟合 | epoch 3→1~2;loraDropout 0.05→0.1;检查数据是否重复过多 |
| 回答重复、乱码、不稳定 | 学习率过大或 checkpoint 不佳 | 保持 lr 默认,选用更早的 checkpoint 部署;勿加大 lr |
| 某几类题持续答错(如机器人、竞赛) | 数据未覆盖该类场景 | 补充 20~50 条该类问答,参数仍用默认 |
| 训练耗时过长 | 序列过长 | 序列长度 2048→1024(短问答场景通常已足够) |
训练失败 / 出现参数校验提示 → 增加数据或减小「间隔×batch×累积」,暂不调整 epoch/lr
首次训练? → 使用默认参数,先完成全流程验证
领域适配效果不足? → 先检查数据覆盖;确认欠拟合后再调整 epoch/rank
复述原话但泛化差? → epoch -1,或 dropout 略增
部分问题持续答错? → 补充数据,而非调整参数
回答重复或出现乱码? → 选用更早 checkpoint,暂不加大 lr
| 参数 | 建议 | 说明 |
|---|---|---|
| epoch | 3 | 稳妥起点;过拟合再减,欠拟合时再增加 |
| 学习率 | 0.0003(默认) | 首次训练不要改 |
| loraRank | 16 | 端侧友好;确认欠拟合后再试 32 |
| 序列长度 | 1024~2048 | 短问答可用 1024 提速 |
| 其余 | 使用默认值 | batch=4,梯度累积=4,dropout=0.05 |
训练完成后,建议用模块三 API 对同一批 STEM 问题做微调前后对比,再决定补数据还是调整 epoch / rank。
2.4 提交任务并等待训练
确认页面无红色约束报错后点击「提交」。成功后回到「模型训练」列表。
图 2-7 提交成功:绿色提示(预计约 30 分钟,以平台为准)+ 列表状态常先为「排队中」
图 2-8 进入「训练中」:可用「查看 / 日志 / 终止」
图 2-9 状态变为「训练成功」:操作列会出现「模型转换」「模型部署」入口,此时再进入下一节
- 状态流转:排队中 → 训练中 → 训练成功(失败则看详情或日志后改数据/参数再提交)
- 「查看」可查阅配置与详情;「日志」可观察训练过程;异常可用「终止」
- 训练成功后,列表操作里可直接选择「模型转换 / 模型部署」,也可切到对应页签「新增…」
- 训练耗时取决于数据量与参数,排队/训练期间可先准备其他模块所需内容
-
满足参数约束后提交,并等到列表状态变为「训练成功」
2.5 转换与发布(两条出口)
仅当训练状态为训练成功后再做(见图 2-9)。转换页、部署页在训练未完成时可能「暂无数据」,属正常。
模型转换(必做)
切到「模型转换」页签(训练未成功前可能暂无数据),选择新增模型转换:
图 2-10 「模型转换」列表页 → 选择「新增模型转换」
图 2-11 填写转换名称(≤30 字),在「模型转换任务」中选中刚训练成功的任务 → 确定
图 2-12 提交成功后列表出现记录,状态多为「排队中」→ 转换中 → 转换成功
- 「模型转换任务」须选择已训练成功的对应任务;转换名称填写错误不影响关联,但若选错任务将导致训练或转换对象错误
- 转换成功后可下载端侧产物(接模块四);若用于云端 API,还需完成部署
- 排队/转换期间可用「查看 / 终止」;预计时长以平台绿色提示为准
模型部署(云端出口)
切到「模型部署」页签,选择新增模型部署(须已有转换成功的产物):
图 2-13 「模型部署」列表页 →「新增模型部署」
图 2-14 填写部署名称,在「模型部署任务」中选中对应任务 → 确定;注意弹窗红字:新部署成功后,原已部署成功的模型会自动终止
图 2-15 部署成功后打开「API接口」:可见访问地址与 APP_ID / APP_KEY → 详细调用见 模块三
部署注意
同一账号下新部署会终止原部署。请勿以明文将密钥写入前端代码,也请勿上传至公开代码库。
-
训练成功后完成转换,并选择云端部署或端侧下载之一
2.6 如何确认训练生效?
- 预留未参与训练的测试集
- 自动指标:BLEU、ROUGE、Accuracy、F1 等
- 按任务设计规则指标:抽取(字段召回、JSON 可解析率)、分类(Top-1/k)、生成(事实一致性、重复率)
- A/B 对比:微调前 vs 微调后、基座 vs LoRA
- 鲁棒性:边界场景、对抗样本
- 格式检查:特殊 token、函数调用输出
- 多人盲评:指令跟随、风格一致性
关键原则
客观指标 + 主观评估,缺一不可。训练完成后,建议用模块三 API 或模块四端侧,对固定 5~10 个 STEM 问题做微调前后对比。
- 任务分析:先调 prompt,确认必须微调后再启动
- 数据准备:JSONL + dataset_info.json,严格对齐 BlueLM 模板
- 训练启动:从 LoRA 开始,先小批量试验,再扩量调整参数
- 调参重点:r、alpha、target_modules、learning_rate、dropout
- 部署 + 验证:测试集指标 + 主观 A/B + 边界场景(→ 模块三 / 模块四)
本模块完成检查
数据符合模板且条数满足要求;创建任务满足参数约束并训练成功;完成转换,并知道如何获取云端凭据或端侧包。