Datawhale干货
作者:Hugging Face团队,编译:Datawhale
如今要训练出一个高性能的 LLM,到底需要哪些条件?
已发表的研究一般特别顺理成章:合理的架构设计、精心筛选的数据集,再加上充足的算力,就能取得理想结果。论文中的实验结果光鲜亮丽,消融分析条理清晰,每个决策在事后看来似乎都理所当然。
但是,这些报告只呈现了成功的部分,还带有一丝“事后诸葛亮”式的美化——它们无法体现凌晨两点还在调试数据加载器的煎熬、训练损失突然飙升的崩溃,或是某个隐蔽的张量并行 bug 悄然拖垮整个训练过程的无奈。真实情况远比这混乱得多,充满反复试错和大量最终不会写进论文里的决策。
刚刚,Hugging Face 发布了一份 214 页的内部秘籍《Smol训练手册:构建世界级 LLMs 的秘诀》,系统的讲述了训练顶尖语言模型过程中所面临挑战、关键决策及复杂的现实情况,一天就获得了 655.4K 次的浏览。

原文地址:https://huggingface.co/spaces/HuggingFaceTB/smol-training-playbook#how-to-read-this-blog-post
我们整理了整个博客中一套完整奏效的方案,以及 Hugging Face 团队在训练中的真实经验。如想要更深入了解,可以阅读原文。
第一阶段:训练之前先决策
训练一个高性能的 LLM 是一个高风险项目,所以在训练之前一定要从战略层面回答三个核心问题:为什么训练(Why)、训练什么(What)和如何训练(How)。
在投入大量计算资源之前,必须进行严格的自我审视。很多时候,失败不是参数错,而是不该训练却训练了。

