本文是Megatron 专家面试题系列的 Level 0,覆盖 M001-M012。重点是Megatron-LM/MCore/TE 边界、package、parallel state、配置与训练 iteration。
2. Level 0:Megatron 全局架构(M001-M012)
M001. Megatron-LM、Megatron-Core 和 Transformer Engine 分别是什么?
高分回答要点
- Megatron-LM 是完整训练应用与参考 recipes,包含参数解析、数据、训练循环和模型入口;Megatron-Core 是可复用的模型并行训练库。
- MCore 提供 transformer/model、TP/PP/CP/EP、distributed、optimizer、checkpoint 等核心抽象;Transformer Engine 提供 NVIDIA 优化 layer、attention、FP8 和 fusion 路径。
- “用了 Megatron”必须说清是跑
pretrain_gpt.py、调用 MCore API,还是只复用了并行 linear;三者工程责任不同。
追问:本项目直接调用 GPTModel、TransformerConfig 和 get_forward_backward_func(),属于 MCore API 实验,不是完整 Megatron-LM 数据训练 recipe。
前置知识与分析过程:先区分“应用、训练库、加速后端”三个层级,再沿一次训练调用说明谁负责数据和训练循环、谁负责模型并行、谁提供优化 kernel。最后把自己的项目映射到其中一层,避免用仓库名称替代真实调用范围。
主问题得分点(10分):说清三者定义 3 分;能画调用/依赖关系 3 分;能说明接入和调试责任 2 分;准确陈述本机只直接使用 MCore API 的边界 2 分。
追问分析与参考回答:从 import 和控制权判断:脚本自己初始化 torch.distributed、构造 synthetic batch、optimizer 和训练循环,只把模型、parallel state 和 PP schedule交给MCore,因此属于“直接集成MCore API”;没有使用Megatron-LM完整参数/数据/训练入口,也没有走TE spec。
追问得分点(5分):指出直接调用对象 1 分;说明训练循环归属 2 分;区分 Megatron-LM recipe 与 TE 路径 1 分;不夸大版本/能力 1 分。
M002. 请画出 Megatron-Core 的核心 package 地图。
高分回答要点
parallel_state管 group/rank;tensor_parallel管分片 layer/mapping/RNG;pipeline_parallel管 schedule/P2P。transformer用 config/spec 组装 layer;models.gpt提供 GPTModel;distributed/optimizer管梯度和模型状态。dist_checkpointing管 sharded state 与 reshard;datasets管训练样本;transformer.moe管 router/dispatcher/experts。
追问:给一个 loss 异常,要求你说先看 GPTModel -> TransformerBlock -> TransformerLayer -> Attention/MLP 哪一层。
前置知识与分析过程:先按“全局状态、模型、并行运行时、优化器、持久化”分类 package,再从 loss 反向沿 module tree 找第一个异常 tensor,而不是从目录逐个猜。要同时指出 TP/PP 通信位于哪些包。
主问题得分点(10分):核心 package 与职责 4 分;能画模型调用链 2 分;能画 parallel/optimizer/checkpoint 横向依赖 2 分;给出异常定位顺序 2 分。
追问分析与参考回答:先用 loss/logits 判断末端,再在每层挂 hook 或 NVTX 比较 TP1 reference;若进入某层前正常、attention 后异常,就下钻 QKV、attention kernel 与 output projection;若单层都正常,再查 vocab-parallel loss、gradient finalization 和 optimizer。
追问得分点(5分):给出二分位置 1 分;逐层 tensor oracle 2 分;关联 TP collective 1 分;能区分 forward、loss 与 optimizer 问题 1 分。
M003. parallel_state.initialize_model_parallel() 的职责是什么?
高分回答要点
- 根据 TP/PP/CP/EP 等维度创建 process groups,维护 global rank 到各维 local rank/world size 的映射。
- 为 tensor、pipeline、data、context、expert 及 embedding 等特殊同步提供 group getter。
- 它建立通信拓扑,不创建模型分片本身;模型 module 根据 config 和当前 rank 决定本地参数/层。
追问:为什么 group 创建顺序必须跨 rank 一致?communicator identity 与 collective sequence 不认识业务 tensor 名称。
前置知识与分析过程:先列 world rank 与 TP/PP/DP 等 local rank,再说明 initialize_model_parallel 如何建立 communicator。分析时区分“创建 group”“保存 handle”“执行 collective”三个阶段。
主问题得分点(10分):group/rank映射 3 分;getter及特殊group职责 2 分;说明模型分片与group初始化的边界 2 分;创建/销毁和顺序风险 3 分。
追问分析与参考回答:所有rank必须以相同全局顺序参与 new_group,否则同一创建序号可能得到不同成员语义。后续NCCL只按communicator和sequence匹配;即使shape相同也可能静默串错数据,shape不同则可能报错或hang。工程上应使用canonical group plan并记录group id/sequence。
追问得分点(5分):创建顺序 1 分;communicator sequence机制 2 分;静默错误反例 1 分;canonical plan/日志方案 1 分。
M004. 如何从总 GPU 数推导 DP、TP、PP、CP?EP 为什么不能总是简单相乘?
高分回答要点
- dense 常见关系为
world_size = DP x TP x PP x CP,每个 rank 在这些正交维上有坐标。 - EP 替换/细分 MoE 区域的数据并行域,且 dense 参数与 expert 参数的 DP group 可能不同;还可能有 expert TP。
- 必须用具体
parallel_stategroup 定义推导,而不是机械写x EP。
追问:给 64 GPU、TP4/PP4/CP2,DP=2;再加入 EP8 时要求画 dense-DP 与 expert-DP group。
前置知识与分析过程:先对dense模型用正交mesh计算坐标,再单独处理MoE参数所有权。不要在不知道EP与expert-DP定义时机械乘法;应先问expert数量、expert TP、EP嵌入哪个数据域。
主问题得分点(10分):dense公式与DP结果 3 分;能画任一rank四维坐标/group 3 分;说明EP非简单正交的原因 2 分;提到dense/expert参数不同同步域 2 分。
追问分析与参考回答:64卡下dense部分TP4xPP4xCP2占32卡一个model replica,DP2。加入EP8时不是把总数变512,而是在MoE层把expert分布到既有rank域;必须依据MCore parallel-state布局确定同一expert在何处复制,从而形成expert-DP。画图时分别标dense attention参数的DP伙伴和expert参数的expert-DP伙伴。
追问得分点(5分):算出DP2 1 分;拒绝机械乘EP 1 分;区分两类参数owner 2 分;说明需核对具体group实现 1 分。
M005. TransformerConfig 为什么不只是一个超参数 dataclass?
高分回答要点
- 它同时描述模型 shape、精度、并行度、重计算、fusion 和通信行为,是 module 构造与 runtime 的共同契约。
- 很多合法性依赖是组合约束,例如 hidden/head 对 TP 的可整除性、PP layer 分配、SP 与某些 TP/EP 组合。
- 配置变化可能改变参数 layout、kernel、checkpoint metadata 和数值路径,必须版本化保存。
追问:为什么恢复 checkpoint 时只保存权重、不保存训练配置可能造成静默语义变化?
前置知识与分析过程:把config字段分为模型数学语义、并行layout、数值精度和性能开关四类。逐类判断改变后是shape不兼容、可reshard、数值路径变化还是仅性能变化。
主问题得分点(10分):说明config是runtime契约 3 分;举出至少三个组合约束 3 分;关联checkpoint/layout 2 分;说明配置版本化和校验 2 分。
追问分析与参考回答:权重shape可能仍能加载,但RoPE scaling、norm、attention类型、loss精度或shared embedding配置变化会改变函数;TP/PP改变需要reshard;fusion/precision改变归约顺序。checkpoint应保存并校验模型config fingerprint,对允许变化的并行字段走显式reshard,对数学语义变化默认拒绝。
追问得分点(5分):给出静默语义例子 2 分;区分可reshard与不可变字段 1 分;config fingerprint 1 分;load时fail-fast 1 分。
M006. ModuleSpec 解决了什么架构问题?
高分回答要点
- spec 把 Transformer 组件的结构描述与具体实现解耦,可替换 attention、MLP、norm、linear 等子模块。
- 同一 GPTModel 可选择 local PyTorch 实现、Transformer Engine 实现或自定义模块,而不重写整个模型。
- spec 还承载 submodule wiring 和参数,错误替换会影响 checkpoint key/layout、fusion 和并行语义。
追问:如何安全接入一个自定义 attention?先实现接口/shape,再做单层 reference、TP 多 rank correctness、checkpoint 和性能回归。
前置知识与分析过程:先理解spec描述“构造哪个module及其submodules”,config描述shape/行为。接入时按接口兼容、并行layout、状态持久化、数值、性能五层验证。
主问题得分点(10分):spec作用 3 分;与config/module边界 2 分;checkpoint/并行风险 2 分;完整接入测试矩阵 3 分。
追问分析与参考回答:先在TP1用同权重与reference比较forward/backward;再TP2验证QKV/head shard、output projection和grad;测试dropout RNG、recompute与PP;做state-dict往返和旧checkpoint迁移;最后比较kernel、peak、tokens/s并提供feature gate/fallback。
追问得分点(5分):接口/reference 1 分;TP/PP correctness 2 分;checkpoint 1 分;性能与fallback 1 分。
M007. GPTModel 中 pre_process、post_process 和 parallel_output 各有什么作用?
高分回答要点
- PP 首 stage
pre_process=True负责 embedding/input;末 stagepost_process=True负责 output/loss,内层 stage 只持 Transformer block。 parallel_output=True保持 logits 在 TP vocab 维分片,避免为完整词表做昂贵 AllGather。- tied embedding/output 跨 PP 首尾时需要额外权重与梯度同步,不能只按普通 layer 参数处理。
追问:本机 PP 脚本为何根据 is_pipeline_first_stage/last_stage 设置这两个 flag?
前置知识与分析过程:先画无PP的embedding->blocks->output/loss,再沿深度切到stages。对每stage列本地module、输入类型和输出layout,最后判断logits是否需要在TP维gather。
主问题得分点(10分):pre/post定义 3 分;stage-local模型与数据流 3 分;parallel_output语义 2 分;tied embedding特殊同步 2 分。
追问分析与参考回答:first stage需要token/position并构建embedding,所以pre_process=True;last stage需要output layer和loss,所以post_process=True;中间stage只接收activation并运行本地blocks。错误地全开会在每rank重复端点参数和计算,且破坏P2P接口。
追问得分点(5分):first/last职责 2 分;中间stage输入 1 分;解释错误后果 1 分;联系stage参数不均衡 1 分。
M008. 一次完整 Megatron 训练 iteration 有哪些阶段?
高分回答要点
- 取 batch/切 microbatches,执行选定 PP schedule 的 forward/backward,产生本地/分片 gradient。
- 完成 TP/SP/CP/embedding/expert 等特殊梯度同步,再做 DP AllReduce 或 ReduceScatter。
- unscale/overflow、global norm/clip、optimizer step、parameter AllGather、scheduler、日志和 checkpoint。
追问:为什么“backward 返回”不代表所有通信已经完成?异步 bucket 和 param gather 需要显式 finish/wait。
前置知识与分析过程:按iteration时间轴列数据、F/B、模型并行grad finalize、DP sync、optimizer和param sync。对每步注明host调用返回、CUDA stream完成和跨rank完成不是同一时刻。
主问题得分点(10分):完整iteration阶段 4 分;特殊gradient同步 2 分;mixed precision/optimizer顺序 2 分;异步生命周期与checkpoint/logging边界 2 分。
追问分析与参考回答:backward hook可能只是把NCCL work排到通信stream,Python autograd返回时GPU仍在执行。optimizer读取main_grad前要finish_grad_sync;下一轮forward使用分片更新参数前要等待param AllGather。计时和销毁process group前也要闭环所有Work/event。
追问得分点(5分):host/GPU区别 1 分;grad wait位置 1 分;param wait位置 1 分;计时/teardown风险 2 分。
M009. 为什么 Megatron 自己管理 microbatch calculator?
高分回答要点
- 需要满足
global_batch = micro_batch x num_microbatches x DP,并协调 PP schedule 与 gradient accumulation。 - ramp-up batch 会让 global batch 随训练阶段变化,calculator 决定当前 microbatch 数。
- 数目变化会同时改变 bubble、activation 驻留、DP 同步频率和优化语义。
追问:TP 不应直接出现在 global batch 公式中;本项目通过改变 accumulation 保持不同 TP 下 global batch 公平。
前置知识与分析过程:先区分样本复制维DP和模型分片维TP/PP/CP,再写batch恒等式。分析M变化时同时检查优化语义、PP bubble、activation和step latency。
主问题得分点(10分):batch公式 3 分;calculator/ramp-up职责 2 分;与PP schedule关系 2 分;性能与训练语义trade-off 3 分。
追问分析与参考回答:GBS=MBS x accumulation x DP。TP只把同一样本的模型计算分到ranks,PP处理同一样本不同层,CP处理同一序列不同chunk,均不增加独立样本。项目中DP从8降到1时把accum从1增到8,从而保持GBS不变。
追问得分点(5分):正确公式 2 分;解释三种模型并行不计样本 2 分;给本机实例 1 分。
M010. 为什么 model-parallel RNG tracker 是必要的?
高分回答要点
- dropout 等操作既要在该复制的维度保持一致,又要在不同数据样本/分片上保持正确独立性。
- TP/SP 下 activation layout 改变,普通全局 seed 容易让各 rank 生成错误的相同或不同 mask。
- checkpoint/recompute 必须恢复 RNG 状态,确保重算 forward 使用与原 forward 一致的随机数。
追问:为什么 activation checkpoint 只重跑算子但不处理 RNG 会造成梯度错误?dropout mask 改变了函数本身。
前置知识与分析过程:先区分data-parallel seed和model-parallel RNG stream,再列dropout在TP/SP layout上的复制/分片要求。随后分析checkpoint重放需要恢复哪个时刻的RNG状态。
主问题得分点(10分):RNG tracker目的 3 分;TP/SP随机性语义 3 分;recompute状态恢复 2 分;checkpoint/可复现性 2 分。
追问分析与参考回答:原forward保存的是使用mask A的activation函数,backward重算若使用mask B,相当于对另一个函数求导。checkpoint wrapper必须保存并恢复CPU/CUDA及model-parallel RNG stream,重算后再恢复外部RNG进度,既保证mask相同又不重复消耗后续随机数。
追问得分点(5分):指出函数改变 2 分;保存/恢复时序 2 分;外部RNG进度 1 分。
M011. Megatron-Core 的“模型构建”和“训练应用”边界在哪里?
高分回答要点
- MCore model API 构建本 rank module 并定义 forward;应用层负责 tokenizer/data iterator、loss closure、optimizer/scheduler、checkpoint 和 job orchestration。
- pipeline schedule 要求应用提供
forward_step_func,返回 output 与 loss function,体现 control inversion。 - 专家能区分 library bug、recipe/config bug 和数据/集群 bug,定位入口不同。
追问:本机 PP benchmark 为什么自己提供 forward_step/loss_func,但 schedule 由 MCore 提供?
前置知识与分析过程:从dependency inversion理解:schedule只应掌握并行时序,应用掌握数据和任务loss。回答时列双方输入输出与错误归属。
主问题得分点(10分):library/application边界 3 分;callback契约 3 分;故障分类 2 分;结合本机脚本 2 分。
追问分析与参考回答:MCore schedule知道stage、microbatch和P2P,但不知道batch字段和业务loss;脚本的forward_step从iterator取tokens并调用stage model,loss_func只在last stage解释输出。这样同一schedule可服务GPT/T5等任务,同时应用承担数据正确性。
追问得分点(5分):schedule职责 1 分;callback职责 2 分;last-stage loss 1 分;抽象复用价值 1 分。
M012. 如何描述本项目的 Megatron 版本边界?
高分回答要点
- 直接实测只覆盖
core_v0.9.0的 local GPTModel、TP/SP、full recompute 和非交错 1F1B。 - 当前官方 MCore 还包含 CP、Megatron-FSDP、生产 MoE、新 distributed optimizer/checkpoint、custom PP layout、FP8 等演进能力。
- 可以用新版文档回答设计和源码题,但不能声称这些路径在 V100 上跑过或具有报告中的性能。
追问:面试中如何说版本?先报 tag/commit/hardware,再说哪些机制跨版本稳定、哪些 API/feature 需要复核。
前置知识与分析过程:把陈述分为“本机直接实测、官方当前能力、机制推断”三列。先给可复现版本,再逐功能标证据等级,不以当前文档反向改写旧实验。
主问题得分点(10分):准确版本/commit 2 分;列出实测范围 3 分;列出未实测新版能力 2 分;说明跨版本稳定机制与API差异 3 分。
追问分析与参考回答:可回答:“我在8xV100上固定core_v0.9.0实测local GPT的TP/SP、full recompute和非交错1F1B;当前MCore文档中的CP、Megatron-FSDP、生产MoE和FP8我按架构与源码学习,但没有本机性能证据。Column/Row、1F1B等数学机制稳定,具体flag、约束和checkpoint格式按目标commit复核。”
追问得分点(5分):tag/hardware 1 分;实测/未实测区分 2 分;稳定机制 1 分;目标版本复核 1 分。