本文是AI Infra 面试题系列的实践附录,包含 C01-C08 上机题、岗位选题、训练计划、评分表、证据表达和最终自检。
12. 编码与上机题
C01. 写一个 topology-aware process-group planner
要求:输入 GPU 间带宽矩阵、节点/NIC 信息和 TP/PP/DP,输出 rank placement 与各 group。
考察点:合法性校验、稳定/确定性输出、把 TP 放快链路的目标函数、非整齐拓扑的错误处理、复杂度与测试。高级追问是加入故障域惩罚和 EP All-to-All 成本。
C02. 写一个训练显存与通信估算器
要求:输入 Transformer 配置、dtype、microbatch、sequence 和并行策略,输出每 rank 参数/梯度/optimizer/activation/KV、collective bytes 和可行性。
考察点:组件化公式、GQA、ZeRO/FSDP stage、TP/PP layer 分配、recompute、临时峰值和单位测试。结果应给假设与上下界,不能伪装成精确 allocator 模拟。
C03. 实现并验证一个 PyTorch DDP communication hook
要求:实现 FP16/BF16 压缩或 PowerSGD 风格 hook,正确处理 future、stream、bucket 和误差反馈。
考察点:归约后除 world size、dtype 恢复、异步生命周期、跨 rank correctness、数值误差和 benchmark。测试必须比较多 step 参数与 baseline,而不只检查程序不报错。
C04. 写一个 profiler trace 分析器
要求:读取 Chrome trace/结构化事件,按 rank/stream/step 汇总 compute、NCCL、overlap、空洞和 straggler。
考察点:区间 union/intersection,不能直接相加并发 duration;时钟对齐、缺失事件、嵌套事件、critical path 近似和 CSV/图表输出。
C05. 实现一个简化 KV block manager
要求:支持 allocate/free、逻辑到物理 block table、prefix 引用计数、copy-on-write 和 LRU eviction。
考察点:重复释放、引用泄漏、hash collision、部分 block、OOM 原子性和多线程安全。属性测试应验证“已分配+空闲=总块数”及共享块不被提前回收。
C06. 实现 continuous batching scheduler 模拟器
要求:输入带 arrival time、prompt/output length、priority 的请求,模拟 token budget、chunked prefill、decode、KV 水位和 preemption。
考察点:状态机正确、无饥饿、TTFT/TPOT/E2E、吞吐与 goodput;比较 FCFS、decode-priority 和 deadline-aware 策略。高级追问是校准真实 GPU service-time model。
C07. 写一个 open-loop Poisson 负载发生器
要求:按指数 inter-arrival 发送异步请求,记录客户端排队、服务流式 token 时间戳、错误和未完成请求。
考察点:不能被 response completion 自节流;seed、clock、连接池、超时、取消、percentile 和 SLO goodput 定义正确。验证实际 arrival distribution 与目标 QPS。
C08. 实现原子 distributed checkpoint manifest
要求:模拟多 rank 分片写入、checksum、失败注入、完成 manifest 与恢复选择。
考察点:半写版本不可见、幂等重试、重复 rank、坏 checksum、版本兼容、垃圾回收竞态。高级追问是新 world size 的 reshard plan 与最小读放大。
13. 按岗位选择题目
不要试图一次背完全部题。先完成通用核心,再按岗位集中训练。
13.1 通用核心,所有 AI Infra 候选人
Q01-Q12、Q13-Q18、Q27-Q28、Q34-Q35、Q41-Q52、Q55、Q64-Q69、Q75-Q84、Q91-Q99、Q104-Q108、Q113-Q123、Q128、Q136、Q138-Q144。
目标:任何一道都能在 2 分钟给结构化回答,5-10 分钟完成公式、图和追问;Q75 的项目介绍应稳定控制在 110-130 秒。
13.2 训练系统/Pretraining Performance
重点:Q13-Q40、Q55-Q71、Q85-Q86、Q89-Q108、Q116-Q135、C01-C04、C08。
额外准备:optimizer/fused optimizer、distributed checkpoint、FSDP2/DTensor、CP、MoE/EP、多机 RDMA,以及真实训练 loss/MFU 诊断。
13.3 推理引擎/Serving
重点:Q41-Q64、Q68、Q72、Q87-Q88、Q90、Q109-Q115、Q136-Q145、C04-C07。
额外准备:attention backend、quantization kernel、speculative decoding、PD disaggregation、multi-LoRA、cache-aware routing 和容量规划。
13.4 Kernel/Compiler/Performance
重点:Q01-Q12、Q55-Q64、Q74、Q90、Q95-Q99、Q109-Q112、Q141-Q145、C03-C04,并现场写至少一个 Triton reduction/fused op。
额外准备:CUDA programming model、memory coalescing、bank conflict、register spill、warp primitive、PTX/SASS 基础、CUTLASS 和编译器 graph break。
13.5 集群平台/Reliability
重点:Q04-Q08、Q25-Q26、Q63-Q74、Q85-Q90、Q96-Q108、Q114-Q125、Q134、Q139、Q144、C01、C04、C08。
额外准备:Kubernetes/批调度、RDMA/RoCE、存储、镜像发布、故障域、elastic recovery、指标/日志/trace 和事故响应。
13.6 RL/后训练 Infra
重点:训练与推理两套通用核心,加 Q25、Q41-Q54、Q65-Q74、Q73、Q87、Q116-Q140、C06-C08。
额外准备:PPO/GRPO 等算法的数据依赖只需达到能设计系统接口的程度,重点讲 rollout、样本版本、policy staleness、权重同步和异步 backpressure。
14. 六周面试训练计划
第 0 天:建立基线
- 闭卷回答 Q75,并录音;限制 2 分钟。
- 随机抽 20 道通用核心题,每题 3 分钟,按 0-4 分评分。
- 完成 C02 或 C07 的 60 分钟限时版本。
- 记录四个基线:概念正确率、能独立推导比例、引用实测比例、追问后改口/失守比例。
第 1 周:硬件、通信与项目叙事
- 完成 Q01-Q12、Q75-Q78;手画 V100 拓扑、ring AllReduce 和 roofline。
- 不看报告复算 PIX/PHB/SYS、ring bytes、DDP efficiency 和 memory accounting。
- 用本仓库原始 CSV/日志随机抽一个数字,要求 5 分钟内追溯到命令、配置和结论。
- 周末模拟:30 分钟项目深挖,目标 Q75≥3 分,其余平均≥2.5。
第 2 周:DDP、FSDP 与性能分析
- 完成 Q13-Q26、Q55-Q56、C03-C04。
- 为 DDP 画 backward/bucket/NCCL 两条 stream 的时间线;能解释“累计 NCCL 时间不等于 exposed 时间”。
- 对 7B/70B 各做一张 AdamW 显存表,并给 DDP、ZeRO-2、FULL_SHARD 下界/峰值来源。
- 周末模拟:45 分钟训练轮,目标所有公式题≥3 分,故障题至少能给二分实验。
第 3 周:模型并行与大规模训练设计
- 完成 Q27-Q40、Q79-Q81、Q85-Q86、C01-C02。
- 对一个 Transformer block 手推 TP 前后 tensor shape、每层 collective bytes。
- 给 64/256 GPU 各做一个 topology-aware rank mesh;算 PP bubble 并写出 stage imbalance 观测方案。
- 补读 CP、MoE EP 和 distributed optimizer;明确哪些是官方机制、哪些尚未实测。
- 周末模拟:60 分钟训练系统设计,目标先问约束、15 分钟内给出第一版容量表。
第 4 周:推理引擎、调度与 SLO
- 完成 Q41-Q54、Q82-Q83、Q87-Q88、C05-C07。
- 对给定模型现场计算 KV bytes;分别为 prefill/decode 画 roofline 与调度关键路径。
- 用纸面或模拟器生成 arrival-rate→TTFT/TPOT/goodput 曲线,能解释 knee 而不只描述图形。
- 设计 mixed-prefix、mixed-length benchmark,列出 cold/warm/off 和 cache isolation 对照。
- 周末模拟:60 分钟推理设计,目标容量估算误差可解释、所有 SLO 都有观测点。
第 5 周:Kernel、可靠性与证据缺口
- 完成 Q55-Q74、Q84、Q89-Q90、C08。
- 用 Triton 写并 benchmark 一个 RMSNorm/softmax;至少报告 correctness、HBM bytes 估算、多 shape 和 profiler 指标。
- 做一次 kill-rank/checkpoint 恢复演练,记录 detection、abort、restart、restore 和 loss/data cursor 连续性。
- 纸面演练 NCCL hang、straggler、间歇 OOM 和升级回归,每题要求先保全现场再二分。
- 周末模拟:连续两轮 60 分钟,训练性能一轮、生产事故一轮。
第 6 周:岗位定向与全真模拟
- 按目标岗位从第 13 节抽题,每天一轮 45-60 分钟,不提前知道题目。
- 每轮至少包含:项目追问 2 道、公式推导 2 道、故障题 1 道、系统设计 1 道、反例追问 1 道。
- 每次只修复最明显的两个问题,并在下一轮复测同类题;不要用阅读代替输出。
- 最终门槛:通用核心平均≥3.2,岗位重点平均≥3.0,任何安全/正确性题不得为 0,Q75 稳定≥3.5。
15. 模拟面试评分表
每道重要题可按五个维度各 0-4 分,总分 20:
| 维度 | 0-1 分 | 2 分 | 3-4 分 |
|---|---|---|---|
| 正确性 | 核心错误/只有名词 | 机制基本正确 | 边界、反例和版本差异清楚 |
| 推导 | 无公式/数据流 | 能给主公式 | 能从 shape/bytes/critical path 推导 |
| 观测 | 只看 utilization | 能列常规指标 | 指标能区分竞争假设并定位 rank/phase |
| 实验证据 | 夸大或无数据 | 能引用结果 | 数字准确,说明对照、局限和可复现路径 |
| 生产判断 | 只追求吞吐 | 能讲 trade-off | 包含 SLO、故障、成本、发布和回滚 |
建议判定:
- 17-20:明显 senior/专项强,能主导设计并防守追问。
- 14-16:达到多数核心 Infra 岗位的强通过表现。
- 10-13:概念可用,但推导或生产经验不足,容易在深挖轮失分。
- 0-9:答案主要依赖背诵,需要回到实验和数据流。
面试官统一追问模板
为了避免“背中答案”,模拟面试官在任意题后任选两项:
- 把 GPU 从 NVLink H100 换成 PCIe V100,结论哪里变?
- 把 batch/sequence/model size 放大 8 倍,哪个项先成为瓶颈?
- 给出每 rank tensor shape 和通信 bytes,不要只说 collective 名称。
- 你会看哪三个指标来区分两个可能根因?
- 这个结论是实测、文档事实还是推断?如何证伪?
- 平均值正常但 p99 变差,下一步怎么做?
- 一个 rank/worker 中途失败,系统状态是否仍一致?
- 方案提升吞吐 10%,但多占 30% 显存,是否上线?还缺什么信息?
16. 简历和面试中的证据表达
可以直接陈述
- 在 8xV100 PCIe 单节点上建立 NCCL、DDP/FSDP、Megatron 与 vLLM 的可复现实验和 artifact 校验流程。
- 实测拓扑对 512 MiB AllReduce 的影响:PIX 约 11.74 GB/s,PHB/SYS 约 7 GB/s。
- 完成 DDP strong/weak scaling、microbatch 与 CUDA trace 分析;8 卡强扩展 2.82x,并用每 token 梯度 payload 解释效率变化。
- 量化 FSDP 容量/吞吐 trade-off,以及 TP/SP/PP/recompute 的适用边界。
- 构建 open-loop Poisson/SLO benchmark,证明 completed throughput 与 SLO goodput 会在过载区显著分离。
- 通过 DDP reducer trace 量化 bucket/gradient accumulation 的通信次数与 exposed time,验证
no_sync()将 104 个 NCCL kernel 降到 13 个。 - 实现 variable-split MoE All-to-All、原子 checkpoint manifest/failure injection 和 Triton RMSNorm,并为路由、恢复与算子建立独立 correctness oracle。
- 构造 prefix cache 工作集污染实验,证明累计 hit rate 可掩盖关键阶段近 6x 的 p95 TTFT 回归。
- 显式构造
TP2 x PP2 x DP2process group 并做 collective-order fault injection,量化 topology-aware mapping,复现 communicator 顺序错配导致的静默数据损坏。 - 用 FSDP rank 0 trace 量化 root/block wrap、backward prefetch 和 all-gather limiter,观测 block wrap 的 25 次 AllGather/13 次 ReduceScatter 与显存/吞吐 trade-off。
- 主动触发 vLLM KV preemption,并通过 metrics time series 关联 cache waterline、running/waiting、TTFT/TPOT 与吞吐;用 cubin resource usage 分析 Triton register/occupancy 上界。
- 诊断 V100/SM70 下 vLLM attention 和 collective backend 回退,并完成真实小模型端到端验证。
不应夸大
- 不写“优化最新 vLLM/SGLang”或“生产部署 70B”,本项目是兼容版本上的 synthetic systems benchmark。
- 不写“掌握多机 RDMA/生产 Megatron EP/CP”;本机 MoE 证据是受控 All-to-All toy,不包含真实 router、grouped GEMM 和收敛。
- 不把单节点短跑吞吐称为 time-to-train、模型收敛或生产 SLA。
- 不把 dummy 7B 称为真实 7B 权重质量验证。
完整数字、方法和边界见实验报告与工程深挖补充报告。面试前应能从每个简历数字追溯到 summary、raw log 和运行命令。
17. 官方参考资料
当前岗位能力画像
- OpenAI: Training Performance Engineer
- OpenAI: Distributed Training Engineer, Sora
- OpenAI: ML Systems and Training Architecture
- OpenAI: RL Training Infra
- OpenAI: Platform Systems
- Anthropic: Careers and current technical role categories
训练、通信与性能
- NVIDIA Megatron Core 0.18 Parallelism Guide
- NVIDIA Megatron Core Distributed Checkpointing
- PyTorch FSDP2
fully_shard - PyTorch DistributedDataParallel
- PyTorch
new_groupand process-group ordering - PyTorch FullyShardedDataParallel
- PyTorch Distributed Checkpoint
- TorchTitan FSDP documentation
- NVIDIA NCCL User Guide
- NVIDIA NCCL Environment Variables
- NVIDIA Nsight Systems User Guide
- NVIDIA GPU performance-counter permissions
- Triton Layer Normalization Tutorial
推理系统
- vLLM: Automatic Prefix Caching
- vLLM: Disaggregated Prefilling
- SGLang: Benchmark and Profiling
- SGLang: Prefill-Decode Disaggregation
- SGLang: Expert Parallelism
18. 最终自检清单
- 能在 2 分钟讲完项目,并准确说出至少五个关键数字。
- 能手推 Ring AllReduce、DDP efficiency、PP bubble、KV bytes 和 AdamW memory。
- 能画 DDP/FSDP/TP/PP/continuous batching 的数据流和关键 collective。
- 能解释本项目三个负结果:TP 变慢、SP 节省小、DP 非线性。
- 能解释 completed throughput 与 SLO goodput 分离,并设计 open-loop benchmark。
- 能用 profiler timeline 区分累计 kernel time、overlap 和 critical path。
- 能解释 cap 与实际 bucket、
no_sync()范围、NCCL channel/transport,以及 collective 中 peer wait 的来源。 - 能从 manifest/hash/fingerprint 说明语义恢复与逐 bit 恢复的差别,并读懂 collective timeout 日志。
- 能解释 Triton kernel 的 program mapping、最小字节模型和 launch floor,且不会把有效带宽冒充 HBM counter。
- 能设计 cache pollution/revisit 对照,并从 Prometheus counter delta 而不是累计 hit rate 判断驱逐。
- 能手推
TP2 x PP2 x DP2rank groups,并解释new_group/collective sequence/stream 生命周期的正确性契约。 - 能从 25 次 AllGather/13 次 ReduceScatter 还原 FSDP unit 状态机,并解释 PRE、limiter、allocated/reserved 的 trade-off。
- 能解释 KV preemption 为什么可能让吞吐/TPOT 变差但 mean TTFT 下降,并区分 counter 与 gauge 的采样口径。
- 能区分 cubin 静态资源、理论 occupancy、achieved occupancy 和最小字节有效带宽。
- 能为 NCCL hang、straggler、OOM、NaN 和 checkpoint 失败给出可执行二分方案。
- 能诚实陈述 V100、单机、dummy weights 和 synthetic workload 的证据边界。
- 能设计 70B 训练/推理方案,但会先询问约束并做容量与通信估算。
- 至少完成两道编码题和一次限时系统设计,且有测试而非只有主流程。