LLM Training
返回目录 · 上一篇:NLP、Transformer 与解码
阶段一:Pretraining
目标就是最朴素的 next-token prediction:
\[ \mathcal L=-\sum_t\log p_\theta(y_t\mid y_{<t}) \]
在海量文本上最小化这个交叉熵,模型被迫把语法、事实、推理模式全都压进权重里——因为要准确预测下一个词,这些都是必需的。
数据比模型结构更决定上限,工程上真正花时间的是:
- 去重:近似重复的文档会让模型走向记忆而非泛化,也会浪费算力。通常做 MinHash / SimHash 级别的模糊去重。
- 质量过滤:规则(长度、符号比例、语言识别)加分类器打分,把网页垃圾筛掉。
- 去污染:把评测集从训练数据里洗出去,否则跑分虚高、决策全错。
- 配比:网页、代码、书籍、论文、多语种的比例。代码数据能提升推理能力,是常见的「便宜加成」。
- 课程安排:常见做法是训练末期提高高质量数据比例(annealing),以及分阶段把上下文窗口从 4k 扩到 128k,而不是全程用长序列(长序列太贵)。
产出的 base model 只会续写,不会听指令。你问它「法国的首都是哪里」,它可能续写出「德国的首都是哪里?意大利的首都是哪里?」——因为训练语料里这种句子后面常常跟着更多同类问题。
阶段二:SFT(Supervised Fine-Tuning)
- 输入:prompt 与人工/高质量模型示范回答。
- 输出:SFT policy \(\pi_{\text{SFT}}\)。
- 目标:让预训练模型学会对话格式、任务遵循和基本安全行为。
\[ \mathcal L_{\text{SFT}} =-\sum_t\log \pi_\theta(y_t\mid x,y_{<t}) \]
就是逐 token 的 cross-entropy:给定 prompt \(x\) 和已生成的前缀 \(y_{<t}\),让模型把示范答案的下一个 token \(y_t\) 的概率推高。注意它对示范里的每个 token 一视同仁,这正是 SFT 学不到偏好的原因。
阶段三:Reward Model
- 输入:同一 prompt 下多个候选回答,以及人类偏好排序或成对比较。
- 输出:奖励模型 \(r_\phi(x,y)\)。
- 目标:预测人类更偏好哪个回答。
阶段四:RL Policy Optimization
- 输入:prompt、当前 policy 采样回复、RM 奖励、reference policy。
- 输出:对齐后的 policy。
- 目标:最大化偏好奖励,同时用 KL 约束避免偏离参考模型过远:
\[ \max_\theta \mathbb E_{x,y\sim\pi_\theta} \left[r_\phi(x,y) -\beta D_{\mathrm{KL}} (\pi_\theta(\cdot|x)\Vert\pi_{\text{ref}}(\cdot|x))\right] \]
这个目标函数是后面所有内容的总纲,两项在拔河:前一项要分数高(RM 觉得好),后一项要别跑远(离参考模型不能太离谱),\(\beta\) 是这场拔河的力度旋钮。注意 \(y\sim\pi_\theta\)——回答是模型自己采样出来的,不是数据集里给定的,这正是它属于 RL 而不是监督学习的地方。
PPO:经典 RLHF 的基石
RL 在游戏和机器人上跑得好好的,搬到 LLM 上却格外难训,原因有三个:
- 动作空间极大:每一步要从整个词表(几万到十几万个 token)里挑一个。
- 轨迹很长:一条回答几百上千个 token,等于几百上千步连续决策。
- 奖励来得极晚:数学题、代码题往往要整段生成完、跑完单测才知道对不对,这叫 outcome reward。中间几百步全是「不知道好坏」。
三件事叠在一起的直接后果是策略梯度的方差极大:同一个 prompt 采样两次,回报可能天差地别,参数被推向完全不同的方向,训练极易不稳定。PPO 的每一个设计,都是围绕「把方差压下去、把单次更新限制住」展开的。
为什么不是 REINFORCE 或 Q-learning?
对比 REINFORCE
\[ \nabla_\theta J =\mathbb E[ \nabla_\theta\log\pi_\theta(y|x)(R-b)] \]
读法:\(\nabla_\theta\log\pi_\theta(y|x)\) 指向「让这条回答更容易被生成」的方向,前面乘的标量 \((R-b)\) 决定推还是拉——回报高于基线 \(b\) 就正向推一把,低于基线就往回拽。\(b\) 只为降方差,不改变梯度的期望。
它足够简洁,但整条回答只有一个标量在指挥几百步 token 的更新,方差大到难以直接使用。PPO 在此之上加了 value/advantage 估计、mini-batch 多轮复用同一批采样,以及 clipped objective,样本效率和稳定性都好得多。
对比 Q-learning
Q-learning 更适合离散且可反复探索的 Markov 环境。对 LLM:
- 状态是任意长的 token 前缀。
- 动作空间是整个大词表。
- 给每个「状态—动作」学一个 Q 值成本极高。
- 离线 bootstrapping 碰上分布外动作容易发散。
直接优化生成策略的 policy gradient 要自然得多。
核心机制三件套
① Clipped Objective:不许一步迈太远
先定义新旧策略在同一个 token 上的概率比(importance sampling ratio):
\[ r_t(\theta) =\frac{\pi_\theta(a_t|s_t)} {\pi_{\theta_{\text{old}}}(a_t|s_t)} \]
\(r_t>1\) 表示更新后模型更愿意吐出这个 token,\(r_t<1\) 表示更不愿意。它衡量的就是「这一步把策略改动了多少」。
\[ \mathcal L_{\text{clip}} =\mathbb E_t \left[ \min\left( r_tA_t, \operatorname{clip}(r_t,1-\epsilon,1+\epsilon)A_t \right) \right] \]
\(A_t\) 是优势(advantage),表示这个 token 比预期好多少。式子读作:正常按 \(r_tA_t\) 更新,但一旦 \(r_t\) 跑出 \([1-\epsilon,1+\epsilon]\)(常用 \(\epsilon=0.2\))就换成截断版本,外面再套一个 \(\min\) 取更保守的那个。
效果是好 token 的概率最多提到 1.2 倍就不再给奖励,坏 token 最多压到 0.8 倍,想再往前冲梯度直接归零。这正是名字里 proximal(近端)的由来:每次只在旧策略附近挪一小步,防止单次更新过猛毁掉模型能力。
② Actor-Critic 双模型:把方差压下去
除了负责生成的 policy(actor),PPO 还要训练一个与 policy 规模相近的 value model / critic,用来估计每个状态的价值 \(V(s_t)\),进而算出优势:
\[ A_t\approx R_t-V(s_t) \]
也就是「实际拿到的回报」减去「本来预期能拿多少」(实践中用 GAE 做更平滑的估计)。有了这个减法,梯度信号从「这条回答的绝对得分」变成「比预期好还是差」,方差大幅下降。
它其实就是 REINFORCE 里那个基线 \(b\) 的升级版:\(b\) 是一个全局常数,\(V(s_t)\) 是随状态变化、并且学出来的基线。
③ KL 惩罚:别跑离语言模型太远
在 reward 里减去相对 reference model(通常就是 SFT 模型)的 KL 惩罚:
\[ \tilde r =r_\phi(x,y) -\beta D_{\mathrm{KL}} (\pi_\theta\Vert\pi_{\text{ref}}) \]
防止模型为了刷高 RM 分数而偏离正常语言分布。这一项的调节是实操中最容易翻车的地方,下一节单独讲。
痛点与局限
- 显存和计算开销极高:训练时要同时驻留 4 个大模型——policy(actor,训练中)、critic(训练中)、reward model(推理)、reference model(推理)。其中 critic 通常和 policy 规模相近,等于凭空多出一个正在训练的大模型,显存直接爆炸。
- 调参复杂:PPO 的成败很大程度上取决于 critic 拟合得好不好。critic 估不准 → advantage 有偏 → actor 被带偏 → 采样分布随之变化 → critic 更估不准。actor 与 critic 的这场博弈很容易导致训练崩盘。
后面的 DPO 和 GRPO,本质上都是在削减这套架构的成本。
RLHF 训练的两大核心难题
上一节三件套里的 KL 惩罚,和它要防的 reward hacking,是实际跑 RLHF 时最容易翻车的两处。两者是一体两面:KL 是手段,防的就是 hacking。
① KL 惩罚与 \(\beta\) 调节
作用:扮演一根安全绳,防止模型为了拿高 RM 分数而丢掉原有的语言通顺度、语法能力和泛化能力。换个说法,它相当于在奖励最大化中加了 trust region / 正则项,同时降低 RM 在分布外区域被钻空子的风险。
\(\beta\) 过大:模型过于保守,几乎不敢改变,输出黏在 SFT/reference 上,RL 信号被 KL 压死,奖励和胜率都提不动——等于 RL 优化无效。
\(\beta\) 过小:策略快速漂移,语言质量下降,随之而来的是 reward hacking、模式化重复、输出越写越长、原有能力遗忘;监控上会看到 KL、entropy、长度或 reward 异常增长。
工程实践:不能只盯 reward 曲线,要同时观察
- RM reward 与独立人工 / LLM judge 的胜率;
- 每 token KL 和整条序列的 KL;
- 输出长度、entropy、重复率、拒答率;
- 各领域的能力回归测试。
常用做法是设一个 target KL,据此动态缩放 \(\beta\):实际 KL 高于目标就调大 \(\beta\) 收紧,低于目标就调小放松。
② Reward Hacking
现象:RM 只是人类偏好的不完美代理(proxy)。RL 优化会主动去找 RM 的漏洞——只要某种行为能骗到高分,模型就会把它做到极致。
典型例子:客服模型的 RM 偏好「礼貌、详细」。RL 之后,模型对任何投诉都先长篇道歉、重复一遍用户的观点、再承诺一个兑现不了的补偿。RM 分数一路走高,而用户真正需要的「把问题解决掉」反而消失了。
应对手段:
- 数据层面:偏好数据里加入针对冗长废话、讨好奉承(sycophancy)、虚假引用、格式投机的反例和 hard negatives,以及强调简洁性和事实性的正例。
- 奖励层面:多维奖励(帮助性、正确性、安全、长度、风格分开建模);长度惩罚(length penalty);rule-based verifier、工具执行结果或事实核验做硬校验;RM ensemble 配不确定性估计。
- 约束层面:KL 约束、长度约束和早停,避免对 RM 过优化。
- 评估隔离:严禁用训练用的那个 RM 评估最终模型,必须换独立第三方 judge(更强的模型)或人工盲评;同时定期把新 policy 的高奖励样本捞出来人工审计,做 adversarial data collection。
一个实用的过优化信号:Best-of-N 里随着 N 增大,RM 分数继续升高但人工判定的质量开始下降,说明已经在刷分了。
DPO
DPO(Direct Preference Optimization)从 KL 正则化的 RL 目标推导出最优策略与奖励之间的关系,把隐式奖励代回 Bradley-Terry 偏好模型,直接用偏好 pair 训练 policy,不需要显式 Reward Model、在线采样和 PPO。
典型目标:
\[ \mathcal L_{\text{DPO}} =-\log\sigma\left( \beta\left[ \log\frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} -\log\frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right]\right) \]
怎么读这个式子:括号里两项形状完全一样,都是「当前模型相对参考模型,把这条回答的概率抬高了多少」——DPO 把这个比值的对数当作隐式奖励。于是 chosen 减 rejected,就是一个 Bradley-Terry 里的分数差,外面套上 \(-\log\sigma(\cdot)\),正好就是第 4 节那个 RM 损失的形状。
区别只在于优化对象换了:RM 训练时调的是 \(r_\phi\),DPO 直接调 \(\pi_\theta\)。所以它提高 chosen 相对 reference 的概率优势,同时压低 rejected 的相对优势。
这也意味着 DPO 的训练循环和 SFT 几乎一样:读一批离线 pair、前向、算 loss、反向——没有采样,没有 RM,没有 critic。\(\beta\) 依然在(它来自原 RL 目标里的 KL 系数),控制允许偏离 reference 多远。
DPO 局限
- 偏好数据质量和覆盖范围决定上限。
- 不会主动探索超出数据的新推理策略。
- 对 chosen/rejected 长度、难度和噪声敏感。
- 对数学/代码等可验证任务,在线 RL 能利用执行反馈,往往更有潜力。
GRPO:面向 Reasoning 的轻量化革命
针对 PPO 的显存和调参痛点,GRPO(Group Relative Policy Optimization)做了一个关键革新:用同组样本的平均表现,替掉那个学出来的 critic。
① 取消 Critic:完全摒弃独立的 value / critic model,直接省掉接近一半的训练显存与计算量。
② Group Sampling(组内采样):对同一个 prompt,让旧策略一次性采样出一组 \(G\) 个候选回答,各自得到奖励 \(r_1,r_2,\ldots,r_G\)。
③ Group Relative Advantage(组内相对归一化):直接用这组奖励的均值和标准差算出每个回答的相对优势:
\[ A_i=\frac{r_i-\operatorname{mean}(r)} {\operatorname{std}(r)+\epsilon} \]
读法:\(\operatorname{mean}(r)\) 充当 baseline,\(\operatorname{std}(r)\) 把不同题目的奖励尺度拉齐,\(\epsilon\) 防除零。答得比同组平均好,\(A_i>0\),这条轨迹被强化;比平均差就被压下去。
关键在于这个 baseline 是自适应的:难题上大家都答不好、平均分低,你只要比同组稍好就是正优势;简单题上大家都对,优势自然趋近 0。它抵消的正是不同 prompt 之间的难度差异——而这本来是 PPO 里 critic 的职责。
④ PPO 式更新:拿着这个组内 advantage \(A_i\),继续套用 PPO 的 ratio clipping 和 KL 正则去更新 policy。所以 GRPO 不是另起炉灶,而是把 PPO 的 advantage 来源换了。
相比 PPO
- 省显存和计算:去掉与 policy 规模相近的 critic,训练时只剩 policy、reference 和 RM/verifier。
- 相对比较更稳:同一 prompt 的组内 baseline 天然消化了题目难度差异,也不存在 critic 估不准带崩 actor 的问题。
- 适合可验证任务:一个 prompt 可以采样多条推理轨迹,用标准答案或单元测试直接打分,连 RM 都可以省掉。
局限
- 每个 prompt 要采样 \(G\) 条回答,rollout 成本高。
- 若组内奖励全相同(全对或全错),标准化后 \(A_i\) 全是 0,这批数据几乎没有学习信号。
- 序列最终奖励广播到每个 token,信用分配仍然较粗。
- 组内均值/方差本身带采样噪声,\(G\) 太小时不稳。
- 长度和 token-level clipping 的处理可能引入偏差
推理任务的奖励设计
前面几节的奖励都来自一个学出来的 RM。到了数学、代码这类答案可验证的推理任务,奖励的设计方式完全不同,也是当前推理模型(o1、R1 这条线)的核心。
可验证奖励(RLVR)
奖励不再是模型打分,而是一个程序:数学题比对最终答案、代码跑单元测试、形式化证明送进检查器,再加一点格式奖励(比如是否把推理过程写进指定标签里)。
好处是根本性的:规则不会被说服。第 6 节讲的 reward hacking 之所以存在,是因为 RM 只是人类偏好的近似;而单元测试没有「被讨好」这个概念,模型只能真的把题做对。这就是为什么这条路线能放心地把 RL 跑得很久。
代价是适用面窄——只能用在答案可自动判定的领域,开放式写作、对话依然得靠 RM。
Outcome Reward vs. Process Reward
| 维度 | ORM(Outcome Reward Model) | PRM(Process Reward Model) |
|---|---|---|
| 打分对象 | 只看最终答案对不对 | 给推理过程的每一步打分 |
| 标注成本 | 低,有标准答案就能自动判 | 高,要人标或自动标每一步 |
| 信号密度 | 稀疏,整条轨迹只有一个分 | 稠密,每步都有反馈 |
| 主要问题 | 蒙对也给满分 | 标注贵、步骤边界难定义、易被 hack |
ORM 的隐患:模型完全可能靠一堆错误推理凑出正确答案,ORM 照样给满分——等于在奖励错误的推理模式。信用分配也粗:整条几千 token 的推理只有一个分,模型不知道是哪一步做对了。
PRM 怎么标:早期靠人工逐步标注(OpenAI 的 PRM800K)。后来有了自动化办法——从某一步出发多次 rollout,如果从这里出发能高频到达正确答案,就认为这一步是好的(Math-Shepherd 的思路),把「步骤质量」转化成「后续成功率」。
现在的实践取向:R1 的经验是,outcome reward 加规则验证就足以激发长链推理,PRM 在大规模 RL 里训练复杂且容易被 hack(模型学会写出「看起来很像正确步骤」的话)。所以主流 RL 训练转向可验证的 outcome reward。但 PRM 在推理时的重排序(Best-of-N 里给候选打分,见 解码)依然好用——那里不做梯度更新,模型没有机会去 hack 它。
RL 激发推理能力
DeepSeek-R1 报告里两个值得记住的观察:
- R1-Zero:完全跳过 SFT,直接在 base model 上用可验证奖励做 RL,模型自己涌现出了长链推理、回头检查、换一种解法这些行为——没人教它「要反思」,只是因为反思能提高答对率。代价是可读性差、中英文混杂。
- R1:先用少量高质量长推理数据做冷启动 SFT,再做 RL,兼顾了可读性和能力。
要注意 RL 的作用边界:它强化的是模型已有的行为,而不是凭空创造新能力。这也解释了为什么小模型直接做 RL 效果远不如从大模型蒸馏
知识蒸馏(Distillation)
用一个强模型(teacher)的输出去训练一个小模型(student)。它在 LLM 时代有两种完全不同的做法。
① Logit 蒸馏(经典 Hinton 做法)
\[ \mathcal L=\alpha\underbrace{\operatorname{CE}(y,p_S)}_{\text{对真实标签}} +(1-\alpha)\,\tau^2\underbrace{D_{\mathrm{KL}}(p_T^{(\tau)}\Vert p_S^{(\tau)})}_{\text{对齐 teacher 分布}} \]
核心洞察是 teacher 的完整概率分布里藏着「暗知识」(dark knowledge):它不只说「这是猫」,还顺带说了「有 10% 像狗、0.01% 像汽车」。这些类别之间的相对关系,信息量远大于 one-hot 标签——one-hot 只告诉你答案,teacher 的分布还告诉你「哪些答案错得不离谱」。
式子里两个细节:温度 \(\tau\) 把两边的分布都调软,让暗知识(那些小概率的相对大小)显现出来;前面乘 \(\tau^2\) 是因为软化会把梯度整体缩小 \(\tau^2\) 倍,乘回来才能让这一项的权重不随温度漂移。
② 序列级 / 数据蒸馏(LLM 时代的主流)
直接让 teacher 生成大量回答,student 拿这些回答当 SFT 数据训。
- 不需要 teacher 的 logits,只要能调用它就行,因此闭源模型也能当 teacher(尽管这通常违反其服务条款)。
- 实现上就是 SFT,没有任何新机制,这是它流行的最大原因。现在绝大多数开源小模型都这么来的。
- 一定要过滤:只保留答案正确、通过单测的轨迹(即拒绝采样),否则等于在系统性地学习错误示范。
DeepSeek-R1 报告里一个值得记住的结论:把大模型的长链推理轨迹蒸馏进小模型,效果显著优于直接对小模型做 RL。推理能力可以「教」,但小模型自己「悟」很难——RL 只能强化模型已有的行为,而小模型压根没有那些行为可强化。
注意
- student 会继承 teacher 的错误、风格和偏见,且在没有 verifier 过滤的情况下基本无法超过 teacher。
- 蒸馏出来的模型在被蒸馏的那类任务上很强,泛化到别的分布上则未必。
合成数据(Synthetic Data)
为什么需要:高质量人类数据既有限又贵,而某些能力几乎没有现成语料——多轮函数调用、长上下文推理、罕见语言、特定格式输出,网上根本不存在成规模的例子。
常见造法
- 蒸馏式:直接用更强的模型生成(见上一节)。
- Self-Instruct 式:给少量种子任务,让模型自己扩写出更多指令,再自己作答,人工只做抽检。
- 拒绝采样(STaR / RFT):对有标准答案的题目采样多条解法,只保留答案正确的拿去训练。这是把推理能力自举上去的主力方法。
- 程序化生成:用代码、模板或形式化系统造题,天然自带标准答案。比如先随机生成一段代码再反推题面,或用符号计算库生成数学题。
- 改写原始语料:把网页内容改写成问答对或教科书风格(Phi 系列的路子),提高信息密度。
核心是「能不能自动判对错」
合成数据的价值上限,取决于你有没有一个可靠的验证器。有 verifier 的领域(数学答案匹配、代码跑单测、形式化证明检查)收益最大,因为可以放心地大规模生成再筛选;开放式写作最难,因为没人能自动判断「这段文案好不好」。
风险
- 模型崩溃(model collapse):反复用自己的生成物训练自己,分布的尾部会逐渐消失,多样性坍缩,模型越来越平庸。缓解办法是始终保留真实数据作锚点,并做严格过滤,而不是无限自举。
- 错误会被放大:一个事实错误被生成一万次,就成了模型眼中的「常识」。
- 评测污染:合成题可能与评测集撞车,需要做污染检测。
常见并行策略
训练时,GPU 内存主要用于保存:
- Parameters:模型参数;
- Gradients:每个参数的梯度;
- Optimizer States:例如 AdamW 的一阶和二阶动量;
- Activations:前向传播产生、反向传播需要的中间结果;
- Temporary Buffers:Attention、通信和算子使用的临时空间。
不同并行方法切分的是不同内容:
| 并行方法 | 主要切分对象 | 主要解决的问题 |
|---|---|---|
| Data Parallelism | 训练数据 | 提高整体吞吐 |
| ZeRO / FSDP | 参数、梯度、Optimizer States | 减少单卡模型状态 |
| Tensor Parallelism | 单层中的矩阵计算 | 单层模型放不下 |
| Pipeline Parallelism | 不同网络层 | 整个模型放不下 |
| Sequence / Context Parallelism | 序列和激活值 | 长上下文激活占用过大 |
| Expert Parallelism | MoE Experts | MoE Expert 参数过大 |
实际训练通常不会只使用一种,而是根据内存、通信和集群拓扑组合使用。
Data Parallelism
Data Parallelism 的基本做法是:
- 每张 GPU 保存一份完整模型;
- 不同 GPU 处理不同数据;
- 每张 GPU 独立完成前向和反向传播;
- 通过 All-Reduce 同步梯度;
- 所有 GPU 使用相同梯度更新参数。
DP 和 DDP 的区别
在 PyTorch 中:
-
DataParallel通常由一个进程控制多张 GPU,主卡容易成为瓶颈; -
DistributedDataParallel通常每张 GPU 使用一个独立进程,通过 All-Reduce 同步梯度。
实际多 GPU 训练一般使用 DDP,而不是旧式的 DataParallel。
需要注意:
Data Parallelism 并不会减少单张 GPU 保存的模型状态,只是把数据分给不同 GPU。
如果模型本身无法装入单卡,需要使用 FSDP、ZeRO、TP 或 PP。
ZeRO 与 FSDP
普通 Data Parallelism 在每张 GPU 上都保存完整的:
- Parameters;
- Gradients;
- Optimizer States。
ZeRO 的核心思想是:
既然不同 Data-Parallel Ranks 最终维护的是同一个模型,就不需要让每张 GPU 永久保存所有模型状态。
Tensor Parallelism(TP)
把单层矩阵乘法沿维度切到多卡。例如列并行和行并行线性层。适合模型单层过大时,但层内频繁 collective,对高速互联要求高。
Tensor Parallelism 的优点:
- 可以切分单个超大线性层;
- 降低每张 GPU 保存的参数和部分激活值;
- 适合单层参数已经无法放入一张 GPU 的模型。
主要代价:
- 几乎每一层都需要 Collective Communication;
- 对 GPU 间带宽和延迟要求很高;
- TP Degree 越大,单张 GPU 的矩阵越小,计算效率可能下降。
Pipeline Parallelism(PP)
Pipeline Parallelism 按网络深度切分模型。
例如,一个 48 层模型可以分成 4 个 Stage:
- Stage 1:第 1–12 层;
- Stage 2:第 13–24 层;
- Stage 3:第 25–36 层;
- Stage 4:第 37–48 层。
一个完整 Batch 会进一步切成多个 Micro-batches,在不同 Stage 之间流水执行。
Pipeline Parallelism 的优点:
- 每张 GPU 只保存部分网络层;
- 通信内容主要是 Stage 之间的激活值和梯度;
- 可以将模型扩展到多个节点。
主要问题是 Pipeline Bubble。流水线启动和结束阶段,会有部分 GPU 等待其他 Stage。
实际选型
通常组合为 DP/FSDP + TP + PP,MoE 再加入 EP。原则是:
- TP 尽量限制在高速互联域内。
- PP 跨更慢节点也相对可行,但要减少 bubble。
- DP 扩全局吞吐。
- 并行度不是越高越好,通信、batch、内存和容错必须联合优化。
目录
| 部分 | 内容 |
|---|---|
| 第一部分(一):机器学习与深度学习 | ML 基础、评估指标、经典算法、神经网络与优化 |
| 第一部分(二):NLP、Transformer 与解码 | 词向量、RNN / LSTM、Attention、Transformer、Scaling laws 与解码 |
| 第一部分(三):LLM 训练与并行策略 | 预训练、SFT、RLHF、DPO、GRPO、蒸馏、合成数据与并行训练 |
| 第二部分:ML Coding 基础 | CodeSignal、NumPy、Pandas、PyTorch、纯 Python 矩阵运算 |
| 第三部分:ML Coding 专题 | Transformer、经典机器学习、神经网络层与 NLP 手写实现 |