1. 明确目标与定制化需求(Why → What)
训练 LLM 的理由必须具体且不可替代。面对日益强大的开源生态,团队必须首先确认:现有的模型是否能通过提示词工程(Prompting)或微调(Fine-tuning)来解决问题?只有当目标集中在研究(探索新架构)、生产(处理领域特有词汇或满足边缘设备部署等约束)或战略开源(填补生态空白,如强大的端侧模型)时,定制预训练才具有价值。
Hugging Face团队在训练 SmolLM3 时的战略目标便是填补市场对强大、高效端侧小模型的空白,因此模型类型被确定为 3B 密集的 Llama 风格架构。
2. “去风险”的消融实验
大模型的行为往往并不直观,仅凭理论推断是无法做出正确决策的。所以,消融实验(Ablations)是确定最终训练方案的唯一途径。
要让消融真正有用,实验必须快速迭代且有强大的区分力。为此,必须严格遵循“一次只修改一个变量”的核心规则。在 LLM 训练的复杂环境中,不同的组件往往以非线性方式相互作用。如果一次改动多个配置,即便结果变好,也无法判断究竟是哪一项起作用,后续决策就失去依据。只有当单独改动被验证为有效,才能把它并入基线,再在新的基线上测试下一个改动,形成可解释、可回滚的累积式进步。
在采纳标准上,遵循“去风险(Derisking)”原则:而任何架构或超参数的修改,只有在通过实验证明其有助于目标性能或训练效率时,才会被采纳。
这里的“有帮助”,不仅指目标能力提升,也可以是可测量、有意义的工程收益,比如更快的推理、更低的内存、更高的稳定性,并且不得以牺牲其他关键性能为代价。
之所以要这么严格,是因为训练 LLM 的成本极高。以 SmolLM3 为例,预训练阶段的消融与调试就消耗了超过一半的总成本(共 161,280 GPU·h)。在这样的压力下,团队必须实行战略性实验(strategic experimentation):只针对那些能对模型性能产生实质性影响的修改进行测试。
关键架构选择(以 SmolLM3 为例):
注意力机制:采用 GQA(Grouped Query Attention),在不显著损失效果的前提下压缩 KV 缓存、提升推理效率;同时整体性能与 MHA 基本匹配。
嵌入层:共享输入/输出嵌入可减少参数量。对于小型模型而言,把有限的参数预算优先投入到增加网络深度(层数),通常比不共享嵌入带来的收益更高。
位置编码:采用 RNoPE(交替使用 RoPE 和 NoPE)。该方案在保持短上下文表现的同时,为更高效的长上下文外推打好基础。
数据处理:启用文档内掩码——阻断训练序列中跨文档 token 的相互关注,有助于训练稳定性,并利于长上下文能力的扩展。
超参数:优化器选 AdamW,稳定可靠;学习率采用 WSD(Warmup–Stable–Decay) 调度,比 Cosine Decay 更灵活,便于在运行中调整总训练时长。
第二阶段:预训练先打底
数据是决定模型能力的首要因素。因此,专业的训练流程应该围绕一套有规划的多阶段训练课程(Curriculum)展开:
前期用覆盖更广、体量更大的通用数据建立基础分布;等到进入学习率衰减的后期,再注入少量但高质量的数据集(如 Stack-Edu、FineMath4+)。原因很简单:在低学习率阶段,模型对新信息的吸收更稳、更持久,高质量样本能在不破坏早期已学能力的前提下,最大程度地塑形模型的最终行为。
多语言能力则从分词器开始就要算清账。我们不凭感觉选词表,而是用两个直接的指标来衡量:生育率(fertility)看一个词平均被切成多少个 token(越低说明越紧凑、高效),连续词比例(proportion of continued words)查看常见词是否被过度切碎(比例越低越好)。
在这些指标的约束下,SmolLM3 选择了 Llama-3.2 的分词器:它在多语言覆盖与模型体积之间给出了合理平衡,让训练出来的模型既不会被冗余 token 拖慢,也能在多语场景下保持有效表达。
第三阶段:大规模跑起来
大规模训练的现实是:系统故障和性能瓶颈是必然发生的。SmolLM3 的 11T-token 训练也不例外:
1. 吞吐量和数据瓶颈
一开始吞吐量莫名下滑,排查后发现根因在共享 FSx 存储。随着负载上升,FSx 会驱逐数据集碎片,训练端频繁读到“缺页”,IO 抖动把吞吐量直接拉崩。团队没有在远端存储上继续死磕,而是立刻把完整的 24TB 语料整体下放到各节点的本地 NVMe RAID(/scratch),让训练直接从高速本地盘顺序读取,吞吐瞬间回到稳定高位。
问题并未就此结束。随后大家注意到:即便 IO 正常,吞吐量仍会随着 step count 增长而缓慢走低。把监控细节和火焰图对齐后,矛头指向了内置 nanosets 数据加载器——步数越大,它维护索引的开销越高,正把计算时间吞掉。与其继续给加载器打补丁,团队直接换用线上验证过的 TokenizedBytes 加载器,绕开索引热区,数据就地按字节切分与映射,训练立刻恢复到目标吞吐。
这两次处置背后的共同要点是:先把瓶颈“物理化”(IO/存储拓扑、加载器复杂度),再做最短路径的结构性改动;不要把算力浪费在与基础设施“拔河”上。
2. 最微妙的错误:张量并行性 Bug
训练推进到1 万亿个 token时,评测曲线开始掉队,与预期不符。团队没有立刻调参,而是按模块做系统性的排查:数据、优化器、学习率日程、评测管线都被逐一排除后,问题最终指向了最不显眼的一层——Tensor Parallel(TP) 的播种逻辑。
我们发现各个 TP 秩竟然复用了同一个随机种子,导致权重初始化在并行分片间高度相关;表面上一切正常,实际却让有效表示空间被“挤”在一起,训练效率被悄悄拖慢。确认根因后,团队果断在 1T token 处重启训练,并确保每个 TP 秩使用独立种子。
这次事故的教训很直白:哪怕所有大部件和小规模消融(包括 TP=2 的实验)看起来都正常,底层并行化设置中的微小错误也会在规模效应下被放大。
第四阶段:后训练最后打磨
预训练赋予了 SmolLM3 原始能力,但要把它变成真正可用的助手,还得靠后训练把这些能力收束成稳定、可控的行为。
SmolLM3 的目标是做一款混合推理(Hybrid Reasoning)的模型——用户可以通过系统消息切换思考模式(/think 打开链式思考,/no_think 直接给结论),而不是把所有请求都强行走一条推理路径。
整条后训练链路从 SFT(监督微调) 起步。它便宜、稳定,是所有后训练流程的起点。关键的做法是:只在助手 token 上计算损失,把用户输入完全掩码掉。这样训练信号就集中在“如何产出一段高质量回答”,而不会把“自动续写用户问题”的坏习惯学进去。
为了让模型在一开始就具备更强的推理骨架,团队会在 SFT 之前加一段 mid-training(继续预训练):用大规模的“蒸馏推理数据”喂一遍,让模型先把推理范式学扎实,再进入指令对齐。实操上,这一步可以使推理基准的性能提高近三倍。
在具备基本行为后,接下来是偏好优化(Preference Optimization),用成对或对比反馈把模型朝人类偏好“拧紧”。这一步对超参数非常敏感,学习率通常要比 SFT 再低一个量级,否则很容易把前面累出来的知识“洗掉”,出现灾难性遗忘。
最后,当任务允许自动验证时,可以引入 RLVR 一类的强化学习,让模型在闭环里自己找更优策略。不过这里存在奖励欺骗(Reward Hacking)的典型风险:模型可能通过没被提示也狂写冗长 CoT 来赚奖励,而不是更好地解决问题。对应的缓解方法是引入超长完成惩罚(overlong completion penalty)的机制,把输出长度分布拉回正常区间,逼着模型把思考用在刀刃上,而不是用字数刷分。
把以上环节连起来,就形成了清晰的一条线:mid-training 夯实推理底座,SFT 定义基本助手行为,偏好优化把风格与取舍对齐到人类偏好,必要时再用 RLVR 在自动可验场景里精修。通过系统消息控制的混合推理机制贯穿其上,让模型在需要时展开思考、在简单请求时干净利落地给出答案。
整个过程的要点只有一个:每一步都围绕“可控与可验证”来设计信号,让能力不只是更强,而且更可用。



一起“点赞”三连↓
742

被折叠的 条评论
为什么被折叠?



