大模型微调sft需要多久,常见问题和做法

模型与算力

讲清 SFT 微调耗时由哪些因素决定、怎么按自己条件粗估、跑起来后怎么判断卡住还是正常。

准备做 SFT 的人最容易在两个点上卡住:一是排期时不知道该留多少时间,二是一跑起来 loss 掉得很慢、进度条半天不动,分不清是正常还是配置有问题。这篇不给你一个「多久」的结论,而是把影响耗时的几个变量、粗估的门道和跑起来后的排查顺序讲清楚,让你自己算得出、看得懂。

准备做 SFT 的人排期时最容易犯的错,是先去问「别人跑了多久」,然后按那个数往上加一点。可别人的卡数、数据长度、微调方式和你几乎不可能一样,抄来的时间没有参考价值。真正靠谱的做法是把自己这几个变量摆出来,算一个量级,再留出重来的余量。

另一个坑发生在跑起来之后:loss 掉得慢、进度条半天不动,很多人第一反应是「是不是配错了」,于是停下来改配置,结果白白浪费一轮。这篇分两半讲,前半段说耗时被什么决定、怎么粗估,后半段说跑起来后按什么顺序判断是卡住还是正常。

决定耗时的是这几个变量,不是一个数字

排期前先把下面这张表填一遍,填不出来的格子就是你还没想清楚的地方。填完你会发现,耗时不是一个点,而是一个区间,区间宽度取决于你对数据和流程的熟悉程度。

变量怎么影响耗时排期时要确认的事
训练 token 总量条数乘平均长度,长样本会把时间拉得比预期长很多平均长度和最长样本各是多少,有没有超长样本混进来
是否全参微调全参的显存与时间都比参数高效方法上一个台阶显存够不够,不够就换方法而不是硬调 batch
卡数与通信多卡不总是线性提速,卡间通信会吃掉一部分收益扩卡后单步时间是否真降了,要实测不能假设
轮数与保存频率每轮都算时间,checkpoint 写得勤会周期性停顿要保存几份、评测插几次,这些都要算进总时长
  • 先看训练 token 总量,不要只数样本条数,一条超长样本可能顶几十条短样本;
  • 再看是全参还是参数高效方法,这是最粗的那道分水岭,先定这个再谈其他;
  • 卡数、卡间通信和 batch 大小共同决定吞吐,加卡前先确认单步时间有没有真降;
  • 轮数、checkpoint 保存频率、评测插得勤不勤,都在悄悄吃掉时间,要单独列出来。

怎么给自己粗估一个量级

  1. 测单步时间拿几十步的实测耗时除以步数,这个数比任何理论估算都靠谱。测的时候用真实数据,别拿 toy 数据凑。
  2. 算总步数训练 token 总量除以(batch 乘序列长度乘卡数)得到大概步数,再乘单步时间就是理论下限。
  3. 留重来余量在下限基础上留出可观的余量给数据加载、断点续跑和配置试错。数据已经清洗定型、流程跑过一遍的第二次训练,余量可以压小。
  4. 做端到端演练先拿小比例数据跑通全流程,确认数据加载、保存、评测都正常,再上全量。

粗估的价值不在于准,而在于让你提前知道哪一步最可能拖时间。如果你的估算里数据加载占比很高,那优化方向就不是加卡,而是改数据管线和预处理。想对照不同模型规模的大致资源需求,可以到 /models 看模型资料,再到 /tools/speed-test 实测自己环境的吞吐。

跑起来以后:卡住还是正常的判断顺序

进度条不动是最容易误判的场景。按下面的顺序看,从下往上排查,基本能定位到是哪一层的问题。

GPU 利用率
长期偏低多半卡在数据管线,不是算力不够
loss 与梯度范数
有点波动是正常的,一条直线或直接 NaN 要先查学习率和脏样本
checkpoint 写入
大文件落盘会周期性造成停顿,别当成挂了
日志刷新节奏
日志间隔设太长会让人误以为没在跑,先确认日志本身是否在刷
现象先查什么常见原因
进度条不动但 GPU 忙日志刷新间隔和保存频率正在写 checkpoint 或日志缓冲没刷出来
GPU 利用率一直很低数据加载和预处理数据管线是瓶颈,算力在等数据
loss 一条直线学习率和数据学习率设错或有大量重复样本
loss 直接 NaN脏样本和数值精度数据里有异常值,或混合精度不稳

想把时间压下来,动哪几个开关

时间压不下来时,很多人的第一反应是加卡。但加卡有边际递减,而且要先确认瓶颈不在数据侧。更稳妥的顺序是先动序列长度和有效 batch,再考虑参数高效方法和混合精度,最后才是扩卡。每一项压缩都要拿验证集对照质量,掉得多就别硬压。

  • 优先从序列长度和有效 batch 上省,这两项对吞吐的影响最直接;
  • 参数高效方法和混合精度是性价比最高的几项,但要拿验证集看质量损失;
  • 梯度累积可以在显存不变的前提下提高有效 batch,适合显存吃紧的场景;
  • 先跑小比例数据做端到端演练,确认全流程通了再上全量,避免全量跑到一半发现配置错。

不同微调方式和硬件组合的耗时差异很大,站内的价格与资源对照页会随行情更新,具体数字到 /price-watch 核对当时的记录,别拿旧截图做排期依据。

下一步排期前先把自己环境的单步吞吐测出来,再套进上面的估算流程,比问任何人「要多久」都准。站内的速度实测工具可以直接跑一轮。

常见问题

SFT 一般要跑多久?

没有通用答案,它取决于模型规模、是否全参、样本量和卡数,从几十分钟到几天都可能。可行做法是先跑几十步测单步时间,再按总步数推算,并留出重跑余量。具体算力价格可以到站内算力页面按当时的数字核对。

为什么我跑得比别人的经验慢很多?

常见原因是序列长度比别人长、用了全参而不是参数高效方法、卡数更少,或者数据加载成了瓶颈。先测 GPU 利用率和单步耗时,再逐项对照,别直接怪硬件。

训练中途能不能停?

能,但要提前开好断点保存并确认能续跑,否则重来一遍时间成本更高。停之前把日志和 checkpoint 目录留好,方便下次接着跑。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。