预训练阶段

找10t规模数据,数据清洗很重要。要在数据清洗的时候把 code 等格式化数据摘出来再清洗。bert表征能力强于gpt。清洗数据时规则也很重要。数据去重。

数据去重工作有一个比较重要的意识:要先确定需要多少训练数据,再确定去重的粒度。去重工作是没有尽头的,任何时候你都能把数据继续洗下去,所以必须明确自己需要多少训练数据。需要 10T 训练数据,就卡相似度在 80% 的阈值进行去重;需要 5T 的训练数据,就卡相似度在 90% 的阈值进行去重;以此类推。目前没有任工作能证明,一条数据在 pretrain 阶段训多少遍对模型是最友好的。因此,大胆的按需去重,即使去重粒度小,导致一篇文档出现多次,也可以通过让两篇相似文档之间隔尽量多的 token 来降低影响。

大部分的技术报告里,应该都提及了自己的数据是如何配比的,基本上都是“知识 + 代码 + 逻辑”三个大类目,其中知识数据分文中文知识和英文知识,逻辑数据则可以认为是 math 数据和 cot 数据的混合体。整体上,大部分中文模型的配比都在这个区间左右:中:英:code = 4:4:2(逻辑数据的比例我没有写进去,加入多少取决于你能收集多少,其他三类数据应该是要多少有多少的存在)。我们可以根据自己的实际情况调整配比,但英文的比例一定不能太低。目前中文数据的质量不如英文数据质量基本已经成功共识,导致这个现象可能有两个原因:中文确实比英文难学,语言空间的复杂度更高;中文语料无论是干净程度还是数量级,都无法与英文语料相比较。

课程学习。

每个数据块在训练代码中,自然会对应着一个 save_checkpoint 的操作,原因也是为了便于训练回退。这里可以分享一个以前的小技巧,曾经因为 warmup 阶段,数据块大小是动态增长的,阴差阳错地导致模型的保存逻辑始终为 False。我们眼睁睁看着 tensorboard 美丽的符合预期的 loss 曲线,但就是没办法让它 save,浪费了好一通算力。汲取教训之后,组里大佬就发明了一个机制,在训练代码加了个逻辑:如果检测到某个文件夹下存在一个叫“save”的文件,则立刻 save_checkpoint,我们将其称为模型动态保存机制(一脸骄傲)。

https://arxiv.org/abs/2310.10638

先走scalinglaw再train大模型。

从零开始的 pretrain 必须选 megatron,continue-pretrain 可以考虑使用 deepspeed, 换句话说,T 级别的 token 训练量必须是 megatron,B 的级别 token 训练量无所谓

概率探针

参考

  1. 全是细节 | 聊一聊做Pretrain的经验 (qq.com)(2024/10)