LLM训练-pretrain
别再被“预训练只有大厂能玩”这种话给骗了
先讲个故事,我踩过的坑。
去年接了一个医疗垂直领域的活。客户要求:用开源模型生成结构化诊断报告,要准确、要专业、要能落地。我想都没想,直接拿了一个明星base模型做指令微调。
结果你猜怎么着?
模型开始疯狂编造药名。
什么“二甲双胍加氯丙嗪联合治疗糖尿病”这种配方——我这辈子都没在药学书上看过。整个团队懵了。
后来我花了三周,试图反向查这个模型的训练数据,想知道它到底在哪个语料里见过这些乱七八糟的药。结果呢?查不了。 人家的数据源根本没公开。
那一刻我悟了——如果我当初自己做了预训练,哪怕只训几百B的token,我也能清清楚楚知道:它在哪本书、哪篇论文里见过这种药。
真正的“黑科技”,从来不是模型结构
现在圈子里天天有人喊:“预训练已经被大厂垄断了,小团队洗洗睡吧。”
我跟你说句实话:这说法又蠢又懒。
你仔细想想——你连自己训练数据里有什么都不清楚,就拿别人炼好的模型去调SFT、做RLHF。效果不好,你都不知道该怪谁。这不就像开着一辆别人改装的赛车,出了问题你连油门在哪调的都不知道吗?
说到这儿,我得爆个更大的料:数据清洗才是真正的“黑科技”。
很多人以为Pretrain的核心是模型结构,是并行策略。放屁。你给Megatron喂一堆垃圾,训出来就是垃圾。数据清洗这步,决定了一个LLM是学霸还是复读机。
我当时参考了RedPajama和FineWeb的处理方法,总结成四步。每一步都是血泪史:
开头先做数据抽取。 EPUB、PDF、HTML,格式五花八门。我试过pypdf和trafilatura,结果PDF里的表格经常乱码。血的教训是什么?抽取完必须做行级校验。 短行太多——比如聊天记录——直接扔掉。不然模型会学到一堆回车乱码。
然后过一遍启发式过滤。 粗筛阶段,就看几个指标:stopwords占比、特殊字符比例、字词重复率。我踩过最离谱的坑是什么?有些爬下来的小说网站,每个章节结尾类似的句子能重复20次。一开始没注意,模型训练到后面,开始循环输出“欲知后事如何,请听下回分解”。
你敢信?它成了个复读机!
赶紧加了N-gram去重,窗口设5,重复率超0.8的直接丢。这才救回来。
第三步是精筛。 这里我强烈推荐先训一个PPL模型。KenLM就行。跑一遍所有数据,把PPL异常高的扔掉。你猜怎么着?很多满篇乱码的垃圾文档,PPL爆到几千。然后上FineWeb-EDU那种Bert质量分类器,给数据打分——0到5分。低于2分的不配进训练集。
不这么做,模型连人民日报和营销号都分不清。
最后是安全过滤。 别以为这步是应付监管的。我实测过,只要有1%的低俗内容混进去,模型在某个领域就会莫名生成尬文。直接上关键词加小模型双保险。
还有去重。MinHash+LSH设了6个permuations、阈值0.7,跑完发现中文论坛数据重复率高达40%。
同一个问题,贴吧、、百度知道各抄一遍,模型就学会了“复制粘贴”。
训练的门道,藏在这些细节里
好,数据搞定了。训练呢?
先温习一下。预训练目标就一个:next token prediction。用cross entropy。
Loss和PPL的关系,我从那篇文章抄下来贴在了墙上:
- Loss 0.0 → PPL 1.0(完美,不可能)
- Loss 1.0 → PPL 2.7(大概二选一)
- Loss 3.0 → PPL 20.1(在20个候选里挑)
- Loss 10.0 → PPL 22026(完全瞎猜)
看懂这张表了吗?训练一个大模型时,Loss降0.5,就是巨大的提升。
我参与的一个7B模型,从Loss 2.5降到2.0,多了100B tokens的数据。所以别听人吹“我一周训出SOTA”,他大概率是拿ChatGPT蒸馏的数据来刷PPL,根本不靠谱。
但真正让很多团队翻车的,是什么?
数据拼接。
大多数Pretrain会随机把多个文档拼成长序列,文档之间加个EOS token。这招的问题是:两个无关文档的噪音共现,会让模型学到错误的相关性。
比如文档A讲“苹果好吃”,文档B讲“苹果公司股票”。模型可能学出“好吃→股票”这种魔幻关联。
我试过用segment_causal_mask,在每个文档边界加attention mask,让模型只看当前文档内的token。代码不算复杂,实测在few-shot ICL上提升了1.6%。
但有个副作用:如果用RoPE或ALiBi这种相对位置编码,跨文档的位置信息被软mask搞没了,模型实际上学不到句子间的位置关系。这个问题我现在还没完全搞定。目前的做法是在mask的同时保留一个很小的bias,而不是inf,让softmax不至于把梯度全吃掉。
别被Megatron吓住
说到训练框架,你肯定听过Megatron-LM。
没错,它是工业级标准,支持模型并行、流水线并行、数据并行三件套。但说实话——对个人或小团队的新项目,上手Megatron的代价可能比训一个模型还大。
我早期做过一个实验:用llama2.c的PyTorch实现,单卡训一个110M参数的模型,10B tokens数据。大概跑了两周(24GB显存,batch size凑合着用)。虽然慢,但让我跑通了整个流程——数据清洗、分词、training loop、decontamination验证、分析PPL。
这过程中,我对预处理、梯度累积、学习率退火的理解,比读十篇论文都深。
当你跑通一次,再切到Megatron就顺了。如果你一上来就用Megatron加128张卡,连Tensor Parallelism和Sequence Parallelism都分不清。
另外再提一句:如果你上Hopper架构的卡,FP8训练是真香。我实测用FP8训练,显存省了40%,速度提升25%,但精度在PPL上几乎没有下降(差异小于0.01)。关键是要处理好scale factor的更新频率,建议每16 steps校准一次,不然训练会发散。
“直接用开源模型不比自研香?”
肯定有人要杠了:“Qwen2.5-7B不香吗?DeepSeek-V2性能吊打很多自研模型,你干嘛还自己训?”
我承认:通用任务上,你自己训几乎不可能超过大厂的旗舰模型。
但你要想清楚三件事:
第一,Tokenization失控。
我用Llama3做金融意图识别,有个意图叫“trade.stock.buy”,被编码成了7个token。如果我自己训模型,一开始就可以把常用短语塞进词表,比如“stock_buy”设一个token,速度提升两倍,效果还稳。虽然扩词表技术很成熟,但每新增一个token,你都要花几B到几十B tokens去适应,成本不低。
第二,数据配比是黑盒。
开源模型的训练数据配比你永远不知道——英文和中文的比例、代码和书籍的比例、数学和故事的比例。如果你的下游任务涉及大量文言文或专业法律法规,你敢保证通用模型里这些东西占了足够比例?显然不会。
我见过一个团队用Llama3做法律合同生成,模型连“不可抗力条款”的标准表述都经常搞混,就是因为预训练数据里法律文本太少。
第三,Alignment的上限由Pretrain决定。
你想想,一个没学过珠算的人,你让他强化训练一百遍,他还是不会打算盘。同理,模型在Pretrain阶段没见过高质量代码,你SFT再努力,它写出来的代码也只是在词汇层面更像代码,逻辑根本不对。
所以我的结论是:如果你的应用场景对领域深度有要求,或者你对推理速度有极致需求,自研Pretrain就是绕不开的一步。
哪怕只训一个1B参数的模型、100B tokens,去验证你对于数据配比的假设,那也是巨大的价值。
想入局?我给你几条实在建议
别一上来就想训7B、70B。
先拿一个小的架构——Karpathy的llama2.c——在单卡上跑通全部流程。我建议的参数:
- 参数量:110M到350M
- 训练数据:10B到50B tokens(可以自己爬或从RedPajama抽取)
- 硬件:单张4090或A100,足够
- 验证:每1K steps算一次holdout PPL,同时跑HellaSwag和MMLU的zero-shot看趋势
我自己的经历:350M的模型训70B tokens,PPL从12降到6.2,HellaSwag从35%涨到58%。这个过程中我尝试了3种不同的数据过滤策略、2种学习率调度,并发现了拼接mask导致梯度消失的问题。
这些经验直接帮我在7B模型上省了两个月调参。
最后一句真心话:
别把时间浪费在“复现SOTA”上,去解决真实业务里的数据痛点。如果你能把领域数据清洗到教材级质量,哪怕只用1B模型,在垂直场景也能碾压通用大模型。
知识密度比参数数量更值钱,这件事在大模型时代依然没变。
读者评论 5