1. 大模型 Scaling 到底在“扩”什么
很多人第一次接触大语言模型训练,看到“Scaling”这个词,脑子里浮现的就是“把模型做大”。这个理解不算错,但只对了一半。真正在一线做过训练的人会告诉你,Scaling 是一整套关于资源如何分配、收益如何预估、配置如何取舍的系统工程。它涉及三个可以独立调节的维度:模型参数量、训练数据量、以及投入的计算量。这三者之间不是简单的正比关系,而是存在一套被大量实验验证过的经验规律。
我先把结论摆在前面:大模型的能力提升,核心驱动力不是单一维度的堆砌,而是三个维度的协同扩展。你只扩模型不扩数据,模型会“吃不饱”,表现为训练损失下降但下游任务提升有限;你只扩数据不扩模型,模型容量不够,学到的模式会被参数瓶颈卡住;你扩了模型和数据但算力没跟上,训练不充分,最终效果可能还不如一个充分训练的小模型。这三个坑我在不同项目里都见过,后面会逐一拆开讲。
这篇文章适合谁看?如果你正在做模型训练相关的技术选型,或者需要向团队解释“为什么我们要花这么多算力做这件事”,又或者你只是好奇那些动辄千亿参数的模型到底是怎么规划出来的,那这篇内容应该能给你一些可以直接参考的思路。我会尽量用从业者之间交流的方式来讲,不堆公式,但关键的计算逻辑和参数选择依据会讲清楚。
2. 扩展方向的三个维度与选型逻辑
2.1 参数量扩展:什么时候该“做大”
参数量扩展是最直观的方向。从早期几亿参数的模型,到后来百亿、千亿级别,每一次跳变都伴随着能力的明显跃升。但这里有一个容易被忽略的问题:参数量扩展的边际收益不是线性的。也就是说,从 10 亿扩到 100 亿带来的提升,可能远大于从 1000 亿扩到 2000 亿。
我在实际项目中总结的一个经验判断是:当你的任务复杂度主要集中在模式识别和记忆层面时,参数量扩展的收益最明显;但当任务需要多步推理和组合泛化时,单纯扩参数量的效果会打折扣,这时候数据质量和训练策略的权重就要提上来。
具体怎么判断该不该扩参数量?我一般看两个信号。第一个信号是训练损失和验证损失之间的差距。如果训练损失持续下降但验证损失早早进入平台期,说明模型容量已经够用了,再扩参数只会加剧过拟合。第二个信号是下游任务的表现。如果模型在训练集上的表现很好,但在稍作变化的测试集上就崩了,那问题大概率不在参数量,而在数据多样性。
注意:参数量扩展不是“越大越好”,而是“够用就好”。盲目追求参数规模,最后得到的可能是一个训练成本极高但实际效果提升有限的结果。
2.2 数据量扩展:被低估的关键变量
早些年大家更关注模型大小,后来一系列实验把数据量的重要性推到了台前。现在业内的共识是:在固定算力预算下,数据量和参数量需要同步扩展。如果只扩其中一个,收益会迅速衰减。
数据量扩展的核心难点不在“量”,而在“质”和“配比”。我见过不少团队花大力气收集了海量数据,结果训练出来的模型在特定任务上表现还不如用精选数据训练的小模型。原因通常有两个:一是数据重复度过高,模型反复看同样的内容,泛化能力上不去;二是数据分布和目标任务不匹配,模型学了一堆用不上的东西。
实际操作中,我建议把数据扩展分成三步走。第一步是去重和清洗,这一步的投入产出比极高,去掉重复和低质内容后,有效数据量可能减少但训练效果反而提升。第二步是配比调整,根据目标任务调整不同来源数据的比例,比如代码任务就提高代码数据的权重。第三步才是规模扩展,在前两步做扎实的基础上,再增加数据总量。
2.3 计算量扩展:连接前两者的桥梁
计算量是参数量和数据量的“乘积效应”体现。同样的参数量和数据量,用不同的计算量去训练,结果可能天差地别。这里涉及一个关键概念:训练充分度。一个模型如果训练不充分,它的能力远没有释放出来,这时候你去比较不同规模模型的效果,结论是不可靠的。
计算量扩展的选型逻辑,我一般用“算力预算倒推法”。先确定你手头有多少算力资源,然后根据经验规律反推合适的参数量和数据量组合。比如你有一批固定的加速卡,训练时间窗口是两周,那就要在这个约束下找到最优的模型规模和数据规模配比。这个配比不是拍脑袋定的,后面会讲具体的估算方法。
3. 收益规律:那些实验曲线告诉我的事
3.1 幂律关系与它的现实含义
大模型训练中有一个被反复验证的规律:模型性能随参数量、数据量、计算量的增加,呈现幂律提升。用大白话说就是,投入翻倍,效果提升一个固定比例,但这个比例会越来越小。这条规律的价值在于,它让“预测”成为可能。你可以在小规模实验的基础上,推算大规模训练的大致效果,从而判断这笔投入值不值得。
但幂律关系有一个重要的前提:三个维度要同步扩展。如果你只扩一个维度,曲线会很快变平。我做过一个对比实验,固定数据量和计算量,只增加参数量,结果发现性能在初期提升明显,但很快就进入平台期。反过来,固定参数量,同时增加数据量和计算量,性能提升的持续性要好得多。
这个规律对实际工作的指导意义是:不要孤注一掷地扩某一个维度。如果你发现当前模型的性能提升放缓了,先检查是不是某个维度成了瓶颈,而不是盲目地继续加码。
3.2 收益递减的拐点怎么判断
收益递减是必然的,但拐点出现的位置很关键。我的经验是,拐点通常出现在某个维度相对其他维度明显滞后的时候。比如你的模型参数量已经很大了,但数据量还停留在小规模水平,那参数量扩展的收益就会很快衰减。
判断拐点的一个实用方法是做小规模消融实验。在正式大规模训练之前,先用小模型、小数据跑几组对比实验,观察不同扩展策略下的性能曲线。如果发现某个维度的曲线明显比另外两个更早变平,那它就是当前的瓶颈。
还有一个信号是训练效率的变化。当模型规模扩大到一定程度后,你会发现同样的计算量带来的损失下降越来越少。这时候就要考虑是不是该调整策略了,比如从“扩参数量”转向“提数据质量”,或者从“堆算力”转向“优化训练策略”。
3.3 不同任务类型下的收益差异
收益规律不是一刀切的,不同任务类型对扩展的敏感度不一样。根据我的观察,生成类任务对参数量和数据量都比较敏感,扩展带来的提升比较明显;分类和匹配类任务则更依赖数据质量,参数量扩展的边际收益相对较低;推理类任务最特殊,它对计算量的敏感度最高,因为推理过程本身就需要更多的计算步骤。
这个差异意味着,你在规划扩展策略时,要先明确目标任务属于哪一类。如果是推理密集型任务,那计算量的优先级就要提上来;如果是生成质量导向的任务,参数量和数据量的协同扩展就更关键。
4. 训练配置:从算力预算到参数选择
4.1 算力预算的估算方法
训练配置的第一步是算清楚你手头有多少算力。这个“算力”不是简单的加速卡数量,而是有效计算量,也就是扣除通信开销、数据加载、检查点保存等非训练时间后的实际用于梯度计算的部分。
我一般用这个公式做粗略估算:
有效计算量 ≈ 加速卡数量 × 单卡峰值算力 × 训练时间 × 利用率
其中利用率是个经验值,取决于你的并行策略和集群通信效率。在小规模集群上,利用率可能到 40% 到 50%;大规模集群上,受通信瓶颈影响,利用率可能降到 30% 甚至更低。这个数字一定要实测,不要拍脑袋。
算清楚有效计算量之后,就可以用它来反推模型规模和数据规模的组合。业内有几个经验公式可以参考,但我的建议是先做小规模实验校准,因为不同硬件、不同框架、不同并行策略下的实际效率差异很大,直接套公式容易翻车。
4.2 参数量与数据量的配比选择
参数量和数据量的配比是训练配置中最核心的决策之一。配比失衡会导致两种典型问题:模型欠拟合和模型过拟合。欠拟合表现为训练损失和验证损失都居高不下,说明模型容量不够或者训练不充分;过拟合表现为训练损失持续下降但验证损失反弹,说明数据量不足以支撑当前参数量。
我常用的配比参考是:在计算量固定的前提下,参数量和数据量应该同步增长。具体比例没有绝对标准,但一个实用的起点是让训练数据量(以 token 计)大约是参数量的 10 到 20 倍。这个比例不是死的,需要根据任务特点调整。数据多样性高的任务可以适当降低比例,数据重复度高的任务则需要提高比例。
还有一个容易被忽略的点是数据质量对配比的影响。高质量数据的“有效信息密度”更高,同样的数据量能支撑更大的参数量。所以如果你手头有精选的高质量数据,可以适当提高参数量;如果数据质量一般,那就要控制参数量,避免过拟合。
4.3 学习率与批次大小的联动调整
学习率和批次大小是训练配置中最需要“手感”的部分。这两个参数不是独立的,而是存在联动关系。一般来说,批次大小增大时,学习率也要相应提高,否则训练会变慢甚至停滞。但学习率提高的幅度不是线性的,通常遵循平方根缩放或线性缩放规则,具体用哪个要看优化器和训练稳定性。
我在实际项目中的做法是:先固定一个较小的批次大小,调出一个稳定的学习率,然后逐步增大批次大小,同时按比例调整学习率,观察训练损失曲线是否保持稳定。如果增大批次后损失曲线出现震荡,说明学习率调得太高了,需要回调。
还有一个经验是:大规模训练中,学习率预热很重要。训练初期用较小的学习率逐步升到目标值,可以避免早期梯度爆炸导致的训练不稳定。预热的步数一般占总训练步数的 1% 到 5%,具体取决于模型规模和数据特点。
4.4 并行策略的选择与取舍
当模型规模超过单卡容量时,并行策略就成了必选项。常见的并行方式包括数据并行、流水线并行、张量并行等,每种方式都有各自的适用场景和代价。
数据并行最简单,适合模型能放进单卡的情况,扩展性好但通信开销随卡数增加而增加。流水线并行适合层数很多的模型,把不同层分配到不同设备上,但会有流水线气泡导致的效率损失。张量并行适合单层参数很大的模型,把矩阵运算切分到多个设备上,但通信频率高,对网络带宽要求高。
我的建议是混合使用:在小规模集群上,数据并行加少量张量并行通常够用;在大规模集群上,需要数据并行、流水线并行、张量并行三者结合。具体怎么组合,取决于你的模型结构、集群拓扑和通信带宽。这个没有标准答案,需要根据实际情况做实验。
提示:并行策略的选择直接影响训练效率和最终效果。同样的算力预算,不同的并行策略可能导致有效计算量相差一倍以上。建议在正式训练前做小规模并行效率测试。
5. 实操过程中的关键环节与避坑经验
5.1 小规模实验的设计要点
大规模训练成本极高,不可能直接上大规模试错。所以小规模实验是整个流程中最重要的环节。小规模实验的目的是用最低的成本验证扩展策略是否可行,并为大规模训练提供参数参考。
设计小规模实验时,我一般遵循这几个原则。第一是控制变量,每次只调整一个维度,观察性能变化。第二是多组对比,至少跑三组不同配置,避免单点结论的偶然性。第三是记录完整,不仅记录最终性能,还要记录训练过程中的损失曲线、梯度范数、学习率变化等中间指标,这些信息对判断训练是否健康非常关键。
小规模实验的规模怎么定?我的经验是,用目标规模的 1% 到 5% 做实验比较合适。太小了结论不可靠,太大了成本又上去了。实验周期控制在几天以内,快速迭代。
5.2 训练过程中的监控指标
训练过程中的监控不是简单地看损失曲线,而是要建立一套多维度的健康度评估体系。我通常会关注这几类指标:
| 指标类别 | 具体指标 | 健康表现 | 异常信号 |
|---|---|---|---|
| 损失类 | 训练损失、验证损失 | 平稳下降,两者差距稳定 | 验证损失反弹或训练损失震荡 |
| 梯度类 | 梯度范数 | 稳定在合理范围 | 突然增大或持续减小 |
| 学习率类 | 实际学习率 | 按计划变化 | 与设定值偏差过大 |
| 效率类 | 每秒处理 token 数 | 稳定 | 突然下降 |
| 硬件类 | 加速卡利用率、通信耗时 | 利用率高,通信占比低 | 利用率低或通信占比高 |
这套监控体系的价值在于,它能在训练早期发现潜在问题。比如梯度范数突然增大,可能是学习率太高或者数据有问题;加速卡利用率突然下降,可能是通信瓶颈或者数据加载跟不上。早发现早调整,避免浪费大量算力。
5.3 检查点管理与恢复策略
大规模训练动辄几天甚至几周,中间难免遇到硬件故障或需要调整配置。检查点管理就是你的安全网。我的做法是:定期保存检查点,同时保留最近几个检查点以便回滚。保存频率取决于训练稳定性和存储成本,一般每几百到几千步保存一次。
检查点不只是为了恢复训练,还可以用来做中间评估。在训练过程中定期用验证集评估检查点,可以观察模型能力的演变过程,判断是否出现了过拟合或训练停滞。如果发现某个检查点的验证性能明显下降,可以回滚到之前的检查点,调整学习率或数据配比后继续训练。
还有一个细节是优化器状态的保存。很多人只保存模型参数,忘了优化器状态。恢复训练时如果优化器状态丢失,训练动态会发生变化,可能导致性能下降。所以检查点里一定要包含优化器状态、学习率调度器状态等完整信息。
5.4 数据管道的优化技巧
数据管道是训练效率的隐形杀手。我见过不少项目,模型和算力都没问题,但训练速度上不去,最后发现是数据加载成了瓶颈。数据管道的优化,核心是让数据准备和模型计算重叠进行,避免加速卡等数据。
具体做法包括:预取数据、使用多进程加载、把数据预处理放在加速卡上做等。还有一个容易被忽略的点是数据格式。把数据预处理成训练时可以直接读取的格式,比如二进制序列化格式,比每次从原始文本解析要快得多。
数据管道的优化效果可以用一个简单指标衡量:加速卡利用率。如果利用率长期低于 80%,那大概率是数据管道有问题。这时候就要检查数据加载耗时、预处理耗时、传输耗时,找到瓶颈逐一优化。
6. 常见问题与排查技巧实录
6.1 训练损失不下降怎么办
训练损失不下降是最常见的问题之一,原因可能有很多。我的排查顺序是这样的:
先看学习率。学习率太小会导致训练缓慢,损失下降不明显;学习率太大会导致损失震荡甚至发散。可以尝试用学习率扫描,找一个小范围内损失下降最快的值。
再看数据。检查数据是否有问题,比如标签错误、数据重复、分布异常等。一个实用的方法是随机抽样一些训练样本,人工检查数据质量。
然后看模型初始化。初始化不当会导致梯度消失或爆炸,训练无法正常进行。可以检查初始损失值是否合理,如果初始损失远高于随机猜测的损失,说明初始化可能有问题。
最后看优化器配置。不同的优化器对超参数敏感度不同,检查优化器的默认参数是否适合当前任务。
6.2 验证损失反弹怎么处理
验证损失反弹通常是过拟合的信号。处理方法有几种:增加数据量、降低模型参数量、增加正则化、早停等。具体选哪种,取决于你的资源和目标。
如果数据量还有扩展空间,优先增加数据。如果数据量已经固定,可以考虑增加正则化,比如权重衰减、Dropout 等。如果过拟合不严重,也可以用早停策略,在验证损失最低点停止训练。
还有一个容易被忽略的原因是验证集和训练集分布不一致。如果验证集的分布和训练集差异较大,验证损失反弹可能不是过拟合,而是分布偏移。这时候需要检查数据划分是否合理。
6.3 训练速度突然变慢的排查
训练速度突然变慢,通常有几个原因。硬件故障是最常见的,比如某张加速卡性能下降或通信链路出现问题。数据管道阻塞也会导致速度变慢,比如数据加载跟不上计算速度。检查点保存如果频率太高或存储太慢,也会拖慢训练。
排查方法是分段计时,把训练过程拆成数据加载、前向计算、反向计算、通信、检查点保存等环节,分别计时,找到耗时异常的环节。这个排查过程需要一些工程手段,但一旦定位到问题,解决起来通常比较直接。
6.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方向 |
|---|---|---|---|
| 训练损失不下降 | 学习率不当、数据问题、初始化问题 | 学习率扫描、数据抽样检查 | 调整学习率、清洗数据、重新初始化 |
| 验证损失反弹 | 过拟合、分布偏移 | 对比训练验证曲线、检查数据划分 | 增加数据、正则化、早停 |
| 训练速度变慢 | 硬件故障、数据阻塞、检查点频繁 | 分段计时 | 检查硬件、优化数据管道、降低检查点频率 |
| 梯度爆炸 | 学习率太高、初始化不当 | 监控梯度范数 | 降低学习率、梯度裁剪、调整初始化 |
| 加速卡利用率低 | 数据管道瓶颈、通信瓶颈 | 监控利用率和通信耗时 | 优化数据加载、调整并行策略 |
7. 一些个人体会
做大规模训练这些年,我最大的感受是:Scaling 不是简单的资源堆砌,而是一门关于取舍的学问。你手头的算力、数据、时间都是有限的,怎么在这些约束下找到最优的扩展路径,才是真正考验判断力的地方。
我踩过的最大的坑是早期过于关注模型参数量,忽略了数据质量和训练充分度。结果就是模型很大但效果一般,算力花了不少但收益不成正比。后来调整思路,把更多精力放在数据清洗和配比优化上,同样的算力预算下效果提升明显。
还有一个体会是:小规模实验的价值怎么强调都不为过。大规模训练的不确定性太高,直接上大规模试错成本太大。用小规模实验快速验证想法,筛选出有希望的方案,再逐步放大,这是最稳妥的路径。
最后分享一个实用技巧:建立自己的训练日志和实验记录体系。每次实验的配置、结果、观察到的现象都记录下来,时间长了你会发现很多规律,这些规律是任何文档都给不了的。我现在的很多判断,都是基于过去积累的实验记录。这个习惯看起来麻烦,但长期来看回报极高。