基模全流程:预处理、训练与推理使用
本文记录基模(Base Model)从原始数据到可用模型的完整流程,涵盖数据预处理、预训练及推理使用三个核心阶段。
一、数据预处理
数据一般有四种来源:数据去重,质量过滤,启发式规则过滤,数据配比。
数据去重:
包含精确去重和模糊去重,文本数据通常使用minhash算法,过滤掉30%以上数据。
数据过滤:
基于困惑度的过滤(ppl),使用一个较小的开源模型(比如参数量在1B左右的base模型)来评估每段文本的困惑度。如果一段文本的困惑度太高,说明模型很难理解他(可能噪声大、语句不同),困惑度过低代表过于简单或重复无意义,这两种都会被过滤。
另一种是FastText过滤,准备几十万条正负样本,训练FastText模型,负责输出文本的质量得分,设置阈值只保留得分高于0.3的样本,成本低效率高。
启发式规则过滤,使用Gopher质量规则,基于标点数量、句子长度等过滤掉格式异常的内容,Gopher重复规则,通过n-gram重复度检测来剔除文本中重复的段落或句子,一般放在最后执行
数据配比:
我们面对的文本数据通常分为:通用网页数据,代码,数学相关文本,小语种等。
一种经典的方法是借助狄利克雷分布来随机生成多种混合比例方案(所有类别的比例加起来等于1)。比如随机生成几十组不同配比,每一组都去训练一个小规模的测试模型,然后在标准评测集上跑分,有了这些配比得分后,可以进一步训练一个回归模型,预测出哪种配比可能更好。
比较前沿的方法是:
动态配比,训练过程中根据模型当前在不同数据上的表现,动态调整不同类别数据的采样概率。
用model merge的技巧,先针对不同类别的数据分别训练对应的模型,然后根据配比方案,对这些模型的参数进行合并,这样能跳过根据数据配比方案训练模型的过程,直到得到这个数据配比对应的模型,节省训练资源。
最后一个:训练过程中需要有一个高质量的Eval Dataset来监控模型能力的进展,一个好的评估集能覆盖多种关键能力维度,比如数学,代码,常识回答等。我们可以根据训练中的eval loss,判断新加入的数据到底有没有用。
二、预训练
CPT(继续预训练)
pretain和CPT阶段才能真正为模型注入知识,而SFT主要是在对其模型的表达方式,预训练阶段的数据量更大,内容也更丰富,而SFT通常只使用几万到几百万条数据进行微调,有时候SFT后有些任务上的指标甚至相比SFT前有下滑,说明SFT可能会导致灾难性遗忘,反衬出CPT阶段的重要性。
CPT阶段token量一般在10T token内,这个阶段可以注入垂直领域知识,这里要求数据质量一定要高。
提升数据质量的两种思路:数据过滤和数据改写。
数据过滤时可以使用几十B模型从多维度进行评分。
数据改写是使用大模型将内容改写的更加密集。swallow-code项目在代码领域使用了这一方法。
CPT阶段同样需要进行数据配比,这里需要通过实验来确认通用数据和垂直数据的比例,过多的垂直领域数据可能导致模型遗忘通用能力,进而在OOD任务上表现下降。
可以对高质量数据进行适当上采样,通常最多重复3到4次。
三、SFT
SFT通常只对答案部分计算loss
超参选择: 一般训练2到3个epoch就可以学习到数据中的大部分知识,主要关注eval loss。
遇到OOM问题,可以尝试调整并行训练策略,同时提高张量并行(TP)和流水线并行(PP)的规模,例如各提高两倍,会比单独大幅提高其中一项的效果更好。另外尝试升级到Deepspeed Stage3,2阶段主要对优化器状态和梯度进行分片,3阶段进一步对模型参数本身进行分片,其中Offload功能可以将部分参数卸载到内存中,进一步降低显存压力。
训练过程中,观察train loss曲线是否出现突刺,如果出现,说明数据中可能存在噪声,需要检查数据质量,或者增大batch size。
不同的模型lr可能不一样,可以几组不同量级的实验都试一下(1e-5、1e-6),后面再精确搜索。
点赞与评论
喜欢这篇文章?点个赞,或留下你的想法。登录 GitHub 后即可参与。
如果评论无法加载,请检查网络连接后刷新页面。