9. 最佳实践
本章把 Google TPU 基础设施的设计经验提炼成可复用的原则与检查清单。这些原则既适用于在 Cloud TPU 上落地工作的工程师,也适用于设计自研 AI 集群、或在 GPU 集群上借鉴 Google 思路的架构师。
9.1 七条核心原则
原则 1:为计算形态造专用通路,而非用通用计算硬扛
Google 最根本的经验是领域专用:稠密矩阵乘走权重驻留脉动阵列(MXU,乘法期间不访存),稀疏嵌入走 SparseCore(5% 面积换 5×–7×)。通用 CPU/GPU 的微架构(乱序、缓存层次、取指译码、线程隐藏延迟)对规则的大规模 GEMM 没有杠杆。
实践:审视你的主导 workload 的计算形态,问"哪些环节在热路径上做了与核心计算无关的事"。如果是访存、控制流、稀疏查表——考虑专用数据通路或专用核,而非堆更多通用核。
原则 2:把拓扑做成可调度、可容错的资源
OCS 让 3D-torus 的逻辑拓扑与物理放置解耦,使"任意一组空闲 cube 都能交叉连接给作业",并让 cube(64 芯片)成为故障域 blast radius。这是 99.98% 可用率的基础——"无重配性时 1024 主机作业要求每主机 99.9% 可用;引入 OCS 降到 99%"。
实践:集群设计时,把"拓扑是否可重配""故障域粒度多大"作为一等设计变量,而非事后补丁。可重配性是用 <5% 成本换可用率数量级提升的最高 ROI 投资。
原则 3:可靠性按故障类型分工,而非单点最优
NSDI'24 的双路径是教科书般的"分工":reconfigure(迁移停机、零持续税)处理机器/ICI 故障;reroute(不停机、持续步时税)处理 OCS 故障;并对症优先修复。没有"万能恢复"。
实践:梳理故障分类(按 blast radius、按可否原地绕过),为每类设计专门恢复路径,并明确"何时切换"。别指望单一策略覆盖所有故障。
原则 4:把并行从"手写通信"降级为"编译器推导"
XLA/GSPMD 让用户写单设备 JAX + 少量分片标注,编译器自动插集合通信。这把"换并行策略"从"重写通信代码"变成"改几行 YAML 逻辑轴规则",是大规模训练可维护性的关键。
实践:优先选能"标注即并行"的栈(JAX/XLA/GSPMD 路线),把并行策略表达为数据(标注/规则)而非代码(手写 AllReduce)。函数式、可追踪的前端是前提。
原则 5:检测要先于调度,而非先于故障
Borg 在选 cube 后、用户二进制前跑 preflight(end-to-end check + intent-driven checker),把"看似可调度但 golden 阈值不达标"的芯片最后一刻挡掉。healthd 持续监控 + 坏机标记不可用,让坏芯片不进可行集。
实践:健康检查不是"故障后才发现",而是"调度前就排除"。建立 golden 阈值(不只是"能跑",而是"在 spec 内"),让亚健康硬件在造成中断前被隔离。
原则 6:用"分片标注 + 单控制器"让程序跨数千设备可扩展
Pathways 用单控制器 + 异步分片数据流 + 成组派发,让一个程序 gang-schedule 到数千 TPU 且追平多控制器性能。Multislice 把集合通信分"ICI 内 + DCN"两层,让 MFU 跨 slice 不掉。
实践:跨大规模设备时,控制面可扩展性(异步派发、紧凑分片图、gang 调度)和数据面分层(快/慢互联分层归约)同等重要。别只优化数据面而让控制面成为瓶颈。
原则 7:开放软件栈,把护城河留在合适的层
Google 把编译/训练/服务软件栈全开(JAX/XLA/MaxText/JetStream),把硬件护城河留在 TPU 硅。这让它的 ML 系统研究成为社区公共知识,加速生态采纳,同时保留商业差异化。
实践:开放与闭源的分层要清醒——开放"可学习、可复现、能建立生态"的层(软件、协议、权重),闭源"差异化、资本密集"的层(硅、前沿权重)。Meta 开放权重 + OCP 硬件是另一种切法;关键是别把"应该开放以建生态的层"也闭源了。
9.2 反模式(要避免的)
| 反模式 | 为什么错 | 正确做法 |
|---|---|---|
| 用通用 GPU fat-tree + 单一大 ring AllReduce 跑 4096 芯片 | 延迟项 2·(N−1) 按总数指数,瓶颈在延迟 | torus 分维,延迟项 2·Σ(dᵢ−1) 按边长线性 |
| 故障后"等修好再继续" | 大规模同步训练 MTBF 是小时级,停机不可接受 | reconfigure(迁移)或 reroute(绕行) |
| 手写每种并行组合的集合通信 | 万亿参数下不可维护 | GSPMD 编译器推导 |
| 只在故障后做健康检查 | 坏芯片已造成中断 | preflight 调度前排除 + healthd 持续监控 |
| 把 OCS 故障也用 reconfigure 处理 | OCS blast radius 大,要换很多 cube | reroute 保留分配、付小步时税 |
| checkpoint 间隔过大 | reconfigure 回滚损失大 | 权衡间隔(见 Mini Demo) |
| 推理时不利用"权重加载主导验证成本" | 浪费了 TPU 上宽验证免费的结构优势 | 用投机解码(DFlash,~3×) |
9.3 决策检查清单
选型:何时考虑 TPU / Google 栈
- [ ] 主导计算是稠密矩阵乘 + 稀疏嵌入的混合(MXU + SparseCore 协同设计契合)。
- [ ] 需要超大规模同步训练,且重视 AllReduce 延迟(torus 优势)。
- [ ] 想要"标注即并行"的编译器自动分片(JAX/XLA/GSPMD)。
- [ ] 接受硬件闭源、重视软件栈可学习可复现(MaxText/JetStream 开源)。
- [ ] 需要 24/7 无碳电网与低 PUE 的可持续性承诺。
训练落地
- [ ] 用 MaxText 逻辑轴规则表达混合并行,不手写集合通信。
- [ ] 单 slice 不够时启用 Multislice;验证跨 slice MFU。
- [ ] Orbax checkpoint(OCDBT + Zarr3,异步),间隔权衡回滚损失。
- [ ] 依赖 Borg/GKE 优先级 + 反碎片化 + preflight 排除坏芯片。
- [ ] 核心指标:MFU、步时、恢复停机、checkpoint 开销。
推理落地
- [ ] JetStream/tpu-inference 权重分片三轴 + 连续批处理。
- [ ] HBM KV cache(必要时 int8 量化)。
- [ ] 评估投机解码(DFlash)拿 ~3×,利用宽验证免费。
- [ ] 副本冗余 + 负载均衡 + 单副本故障转移。
可靠性落地
- [ ] 启用 NSDI'24 双路径(生产默认)。
- [ ] 对 OCS 类故障接受 reroute 步时税;对机器/ICI 故障走 reconfigure + checkpoint 重启。
- [ ] 监控 reroute 活跃率(应 <2%),超则优先修复相应组件。
- [ ] 把"可用率靠重配性而非单机可靠性"写进容量规划。
可持续性落地
- [ ] 选高 CFE / 低 PUE region;优先液冷 region。
- [ ] 预估训练总能耗与碳;用 6× 能效提升趋势做容量规划。
- [ ] 关注 SMR/地热等新型清洁能源合同的可用性。
9.4 与其它案例的最佳实践对照
| 主题 | Meta(对照) | |
|---|---|---|
| 拓扑 | 3D-torus + OCS(可重配) | fat-tree + 双织物(RoCE/IB 并行验证) |
| 可靠性核心约束 | 任一芯片宕机停顿同步作业 | SDC(静默错)污染梯度 |
| 检测 | healthd + preflight(golden 阈值) | Fleetscanner/Ripple/Hardware Sentinel |
| 恢复 | reconfigure / reroute 双路径 | auto-restart + SDC 隔离 |
| 并行 | GSPMD 编译器自动分片 | PyTorch FSDP + torch.compile |
| 开放层 | 系统软件栈(JAX/XLA/MaxText/JetStream) | 权重 + OCP 硬件 |
| 闭源层 | TPU 硅 | 训练数据/配方 |
两者都是"超大规模同步训练可靠性"的顶级工程实践,但切入点互补:Google 攻"拓扑可重配 + 双路径恢复",Meta 攻"SDC 治理 + 双织物冗余"。把它们放一起读,能得到一张相当完整的"AI 数据中心可靠性"设计图。
下一章 面试题 用问答形式检验对这些原则的理解。