高性能计算集群如何实现节点间通信?高速互联与并行计算入门

单台服务器的算力总有上限。当模型大到一块卡装不下、当流体仿真要划分上亿网格、当基因测序要处理海量序列时,唯一的出路是把几十、几百甚至几千台机器连成一个集群一起算。但"把机器连起来"不等于"算得更快",如果节点间通信没设计好,加机器的收益会迅速递减,最后变成花钱买等待。

高性能计算(HPC)集群的本质,是让多台机器像一台机器那样协同工作。这要求两件事同时成立:一是网络足够快、足够低延迟,让数据能及时传递;二是软件层能把任务正确拆分并协调各节点的进度。前者是硬件与网络,后者是 MPI 等并行编程框架。二者缺一不可。

这篇文章从并行计算的基本模型讲起,说明为什么通信会成为瓶颈,然后介绍 HPC 集群的互联层技术(InfiniBand、RoCE、高速以太)与拓扑结构,接着给出可执行的网络检测、延迟带宽测试与 MPI 运行命令(区分 RHEL/CentOS/Rocky 与 Debian/Ubuntu),最后给出搭建与排查建议。文中带宽、延迟数字为经验量级,具体以实测为准。

并行计算的基本模型

先理解任务是怎么被拆开的,才能理解通信为什么重要。

数据并行:每个节点拿到同一份程序的副本,处理不同的数据分片。各节点在需要时交换结果(例如归约)。深度学习训练里的数据并行就是典型。

任务并行:把不同的任务分给不同节点,各自处理各自的,节点间耦合较低。

域分解并行:把一个大计算域切成若干子域,每个节点算一块。问题在于,子域的边界数据必须和邻居交换,这就是边界通信(halo exchange)。计算越细、子域越小,通信越频繁。

关键规律:计算量与通信量的比值(计算通信比)决定了扩展性。 节点越多,每个节点分到的计算越少,而通信边界相对增大。当通信时间超过计算时间,加节点反而更慢。所以 HPC 里最贵的往往不是算力,而是把算力连起来的那张网。

互联技术:InfiniBand 与高速以太

集群的互联层有两大流派:

InfiniBand(IB):专为 HPC 设计的高性能网络,具有极低延迟和极高带宽,支持 RDMA(远程直接内存访问),数据可以直接从一台机器的内存传到另一台,绕过操作系统和 CPU 的复制开销。主流速率按代际命名,从较早的 FDR、EDR 到 HDR、NDR 等,单端口速率逐代翻倍,单端口可达每秒数十 GB 到数百 GB 量级。HPC 与大规模 AI 训练普遍采用 IB。

RoCE(RDMA over Converged Ethernet):在以太网上承载 RDMA,常见有 RoCE v1 与 v2。好处是复用现有以太网生态、成本相对低,但要求网络支持无损或近似无损(PFC、ECN 等拥塞控制),配置不当容易丢包,一旦丢包 RDMA 性能急剧下降。

普通高速以太网:常用 10G/25G/100G/200G/400G 等速率。用于存储网络、管理网络或对延迟不敏感的通信。

互联类型 延迟量级 带宽量级 RDMA 成本 典型用途
千兆以太 较高 1 Gbps 否 低 管理网、带外
万兆以太 中等 10 Gbps 有 RoCE 可选 中 存储、一般通信
25G/100G 以太 较低 25–100 Gbps RoCE 中高 存储、部分计算通信
InfiniBand 极低 高,逐代提升 是 高 大规模 HPC/训练
高速以太(200G/400G+) 较低 很高 RoCE 高 新一代计算网络

集群网络通常分三张网:管理网(用于登录、监控、部署)、计算网(用于节点间通信,最快的那张)、存储网(连存储系统)。三者物理或逻辑隔离,避免互相干扰。

拓扑结构:胖树与 Torus

网络怎么连,决定了任意两个节点之间要走几跳、是否会拥塞。

胖树(Fat-Tree):分层的交换结构,越靠近核心层带宽越高,保证任意节点间路径带宽充分、跳数可控。它是数据中心与 HPC 集群最常用的拓扑,扩展性好、管理直观。

Torus / 环面:节点按多维网格连接,相邻节点直连,超算里常用于数万节点的超大规模系统,跳数更短但布线复杂、对故障处理要求高。

Dragonfly 等:在更大规模下用更高层的交换层级减少长链路数量,属于高端超算拓扑。

选择拓扑要考虑:集群规模、通信模式(是全局归约多,还是邻居交换多)、成本与布线可行性。中小规模用胖树基本不会错。

并行框架:MPI 的角色

有了快网络,还需要软件把任务分发出去。HPC 的基石是 MPI(Message Passing Interface),它定义了并行进程之间收发消息的标准接口,主流实现有 Open MPI、MPICH、Intel MPI 等。

一个典型 MPI 程序的样子(C 语言示意):

#include 
#include 

int main(int argc, char **argv) {
    MPI_Init(&argc, &argv);

    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);   // 当前进程编号
    MPI_Comm_size(MPI_COMM_WORLD, &size);   // 总进程数

    printf("Hello from rank %d of %d\n", rank, size);

    MPI_Finalize();
    return 0;
}

编译与运行:

# 编译
mpicc -O2 -o hello hello.c

# 单机跑 4 个进程
mpirun -np 4 ./hello

# 跨节点运行(配合主机列表文件)
mpirun -np 8 --hostfile hosts ./hello

hosts 文件示例:

node01 slots=4
node02 slots=4

深度学习里,MPI 通常被 NCCL(NVIDIA 集合通信库)在底层使用或替代,但原理相通:都是围绕集合通信(all-reduce、all-gather、broadcast 等)做优化。

