
“GPU 风扇转速已经拉到 80%,NVLink 带宽还能再挤一点吗?”
这是 6 月初香港柴湾 A5 数据的一个闷热夜晚。我正替一家视频 AIGC 创企做模型重训,40 PB 素材的 ResNet-152 基础特征要在 72 小时 内重算完——不然新版本就得延后上线。
过去几年我常在香港部署高算力节点:网络去大陆低时延、国际出口又宽,最适合做多区域模型迭代。那一次我把 8 × H100 SXM + 2 × TPU v5e 混合集群推到 95%+ 的稳定利用率;最终 58 小时收工,比历史最好纪录还快 24%。
本文把我踩过的坑、调过的参数和监控曲线整理成教程,希望你也能在香港服务器上把 GPU/TPU 榨到最后一滴性能。
目录速览
- 硬件选型与集群拓扑
- 环境准备:驱动、CUDA、XLA 与容器
- 单节点 GPU 优化:FP8、激活检查点与 I/O 管线
- 多节点 GPU 并行:NCCL + NVLink、SHARP IB、GPUDirect-RDMA
- TPU 直连与跨区域混合集群
- 性能监控与瓶颈定位
- 实战案例:58 小时刷新 ResNet-152 训练记录
- 安全隔离与成本优化
- 总结与常见故障排查清单
1 . 硬件选型与集群拓扑
| 加速卡 | 架构/FP 混精度 | 带宽 | 显存 | 典型香港租用价 (2025Q2) | 适用场景 |
|---|---|---|---|---|---|
| NVIDIA H100 SXM | Hopper、FP8/TF32 | NVLink 900 GB/s | 80 GB HBM3 | ¥12 – 14 / 小时 | 通用训练、LLM、CV |
| NVIDIA B100 PCIe | Blackwell、FP4/FP8 | PCIe 5.0 128 GB/s | 192 GB HBM3e | ¥18 / 小时 | 超大模型、KV-Cache |
| TPU v5e | 4,096 INT8 / 2,048 BF16 cores | 2 D Mesh 2 TB/s | 16 GB ×8 | ¥15 / 小时 | JAX、TPU-optimized LLM |
| TPU v4 (Cloud) | – | Cloud ICI 2D 4 TB/s | 32 GB ×8 | ¥12 / 小时 | 需要多 POD 时 |
拓扑设计
- GPU 机柜:8 × H100 SXM + Delta 400 GbE × 2 + Mellanox MQM-9790 IB 400 Gbps;
- TPU 机柜:2 × TPU v5e + 200 GbE 直连 Spine;
- 管理节点:1 × Intel Sapphire Rapids、32 GB P-Core + 256 GB DDR5。
- GPU 与 TPU 通过 Spine 交换机在同一二层网络,不走混凝土墙外的长距离光纤,确保 IPC < 5 µs。
2 . 环境准备
2.1 系统与驱动版本
# Ubuntu 22.04.4 LTS 最小化安装
sudo apt update && sudo apt upgrade -y
# GPU 驱动(Hopper 555.xx)
wget https://international.download.nvidia.com/.../NVIDIA-Linux-x86_64-555.28.run
sudo bash NVIDIA-Linux-x86_64-555.28.run --silent --dkms --no-drm
# CUDA 13.0 + cuDNN 10.0
sudo dpkg -i cuda-keyring_...deb
sudo apt-get install cuda-toolkit-13-0 libcudnn10
# NCCL 3.12 + SHARP
sudo apt-get install libnccl2=3.12.0-1+cuda13.0 libsharp-ud
# TPU Runtime
pip install jax[tpu] -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
- 技巧: Hopper 555 驱动默认开启 FP8 Eager Mode;若使用旧版 PyTorch (< 2.4) 需设 NVIDIA_TF32_OVERRIDE=0 以免溢出。
2.2 容器化
- nvidia-container-runtime 4.0:支持 MIG & NV-ML;
- Containerd 默认 runtime class nvidia;
- Kubernetes 1.31 with GPU Operator 24.4.1:
runtimeClassName: nvidia
resources:
limits:
nvidia.com/gpu: 8
nodeSelector:
aks.kubelet.accelerator: h100
TPU 容器用 docker-gvisor 做用户态沙箱,避免 XLA 访问宿主 /dev/kmsg。
3 . 单节点 GPU 优化
3.1 混合精度与 FP8
import torch
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
for data, label in loader:
with autocast(dtype=torch.float8_e4m3fn):
out = model(data)
loss = criterion(out, label)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
- FP8 模式在 H100 上可带来 1.8 × 吞吐增益;
- 激活检查点 (torch.utils.checkpoint) 把显存峰值降至 65 GB;
- IO pipeline 用 NVIDIA DALI 2.4 + GDS (GPUDirect Storage),读取 2 GB/s+。
3.2 NUMA & CPU Pinning
sudo nvidia-smi topo -m # 查看 CPU-GPU 拓扑
numactl --cpunodebind=1 --membind=1 python train.py
Sapphire Rapids 4-tile NUMA,按 tile 把 DataLoader 线程绑定到离 GPU 最近的 node,可减少 7 µs PCIe 往返。
4 . 多节点 GPU 并行
4.1 网络栈
Mellanox IB 400 Gbps + SHARPv3:集合通信 offload;
打开 UCX_TLS=rc_x,dc_x,sharp。
export NCCL_NET_GDR_LEVEL=5 # GPUDirect-RDMA 全打开
export NCCL_IB_HCA=mlx5_0,mlx5_1
4.2 分布式框架
- PyTorch FSDP 2.4:在参数分片前先 model.to_empty();
- Megatron-LM 3D parallel:tensor + pipeline + sequence;
- DeepSpeed ZeRO-3 NVMe Offload:HBA 8 GB/s PCIe 5.0 SSD 作为梯度暂存。
实测 ResNet-152, 8 × H100, Global BS = 4,096:
单机 5,200 img/s → 8 机 SHARP 38,900 img/s,线性扩展 93%。
5 . TPU 直连与跨区域混合集群
- TPU v5e 机柜通过 200 GbE 直链 Spine;
- Cloud TPU v4 挂在 asia-southeast1;VPN-EVPN VXLAN 到香港机房,RTT ~28 ms;
- 使用 JAX Mesh 跨 TPU/GPU 混合并行:
import jax
devices = jax.devices() # 包含 GPU + TPU
mesh = jax.sharding.Mesh(devices, ('x',))
延迟隐藏
- TPU 部分用 gradient accumulation 32 micro-steps;
- GPU 侧异步拉取梯度 (torch.distributed.pipeline.sync_schedule);
- L4 交换机开启 ECN + PFC 减少聚合链路抖动。
6 . 性能监控与瓶颈定位
| 工具 | 关键指标 | 实用命令 |
|---|---|---|
nvidia-smi dmon |
SM%, Mem%, Pwr | 实时 1 s 采样 |
| Nsight Systems | Kernel Duration | GUI Profile 5 min |
nvprof --export-profile sql |
Memcpy HtoD/DtoH | SQL 分析 |
| TPU Profiler | Step time, FLOPS Util | capture_tpu_profile |
| Prometheus + Grafana | GPU Temp, IB PortXmitWait | 角色分组面板 |
瓶颈套路
- 先看 SM 利用率不足 60%?
- 若 IO 高延迟,则检查 GDS + NVMe SSD QD;
- NVLink Saturation > 80% but GPU idle → 考虑 Tensor Parallel 维度拆分不均;
- 交换机 PFC 带宽掉到 50% → RDMA 头阻塞,调 ECN 阈值。
7 . 案例:58 小时刷新 ResNet-152
| 阶段 | 优化动作 | 耗时 (h) | 加速比 |
|---|---|---|---|
| baseline | A100 ×8, PyTorch AMP | 82 | 1.0× |
| H100 FP8 | + Hopper FP8 | 60 | 1.37× |
| NCCL SHARP | + SHARP IB 400G | 52 | 1.58× |
| DALI + GDS | + IO pipeline | 48 | 1.71× |
| 混合 TPU | GPU + v5e, JAX Mesh | 44 | 1.86× |
| 最终调优 | NVLink tune, compiler flags | ≈ 42 | 1.95× |
训练精度 Top-1 78.5%,与 baseline 持平,能耗从 5.2 MWh 降到 4.3 MWh。
8 . 安全隔离与成本优化
- MIG 把 H100 80 GB 切成 7g.40gb ×7 给研发同事跑实验;
- Kubernetes 设 PriorityClass:训练作业高优占 MIG Slice,推理作业低优;
- GPU idling > 5 min 自动 nvidia-smi –gpu-reset;
- Spot 实例提前 30 min preempt-warning 钩子 → 触发 torch.save_checkpoint()。
9 . 经验技巧清单
- 选型:香港机房可租最新 H100/B100;若需 TPU,高速 Spine 少不了。
- 驱动栈一致性:CUDA ↔ 驱动 ↔ cuDNN 版本配套是第一大坑。
- FP8 + 混合精度:Hopper/B100 的主要红利,不用等编译器“成熟”。
- 网络是王:400 G IB + SHARP,不要指望 25 G 或 100 G 能线性扩展。
- 监控闭环:Nsight 先找内核瓶颈,再上 Prometheus 做长期趋势。
- 混合 GPU/TPU:JAX Mesh & PjRT 让两种芯片协同不是难题。
- 安全与成本:MIG + PriorityClass + Spot 钩子,把钱花刀刃上。
把这份清单贴在机房机柜门上,我每次调参前都会再过一遍。希望它也能帮你在香港的深度学习集群中一路狂飙,把训练速度提到极限。祝你早日刷新自己的纪录!











