多显卡服务器是如何实现协同工作的?

多显卡服务器(通常搭载2到8块甚至更多GPU)的工作核心在于协调多张显卡的算力、显存和带宽,以突破单张显卡的性能瓶颈,处理远超单个GPU能力的任务。

它的工作原理可以从硬件架构、软件协同和工作模式三个层面来理解:

1. 硬件架构:如何“连接”与“喂饱”多张显卡

多张显卡不是简单插在主板上就能高效工作的,需要解决连接带宽供电散热两大问题。

计算核心(GPU): 每张显卡拥有独立的GPU芯片(如NVIDIA A100、H100、AMD MI300X)、显存(HBM2e、HBM3)和缓存,它们是执行并行计算的基本单元。

连接与互联(关键):

PCIe通道: 每张显卡通过PCIe插槽与CPU和内存通信,多显卡服务器通常使用CPU提供的全部PCIe通道(如Intel Xeon W3300系列提供64条),并通过PCIe Switch芯片(如PLX芯片)将CPU的有限通道扩展给多张显卡,不过,PCIe通道在跨卡通信时带宽相对有限。

高速互联(NVLink/NVSwitch、Infinity Fabric): 这是多卡高效协同的关键,NVIDIA较早推出NVLink技术,允许显卡之间直接、高速地传输数据,无需经过CPU或PCIe总线,4张A100通过NVLink全互联,带宽可达600GB/s(单向),远超PCIe 4.0 x16的32GB/s,最新的高端服务器(如DGX H100)通过NVSwitch实现8张H100之间的全互联,形成类似“交换机”的无阻塞网络,AMD也有类似技术(Infinity Fabric)。

供电与散热: 多张高端显卡功耗极高(单块可达300-700W),服务器采用冗余电源(如2+2架构),并对每张显卡进行独立供电,散热方式主要是风冷(高风压风扇组)或液冷(部分超算或高密度服务器),确保温度可控。

2. 软件与驱动:操作系统如何“看到”并管理多张显卡

操作系统(通常是Linux)和驱动程序负责统一管理这些硬件资源。

设备枚举: 系统通过PCIe总线识别并枚举出所有GPU,为每张显卡分配独立的设备节点(如/dev/nvidia0/dev/nvidia1等)。

驱动抽象: 显卡厂商的驱动(如NVIDIA驱动)提供统一的API接口(CUDA、ROCm、OpenCL),应用程序通过这些API调用任意一张或多张显卡,无需关心底层是PCIe还是NVLink连接,驱动负责将API指令翻译成GPU微码。

统一内存管理(Unified Memory): CUDA等框架支持统一内存,允许CPU和所有GPU共享一个虚拟地址空间,简化了跨设备的数据迁移,但性能依赖数据局部性(数据尽量放在靠近使用的GPU上)。

资源隔离: 对于虚拟化场景,可以利用MIG(Multi-Instance GPU,多实例GPU)vGPU(虚拟GPU)技术,将一张物理GPU切分为多个独立的虚拟GPU(或实例),分配给不同的虚拟机或容器,驱动确保各实例间的资源(显存、计算单元、带宽)是物理隔离的。

3. 核心工作模式:三种典型的多卡协同方式

这是回答“怎么工作”的核心,多张显卡如何配合完成任务?主要有三种模式:

模式一:数据并行(Data Parallelism)—— 最常用、最简单

目标: 处理同一模型,但批量处理不同数据

过程: 将训练数据(如大批量图片)平均分给多张显卡,每张显卡都持有一个完整的模型副本,独立计算各自的梯度,然后通过梯度同步(AllReduce,全规约通信) 将所有卡的梯度平均,再更新所有卡上的模型参数。

特点: 线性加速比好(卡数增加一倍,处理速度接近两倍),但要求每张卡的显存能放下整个模型,是深度学习训练的标准做法。

代表技术: PyTorch DDP、Horovod。

模式二:模型并行(Model Parallelism)—— 解决“大模型”显存不足

目标: 处理单个巨大模型,该模型无法放入单张显卡的显存

过程:模型本身切分成若干部分(比如按不同层、注意力头等),分给不同的显卡,数据按批次顺序流经各卡:

流水线并行(Pipeline Parallelism): 第1卡处理完一层后,把中间结果传给第2卡,第2卡处理完再传给第3卡……形成流水线,类似工厂流水线,缺点是存在“气泡”(空闲等待时间)。

张量并行(Tensor Parallelism): 在一个计算层内部,将矩阵运算(如线性层、注意力机制)切分到多张显卡上并行计算,通过NVSwitch等高速互联进行频繁的中间结果通讯,对带宽要求极高。

特点: 适用于千亿甚至万亿参数的大模型(如GPT-3、LLaMA-65B),需要精细的负载均衡设计和昂贵的NVLink/NVSwitch硬件支持。

代表技术: Megatron-LM、DeepSpeed、ColossalAI。

模式三:混合并行(Hybrid Parallelism)—— 当前顶级大模型训练的标准

目标: 同时解决单个模型放不下数据量大的问题。

过程: 结合数据并行、张量并行和流水线并行,先对模型进行张量并行(切分每层运算),再对模型层进行流水线并行,最后在多组这样的模型副本间做数据并行,这种三维并行策略可以极大扩展集群规模(使用成千上万张显卡)。

代表技术: NVIDIA NeMo Megatron框架、DeepSpeed ZeRO系列(零冗余优化器,通过分布式存储优化器状态、梯度和参数,本质也是一种混合并行)。

4. 管理与调度:如何“分配”多张显卡干活

在多用户、多任务的服务器环境中,需要专门的软件(调度器)来管理:

资源分配: 调度器(如SLURM、Kubernetes + GPU Operator)根据用户请求(如“申请2张A100,24GB显存”),从空闲显卡池中分配满足条件的卡,它确保不同用户的作业(如训练、推理)不会冲突。

显存隔离: 通过MIG或vGPU等机制,将一张物理卡切分成更小的、有固定显存限制的独立实例。

负载均衡: 调度器会尽量将计算任务均衡地分配到不同卡上,避免某些卡空闲而某些卡过载。

1、启动: 程序员编写一个分布式训练脚本(如PyTorch DDP),指定使用4张GPU。

2、分配: 调度器从服务器空闲池中分配GPU 0-3给该任务,并建立进程间的通信组(如Rank 0-3)。

3、分发: 所有进程都加载完整的模型(比如ResNet-50),每张卡上都保存模型副本。

4、数据分片: 主进程(Rank 0)读取一个批次数据(如1024张图片),平均分成4份,每份256张,分发给各进程。

5、前向计算: 每张显卡独立进行前向传播(Forward Pass)。

6、反向传播: 每张显卡独立计算梯度。

7、梯度同步(核心步骤): 所有显卡通过高速互联(NVLink或PCIe)发起AllReduce操作,交换并平均各自的梯度,最终每张卡都得到全局平均梯度

8、参数更新: 每张卡使用全局平均梯度更新自己持有的模型参数。

9、重复: 循环回到第4步,处理下一个批次数据。

训练效果等同于用1024的批次大小在单卡上训练,但处理速度是单卡的4倍(理想情况下)。

一句话总结:多显卡服务器通过高速互联(NVLink/NVSwitch)让多张显卡紧密协作,在软件层面(数据并行、模型并行、混合并行)分配任务,从而以远超单卡的算力和显存处理大规模计算任务(主要是大模型训练与推理)。

文章摘自:https://idc.huochengrm.cn/fwq/25239.html

评论