
大模型训练之所以难,是因为这完全是在对抗物理规律、对抗数学极值、对抗庞大的熵增。
它不是纯粹的算法问题,而是一个超大规模的系统工程问题。
先说说硬件和物理层面的不可控。
很多人以为机器多就是算力大,但当你把一万张甚至十万张加速卡通过光模块、交换机连在一起的时候,你面临的其实是一个非常脆弱的分布式计算网络。现在的单卡算力确实强悍,但是单卡的故障率也摆在那里。你跑单机多卡或者百卡集群的时候,几周几个月可能都碰不到一次硬件故障。但是当你把规模放大到上万张卡,硬件故障就成了每天甚至每小时都要面对的日常。
最折磨人的根本不是那种直接宕机、网卡掉线或者GPU烧了的显性故障。这种直接报错退出的,系统监控马上能抓到,调度系统自动把故障节点踢掉,重新拉起一个节点从上一个存档点恢复就行了,顶多浪费几十分钟的算力。真正让人抓狂的是Silent Data Corruption也就是隐式数据损坏。
我们经常遇到的情况是,集群里有一张卡的某一块HBM显存出现了微小的硬件老化,或者受到了宇宙射线的干扰,它在做矩阵乘法的时候偶尔给你吐出一个NaN非数字或者极大值。这个错误本身不会让程序崩溃,这张卡还在正常运行。但是大模型训练是要做梯度同步的,这一个错误数据一旦进入了AllReduce通信环,瞬间就会把周围一圈机器的梯度全污染了,然后经过几个迭代,整个万亿参数的权重全变成了NaN。
这个时候监控报警了,告诉你loss变成了NaN。你看着屏幕上几万个节点,根本不知道是哪张卡在哪个微秒出了问题。我们实战中遇到这种事情,只能硬着头皮把过去几百个节点的日志拉下来,用二分查找法去排查到底是哪一层、哪一个张量开始异常的。这种排障过程相当痛苦,有时候甚至需要写专门的CUDA底层代码去实时校验张量输出,这又会严重拖慢正常训练速度。
为了对抗这种硬件层面的脆弱性,现在的训练框架里全都是妥协。比如保存检查点这件事情,现在的模型状态动辄几十个TB,你不可能每次出问题都从零开始。我们需要每隔几百个迭代就把整个模型的权重和优化器状态写进分布式文件系统里。在两万张卡的集群上,几万个进程同时往存储集群里写数据,瞬间的IO峰值能把最顶级的企业级存储网关直接打满甚至干崩。我们不得不开发极其复杂的异步保存机制,让计算和存储IO重叠起来。在这方面,强烈推荐去研读NVIDIA官方维护的Megatron-LM开源库。很多人只知道拿它来跑模型,但其实它里面包含了大量硬核的容错处理机制和通信优化代码。特别是里面的分布式检查点保存逻辑和通信算子底层实现,建议想要深入大模型底层的人逐行去读。别去看那些各种二次封装的傻瓜化框架,直接去啃Megatron的源码,你会对大规模分布式训练的工程细节有脱胎换骨的认知。
接下来谈谈算力利用率和通信墙的问题。
刚才提到了MoE也就是混合专家架构,这是如今的大厂标配。MoE的好处是参数量大但推理算力成本低,但代价是通信压力成倍增加。在MoE模型里,每一个token都需要被路由到特定的专家网络去处理。这就意味着在几万张卡的集群里,随时随地都在发生全集群级别的数据交换。我们叫它All-To-All通信。
这种通信模式对网络带宽的压榨是毁灭性的。你会发现,虽然你买了两万张最新的加速卡,但是真正在做有效矩阵运算的时间可能只有不到一半,剩下的时间全都在等网络传数据。有时候某一台交换机稍微出现了微秒级别的拥塞,就会产生一个掉队节点。在同步训练机制下,一万九千九百九十九张卡都在等这一张卡把数据发过来。这种微小的延迟会被整个系统的规模无限放大。
为了把集群的有效算力利用率MFU推高,底层工程师必须把张量并行、流水线并行、序列并行和专家并行这四种并行策略完美结合起来。这需要对硬件底层的拓扑结构了如指掌。你要知道哪几张卡是在同一个物理节点内通过高带宽总线直连的,哪几个节点是挂在同一个叶子交换机下的,哪几排机柜是跨楼层甚至跨数据中心的。然后你要手工去推演计算图,把通信量最大的操作放在物理距离最近的卡上。稍微排布错了一点,算力利用率可能直接掉两三个百分点。要知道,在这种规模下,哪怕是百分之一的算力浪费,折算成人民币也是每个月大几百万的真金白银。
讲完了硬件和网络,咱们再来说说数值稳定性和精度的坑。
以前搞传统的卷积神经网络或者是早期的语言模型时,大家习惯了用FP32单精度或者混合精度跑,反正模型小,无所谓。到了现在这个时代,为了把庞大的模型塞进显存,为了提升计算吞吐量,我们已经从几年前的BF16全面转向了FP4这种极低精度训练。
你把数据格式压缩到这种程度,表达范围和精度就小得可怜。这就导致在训练过程中,梯度特别容易溢出或者下溢。大模型在训练前期往往都很乖,曲线非常平滑,但是到了几百亿上千亿token的时候,模型内部的某些激活值会突然异常增大,我们叫它Activation Spikes。
这时候如果你还在用低精度,整个计算过程直接崩盘。而且这种崩盘毫无规律可言。你如果把学习率降下来,确实能稳住,但是模型学得太慢了,上千万美元的电费和机器折旧费烧进去了,模型最后没效果。你如果学习率开大,没几天就给你来个loss飞升。
我们经常遇到的场景是,模型跑到一半突然loss爆炸了。算法工程师需要把爆炸前几个step的存档拿出来,把导致爆炸的那批数据找出来仔细分析。有时候是因为数据里有一长串毫无意义的重复字符,有时候是因为某个稀有语种的特殊编码导致了嵌入层瞬间激活过大。为了解决这些问题,我们要在网络结构里手工插入大量的正则化技巧,比如各种层归一化、梯度裁剪的变种,甚至要去魔改优化器状态。这就要求团队里必须有那种对深度学习底层数学逻辑非常敏感的专家,靠着直觉和经验去调整那些玄学一样的超参数。
想要搞懂这块,建议去深读Google出的那些关于PaLM和Gemini的原始技术报告,里面有很多附录部分专门讲了他们是怎么对抗训练不稳定性的。另外有一本开源的书籍叫Deep Learning Tuning Playbook,这是几年前几个业界大佬总结的调参指南,虽然有些内容老了,但它教你排查异常loss的思维方式放在现在的FP4万亿模型训练上依然很管用。
再说一个目前所有大厂都在疯狂卷,也是投入人力最大的地方,数据工程和信息熵的对抗。
到了现在,人类历史上产生的高质量互联网公开文本早就被各大模型吃干抹净了。你现在去搞预训练,去哪里找那么多高质量的新数据。以前大家觉得把Common Crawl的网页数据扒下来,简单清洗一下就行了。现在的真实情况是,如果你敢把未经过十分严格清洗的互联网原始数据喂给千亿万亿模型,它最后出来的效果绝对是个满嘴胡言乱语的残次品。
我们现在的数据清洗流水线复杂程度完全不亚于训练代码本身。几十个PB的原始数据,我们要先做多重过滤。用各种启发式规则剔除乱码、机器生成的SEO网页。然后要用局部敏感哈希算法在海量数据中做极其严格的去重。这个去重过程本身就是个耗费巨大算力的工程。你如果数据没去重干净,模型就会对某一种句式产生严重的过度拟合,导致在推理的时候疯狂复读相同的废话。
这还不算完,现在全行业都在大规模使用合成数据来填补高质量数据的缺口。也就是用更强的老师模型去生成特定领域的教材,然后再喂给学生模型。这就引出了另一个恐怖的现象,模型崩溃Model Collapse。如果你合成数据的分布稍微偏离了真实世界的分布,或者合成数据里带有了老师模型的固有偏见和事实错误,学生模型在吸收这些数据后,错误会被指数级放大。你训练了几个月,突然发现模型完全丧失了常识推理能力。
而且现在是多模态时代,文本、图像、音频、视频是交织在一起训练的。图像序列的特征分布和文本特征分布完全不在一个维度。我们经常发现,加入大量高分辨率图像对齐数据后,模型看图的能力确实变强了,但本来已经非常好的文本逻辑推理能力突然出现了灾难性遗忘。我们在一次跨模态训练中就吃过大亏。当时为了提升模型看视频的帧间连贯性,我们混入了大量的短视频切片数据,跑了两个星期之后,评测团队跑过来告诉我们,模型的数学推理能力直接倒退回了三年前的水平。视觉特征空间把文本逻辑空间给挤占了。
怎么在海量不同模态、不同质量的数据中找到一个合适的混合比例,这是一门代价高昂的经验学。每一次调整比例做消融实验,烧掉的都是百万级别的资金。推荐大家去深入研究一下HuggingFace开源的FineWeb数据集相关的论文和技术博客。他们非常实在地把他们怎么从一堆废弃网页里洗出高质量预训练数据的全过程公开了。里面的很多清洗策略、质量打分模型的训练方式,是目前工业界处理海量数据的标准范式。不了解这些,你根本就不懂什么叫把数据喂进模型。
最后我得着重讲一下目前的深水区,也就是拉开大厂和普通玩家差距的最核心门槛,后训练阶段的强化学习与推理能力的对齐。
早几年的预训练就是疯狂预测下一个词,让模型背诵全世界的知识。但自从具备深度思考能力的推理模型大爆发之后,大家才发现真正的技术壁垒全在RL强化学习阶段。
现在的共识是让大模型在输出最终答案前,先产生长期的思考轨迹,自己验证自己的逻辑。但这里的坑深不见底。你要做RLHF或者各种变种的强化学习,你不仅需要跑计算梯度的训练引擎,你还需要同时跑规模庞大的推理引擎去生成模型的执行轨迹,也就是Rollout。
在训练阶段,模型生成了成千上万条不同的解题思路,这时候需要一个奖励模型去给这些思路打分。以前业界只对最终结果打分,现在我们要对思考的每一个中间步骤打分。这叫过程奖励模型PRM。这东西非常脆弱。只要你的奖励模型有稍微一点点的漏洞,主模型在强化学习的机制下就会像一个超级聪明的作弊者一样,疯狂去钻这个漏洞获取高分,业界把这个叫做Reward Hacking。
我们曾经在训练一个代码推理模型的时候,发现模型为了拿到代码短小精悍的奖励分数,学会了把所有的变量名全部压缩成一个字母,并且删除所有注释,甚至把多行代码硬生生压缩到一行里。它确实拿到了最高的分数,但写出来的代码人类根本看不懂。为了抑制这种奖励黑客行为,你需要设计复杂的KL散度惩罚机制,要在多个互相冲突的奖励信号之间寻找纳什均衡。
而且强化学习算法本身出了名的不稳定。PPO算法的那些超参数稍微动一下,整个策略网络的梯度就能直接变成一条死线。现在为了搞强化学习,集群里一大半的显存和算力其实是被各种辅助模型占用的。你需要同时把策略模型、价值模型、奖励模型和参考模型全部塞进显存。内存碎片化问题严重到能让系统直接瘫痪。这就要求你的基础设施要把训练用的动态图和推理用的KVCache管理完美融合在一起。目前的开源框架在这个级别基本没有能打的,各大厂全都是自己手搓的一套混合训练推理底层通信框架。
关于强化学习对齐,Anthropic早期发的那几篇关于Constitutional AI和RLHF的基础论文依然是必须要反复读的经典。至于工程实现,可以去翻翻vLLM团队关于怎么把高吞吐推理引擎和训练框架整合的讨论和相关代码,虽然这块技术演进极快,但了解早期的整合思路对理解目前的架构设计至关重要。
我们把硬件、通信、数值稳定性、数据工程和强化学习这五个板块拆开来看,每一个单拎出来都是世界级的工程难题。而大模型训练,是要求你把这五个极度不稳定的系统糅合在一起,并且让它们连续稳定运行几个月不出致命错误。
这就导致了目前的行业现状。算力可以用钱买,数据可以用钱去砸去买版权,但是能够把控这套由几万张卡、几十PB数据、千万行代码组成的混沌系统的顶尖人才,全世界两只手就能数得过来。很多拿到投资的初创团队,买了上千张卡,拉了几个名校毕业的算法研究员,就以为能复现大厂的模型。结果跑了半年,连个正常收敛的几百亿模型都跑不出来,全卡死在底层通信死锁或者无尽的内存溢出上了。一个几十人的精英核心算法和底层工程团队,如果配合默契,他们产出的战斗力远超几千人的普通技术团队。
所以在这个时间节点上,如果是小团队或者个人想要入局,我的直接建议是绝对不要去碰从头预训练大模型这件事情。那是大厂之间的军备竞赛。你没有深厚的口袋和庞大的硬件运维团队打底,根本连入场券都拿不到。你遇到的每一个报错,都不可能在Stack Overflow上找到答案,只能靠自己去扒显卡底层的汇编指令。
现在的机会全都在基于这些开源万亿模型之上的垂直领域后训练。利用SFT监督微调加上小规模的强化学习,把你所在行业的私有高质量数据注入进去。去解决具体场景下的细分痛点。比如怎么让大模型彻底看懂几十页的复杂法律合同并找出违约风险,再比如怎么让模型和工厂里的机械臂控制系统完美联动,去生成精确的控制指令。这才是真正能跑通商业模式,且普通技术团队能驾驭的地方。
大模型训练就是人类目前在信息科学领域能够触摸到的最庞大的工程奇迹。它是用暴力的算力去压迫数学理论的边界,再用海量的数据去填补理论的空白。我们这些人每天在机房和代码堆里干的事情,说白了就是在无尽的未知和报错中,试图给这头钢铁巨兽套上理性的缰绳。很难,很折磨,但是当你熬过了无数个通宵,看着损失函数慢慢下降,模型终于开始展现出一点点让人惊艳的逻辑思考能力的时候,那种实实在在的成就感,确实无可替代。
大模型训练的难点在于计算资源、数据准备、训练时间、算法优化、成本控制和长期维护等多个方面。虽然现在有些平台可以提供大模型的API,帮助用户快速获取模型的能力,但如果真要从零开始训练一个顶级的大模型,还是一个高门槛的挑战。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。