安装与测试实操

安装 MPI 与测试工具。RHEL/CentOS/Rocky:

sudo dnf install -y openmpi openmpi-devel
# 或 MPICH
sudo dnf install -y mpich mpich-devel

# 加载模块(若使用 environment-modules)
module load mpi/openmpi-x86_64

Debian/Ubuntu:

sudo apt update
sudo apt install -y openmpi-bin libopenmpi-dev
# 或
sudo apt install -y mpich libmpich-dev

安装 InfiniBand 相关工具与驱动:

# RHEL/CentOS/Rocky
sudo dnf install -y rdma-core infiniband-diags perftest libibverbs-utils

# Debian/Ubuntu
sudo apt install -y rdma-core ibverbs-utils infiniband-diags perftest

perftest 提供了一组经典的 RDMA 测试工具:ib_write_bw、ib_read_lat、ib_send_bw 等。

查看 IB 设备与链路:

# 列出 IB 设备
ibv_devices

# 查看设备详情(固件、速率、端口状态)
ibv_devinfo

# 查看链路速率与状态
ibstat
ibstatus

# RDMA 链路
rdma link show

ibstat 里要重点看 Rate(速率)和 State(应为 Active,若为 Down 或 Initializing 说明链路有问题)以及 Physical state(应为 LinkUp)。

测试带宽与延迟(两台机器,一台服务端一台客户端):

# 服务端(node02)
ib_write_bw -d mlx5_0 -a

# 客户端(node01),指定服务端地址
ib_write_bw -d mlx5_0 -a 192.168.100.2

# 延迟测试
# 服务端
ib_write_lat -d mlx5_0
# 客户端
ib_write_lat -d mlx5_0 192.168.100.2

经验上,InfiniBand 的延迟可在微秒量级,带宽接近线速;RoCE 延迟略高,且对丢包敏感。若测出的带宽只有标称的一小部分,先查链路速率、PCIe 通道和拥塞。

网络上有很多针对普通以太网的延迟带宽测试工具,例如 iperf3、sockperf:

# 安装
sudo dnf install -y iperf3      # RHEL/CentOS/Rocky
sudo apt install -y iperf3      # Debian/Ubuntu

# 服务端
iperf3 -s

# 客户端,多流测试
iperf3 -c 192.168.100.2 -P 8 -t 30

MPI 层面的带宽测试,常用 OSU Micro-Benchmarks 或 Intel MPI Benchmarks,能测 all-reduce、all-to-all 等集合通信的实际性能。

集群搭建与运维要点

第一,节点名与解析要统一。 所有节点的主机名、/etc/hosts 或 DNS 解析必须一致,mpirun 依赖节点间免密 SSH 和正确解析。

# 配置免密登录(示例,需谨慎管理密钥)
ssh-keygen -t ed25519
ssh-copy-id node01

# 验证
ssh node01 hostname

第二,时间要同步。 分布式任务对时间一致性敏感,日志对不齐排查会极其痛苦。

# RHEL/CentOS/Rocky
sudo dnf install -y chrony
sudo systemctl enable --now chronyd

# Debian/Ubuntu
sudo apt install -y chrony
sudo systemctl enable --now chrony

chronyc sources -v

第三,资源调度。 集群规模上来后必须用调度系统分配资源,常见有 Slurm、PBS 系、LSF 等。作业通过调度器提交,而不是手动挑机器跑。

第四,监控网络。 交换机和网卡的丢包、误码、拥塞是扩展性杀手,要长期采集。

# 网卡错误与丢包统计
ip -s link show
ethtool -S eth0 | grep -Ei "err|drop|discard"

# IB 端口错误
perfquery  2>/dev/null

第五,NUMA 与 GPU 亲和。 现代节点里 CPU、内存、GPU、网卡之间的距离不同,绑定不当会引入额外延迟。

# 查看绑定关系
nvidia-smi topo -m
numactl --hardware

常见问题

Q1:集群是不是节点越多越快?
不是。取决于计算通信比。通信占比升高后,增加节点收益递减甚至为负。要实测扩展性曲线(弱扩展与强扩展)。

Q2:没有 InfiniBand 能做 HPC 吗?
能。中小规模用高速以太 + RoCE 也可行,但对无损网络配置要求高。规模大、延迟敏感的场景,IB 更省心。

Q3:RoCE 为什么容易掉速?
因为 RDMA 对丢包非常敏感,一次丢包可能触发重传并严重降低有效带宽。需要正确配置 PFC/ECN 和 QoS。

Q4:mpirun 连不上节点怎么办?
先查免密 SSH、主机名解析、防火墙端口和节点一致性。用 ssh node01 hostname 逐步验证。

Q5:怎么判断瓶颈在网络还是计算?
观察通信时间占比。MPI 程序可用 NCCL_DEBUG=INFO 或相应 profiling 工具,看每个集合通信的耗时。

总结

  • HPC 集群的核心是让多台机器协同,扩展性由计算通信比决定,通信往往是真正的瓶颈。
  • 互联层主要有 InfiniBand 与 RoCE 两条路线:IB 延迟最低、最省心但贵;RoCE 复用以太生态、成本低但对无损配置要求高。
  • 拓扑常用胖树,集群一般分管理网、计算网、存储网三张网,避免互相干扰。
  • 软件层由 MPI 及 NCCL 等框架承担,安装后用 ibstat、ib_write_bw、iperf3、集合通信基准测出真实延迟与带宽。
  • 搭建时统一命名解析、配置免密与时间同步、引入调度系统、长期监控网络错误,并做好 NUMA 与 GPU 亲和绑定。