2、硬件环境准备:GPU服务器选型、NVSwitch与NVLink拓扑、InfiniBand与RoCE网络、存储与文件系统规划
各位同学,咱们直接进入正题。NVSHMEM 这东西,说白了就是让 GPU 之间能像共享内存一样通信。但前提是——你的硬件得撑得住。我见过太多人代码写得飞起,结果一跑就崩,最后发现是网卡拓扑不对。嗯,这章咱们就把硬件底子打扎实。
2.1 GPU 服务器选型:别只看算力
选服务器,我个人的习惯是先看三点:GPU 型号、NVLink 带宽、CPU 与内存配比。别光盯着 TFLOPS,通信瓶颈才是多节点场景下的命门。
| GPU 型号 | NVLink 带宽 | 显存容量 | 适用场景 |
|---|---|---|---|
| H100 SXM | 900 GB/s | 80 GB | 大规模多节点训练 |
| A100 SXM | 600 GB/s | 80 GB | 中小规模集群 |
| V100 SXM | 300 GB/s | 32 GB | 老旧集群兼容 |
2.2 NVSwitch 与 NVLink 拓扑:全互联才是王道
NVSwitch 是什么?你可以把它想象成一个超级交换机,专门给 GPU 之间用的。NVLink 就是连接 GPU 和 NVSwitch 的高速公路。
为什么这个拓扑重要?因为 NVSHMEM 依赖 GPU 之间的直接内存访问。如果拓扑是「菊花链」或者「部分互联」,那通信延迟会成倍增加。
我建议你部署前先跑一下 nvidia-smi topo -m,看看 GPU 之间的 affinity。我曾经遇到一个客户,8 张卡只连了 4 个 NVSwitch,结果跨 Switch 通信延迟直接翻倍。嗯,这就是典型的「省钱省出问题」。
# 检查 GPU 拓扑
nvidia-smi topo -m
# 输出示例(重点关注 NVLink 连接)
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7
GPU0 X NV1 NV1 NV1 NV2 NV2 NV2 NV2
GPU1 NV1 X NV1 NV1 NV2 NV2 NV2 NV2
...
2.3 InfiniBand 与 RoCE 网络:跨节点通信的命脉
多节点场景下,GPU 之间跨服务器通信靠什么?要么 InfiniBand,要么 RoCE。我个人更倾向 InfiniBand,原因很简单——稳定、低延迟、硬件卸载做得好。
| 网络类型 | 典型带宽 | 延迟 | 成本 | NVSHMEM 适配度 |
|---|---|---|---|---|
| InfiniBand HDR | 200 Gbps | ~1.2 μs | 高 | 原生支持 |
| InfiniBand NDR | 400 Gbps | ~0.8 μs | 极高 | 最佳选择 |
| RoCE v2 | 100/200 Gbps | ~2.5 μs | 中 | 需调优 |
你想想看,NVSHMEM 的 nvshmem_put 和 nvshmem_get 操作,底层走的就是 RDMA。如果网络延迟高,那整个应用的性能就全毁了。
RoCE 也不是不能用,但需要你仔细调 PFC、ECN 这些流控参数。说白了,RoCE 对网络丢包零容忍,一旦丢包性能断崖式下跌。我建议新手直接上 InfiniBand,省心。
2.4 存储与文件系统规划:别让 I/O 拖后腿
很多人只关注 GPU 和网络,却忽略了存储。NVSHMEM 虽然主要做 GPU 间通信,但数据加载、checkpoint 保存都依赖存储系统。
我个人习惯把存储分成三层:
- 热数据层: 本地 NVMe SSD,用于临时缓存和 checkpoint 写入。建议每个节点至少 2 块 3.84TB NVMe。
- 温数据层: 分布式文件系统,比如 Lustre 或 GPFS。用于存放训练数据集和模型参数。
- 冷数据层: 对象存储或 NFS,用于归档和备份。
嗯,这里要注意:不要用 NFS 做主力存储。我曾经有个项目,团队图省事用 NFS 挂载数据集,结果训练时 GPU 一直在等数据加载,利用率不到 30%。后来换成 Lustre,直接飙到 90% 以上。
# 检查文件系统挂载参数(以 Lustre 为例)
lfs df -h /mnt/lustre
# 输出示例
UUID bytes Used Available Use% Mounted on
lustre-MDT0000_UUID 1.0T 200G 824G 20% /mnt/lustre[MDT:0]
lustre-OST0000_UUID 10T 2.0T 8.0T 20% /mnt/lustre[OST:0]
2.5 整体硬件拓扑图
下面这张图是我自己总结的典型 4 节点 NVSHMEM 硬件拓扑。你仔细看,每个节点内部 GPU 通过 NVSwitch 全互联,节点之间通过 InfiniBand 交换机连接,存储则通过独立网络接入。
这张图你看懂了吗?每个节点内部是「GPU → NVSwitch → GPU」的全互联,节点之间是「IB 网卡 → IB 交换机 → IB 网卡」的跨节点互联。存储则通过独立网络接入,避免与计算流量争抢带宽。
好了,硬件环境就聊到这。下一章咱们开始动手装软件栈,到时候你会感谢今天把硬件规划清楚的自己。