大模型训练实战经验总结
在当今 AI 技术飞速发展的背景下,定制化大模型的自主训练已成为满足特定行业需求、保障数据安全、提升模型应用效能的关键途径。本文将深度剖析这一过程的核心价值与实践智慧,从数据隐私保护、模型透明度增强,到数据预处理的精细操作,特别是数据配比在维持模型通用性与垂类能力平衡中的核心作用,为读者勾勒出一幅清晰的大模型训练全景图。
本文总结了大模型定制训练的核心经验,涵盖数据隐私保护、数据清洗与配比策略、训练资源显存分析及微调方案选择。详细阐述了二次预训练、SFT、奖励模型及 DPO/PPO 的数据格式规范,分析了 Base 与 Chat 模型的选择依据及 LoRA 技术的优缺点。同时提供了中文词表扩展、解决 SFT 训练退化问题的方法,以及全面的模型测评指标体系,旨在为开发者提供从数据处理到模型评估的全流程实操指南。

在当今 AI 技术飞速发展的背景下,定制化大模型的自主训练已成为满足特定行业需求、保障数据安全、提升模型应用效能的关键途径。本文将深度剖析这一过程的核心价值与实践智慧,从数据隐私保护、模型透明度增强,到数据预处理的精细操作,特别是数据配比在维持模型通用性与垂类能力平衡中的核心作用,为读者勾勒出一幅清晰的大模型训练全景图。
每个行业和应用场景都有其独特的需求,预训练的通用大模型可能并不能完全满足这些需求。自主训练大模型可以:
对于许多企业和组织而言,数据隐私和数据安全是最重要的。通过自己训练模型,可以确保数据仅在内部使用,避免数据外泄风险。
训练自己的大模型可以帮助团队更好地理解模型的内部工作机制和决策过程,这对于后续的 RAG、知识图谱、Function call 和 Agent 非常有帮助。
处理互联网数据集通常包含以下几个规则:
用了大量的行业数据,模型怎么反而变弱了?比如,对一个回答问题能力不错的模型,用大量数据做指令微调以后,模型变得不会回答问题了。得到的最宝贵的经验就是:数据配比!
大模型可能在训练过程中过度专注于垂类数据,导致 loss 的收敛不再依赖全局而是从部分数据进行考虑。
参考相关论文及实践,比较好的结果是开源数据集:垂域数据集为 4:1,即开源占比总体训练数据的 80%,而垂类数据仅占 20%。
这与预训练阶段有所不同:
直接决定训练时间的数据量是 Token 个数。
Token 的数量 = Epoch * 数据条数 * 平均数据长度 * token 转换比训练流程的简单理解:
在神经网络的推理阶段,没有优化器状态和梯度,也不需要保存中间激活。少了梯度、优化器状态、中间激活,推理阶段占用的显存要远远小于训练阶段。
在训练过程中,占用显存的大头主要分为四个部分:
通常训练大模型会采用 AdamW 优化器,并且采用混合精度来加速训练。在一次的训练迭代中,每一个可以训练的参数都会有对应的 1 个梯度值,2 个优化器状态(Adam 优化器梯度的一阶动量和二阶动量)。假设模型的参数量为 φ,那么梯度的参数数量也是 φ,AdamW 优化器的参数数量为 2φ。
已知 float16(bf16)数据类型的参数会展 2 个 bytes,float32 数据类型的参数会占 4 个 bytes。
在混合精度训练的时候,会使用 float16 的模型参数进行前向传播和反向传播,计算得到 float16 的梯度;在优化器更新模型参数时,会使用 float32 的优化器状态、float32 的梯度、float32 的模型参数来更新模型参数。因此,针对每个可训练的模型参数,占用了 (2+4)+(2+4)+(4+4) = 20 bytes。如果使用 AdamW 优化器和混合精度训练来训练参数量为 φ的大模型,模型参数、梯度和优化器状态占用的显存大小为 20φ bytes。
为了进一步提升训练效率并降低显存占用,实际工程中常采用以下技术:
首先,有两种不同的基座模型分别是 base 和 chat 两个版本,我们要明白其中的不同:chat = base + sft。
仅用 SFT 做领域模型时:
基模型的 Base 和 Chat 选择准则:
额外小技巧:
在 transformers 层针对 q_proj, k_proj 层设计一个旁路,通过低秩分解,来进行模型参数的更新。利用矩阵乘法具备的广播来完成训练的时候原始模型全部固定,只有旁路参与训练,训练矩阵 BA 推理的时候会将矩阵 BA 相加到原始权重上,不会引入额外的推理延迟(合并模型 Merge),针对于任务的切换可以通过切换支路来完成。
通过低秩参数来改变模型参数,从而以极小的参数量来实现大模型的间接训练。
LoRA 训练的优点:
LoRA 训练的缺点:
{
"completion": "下埔,是台湾宜兰县头城镇的一个传统地域名称...",
"source": "wikipedia.zh"
}
{
"instruction": "你是谁?",
"input": "",
"output": "我是一个由 XXX 自主训练的生成式自然语言处理模型...",
"history": [
["你好", "你好呀!请问有什么需要帮助的地方?"]
]
}
{
"instruction": "我需要举办 6 人晚宴。你能帮我推荐三道不包括坚果或海鲜的菜吗?",
"input": "",
"output": [
"好的,我将为您推荐三道不包含坚果或海鲜的菜...",
"尖椒干豆腐,土豆丝,红烧肉",
"如果是六个人,就点八个菜..."
],
"history": []
}
{
"instruction": "解释为什么下面的分数等于 1/4\n4/16",
"input": "",
"output": [
"分数 4/16 等于 1/4,因为分子和分母都可以被 4 整除...",
"1/4 与 1/4 相同。"
]
}
在 output 中有两个答案,分别表示 chosen 和 reject 来表示数据是否接收。
根据贝壳论文中的消融实验可以看出:
对于垂域模型的二次预训练,我们推荐采用的是一些比较具有高密度知识的数据文档,可以帮助模型获取对应的数据内容,例如技术文档、书籍这些内容。其次就是领域内的博客和相关介绍这其中包含很多的无用内容。
领域模型 Continue PreTrain 时可以同步加入 SFT 数据,即 MIP (Multi-Task Instruction Pre-Training)。预训练过程中,可以加下游 SFT 的数据,可以让模型在预训练过程中就学习到更多的知识。
SFT 只是一些帮助大模型获取涌现能力的手段,并不是进行大模型注入新知识的方案,因此如果领域分布差异过大且过于单一,非常容易出现这种情况。
此外,还有一些由于训练过程中的超参数导致训练效果比较差:微调初始学习率不要设置太高,lr=2e-5 或者更小,可以避免此问题,不要大于预训练时的学习率。
其他参考建议:
SFT 阶段不能太多的知识注入:过多的知识注入,或者超过模型能力本身的回答过多会导致对齐困难,会影响其学习指令遵循的能力。
通过解析训练流程、微调策略选择、资源需求评估,以及中文模型训练的独到见解,本文为读者勾勒出一幅清晰的大模型训练全景图。进一步也揭示了如何有效评测模型性能,确保其在知识广度、逻辑推理、情感理解等多维度达到高标准,为推动 AI 技术在各行各业的创新应用提供了宝贵的实操指南。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online