Nvidia技术壁垒之一--NVLink&NVSwitch

2024-09-06 13:47:27 浏览数 (1)

NVLink

NVLink数据包

单个 NVLink 数据包的范围从 1 到 18 个 flit。每个 flit 为 128 位,允许使用单个 header flit 和 16 个 payload flit 传输 256 字节,峰值效率为 94.12%,使用单个 header flit 和 4 个数据 payload flit 传输 64 字节,单向效率为 80%。在双向流量中,效率分别略微降低至 88.9% 和 66.7%。

数据包至少包含一个标头,以及可选的地址扩展 (AE) 数据块、字节启用 (BE) 数据块和最多 16 个数据有效负载数据块。典型的事务至少包含请求和响应,而发布的操作不需要响应。

数据包构成数据包构成

链接

NVLink 通道称为 Brick(或NVLink Brick)。单个 NVLink 是双向接口,每个方向包含 8 个差分对,总共 32 条线。这些线是直流耦合的,使用带有嵌入式时钟的 85Ω 差分终端。为了简化路由,NVLink 支持通道反转和通道极性,这意味着两个设备之间的物理通道顺序及其极性可以反转。

NVLink原理图NVLink原理图

数据传输方式

NVLINK 支持两种数据传输模式:DMA 和 P2P。

DMA 模式:在 DMA 模式下,CPU 可以通过 NVLink 桥接器直接将数据传输到目标 GPU 的显存中。这个过程不需要目标 GPU 的参与,因此可以有效地提高数据传输效率。

P2P 模式:在 P2P 模式下,两个 GPU 之间可以直接进行数据传输。这种模式通常用于在 GPU 之间共享数据或进行并行计算任务。

使用记录

查看NVLink状态:NVIDIA-SMI系列命令详解(16)-NVLINK本文为NVIDIA-SMI系列命令详解第十六篇-NVLINK,介绍 - 掘金 (juejin.cn)

安装NVLink:直接插到对应的卡上即可,一般情况下不需要手动安装驱动

拔除NVLink:一般也可以直接拔除

踩坑记录

如果一台机器有多张卡,只有装了NVLink的两卡之间可以通信,没有装的卡只能用单卡(比较坑,也就是说只要机器上有NVLink,通信就都会改成NVLink的方式,导致正常的卡间不能通信了)。针对该问题,在nccl上提了Issues:Not all gpus have nvlinks, the communication data is all incorrect · Issue #1423 · NVIDIA/nccl (github.com)。

解决方案一:拔除nvlink,只使用PCIE传输。如果是AMD的CPU,拔出后还需要进BIOS强制关闭IOMMU,禁止程序直接访问物理内存,必须经过CPU。具体可以参考Silent data corruption when moving data between GPUs · Issue #84803 · pytorch/pytorch (github.com)。我再修改上述操作之后,多卡推理可以跑了,但是多卡训练会报CUDA error: unspecified launch failure,后来发现是transformers、torch等安装包的版本较低导致的。使用pip命令更新安装包,pip install --force-reinstall transformers==4.44.2 trl==0.10.1 torchvision==0.19.1。

解决方案二:所有卡都连上nvlink(但有的卡只有一个NVLink插槽,比如A6000,也就是最多能做到两张卡配对使用)

解决方案三:八张卡既有PCIE,又有NVLink,目前来看是有bug的。持续关注Issues:Not all gpus have nvlinks, the communication data is all incorrect · Issue #1423 · NVIDIA/nccl (github.com)。

缺点

NVLink虽然是双向接口,两张卡之间只需要一条连接,但也很容易发现,只有插了线的两卡才可以享受其高速通信,而且像A6000等显卡上只有一个NVLink插槽,所以无法将多张卡连接到一起。Nvidia新的产品的NVSwitch就是用来解决这个问题的,具体可以参考Nvidia的官网介绍:NVIDIA NVLink and NVIDIA NVSwitch Supercharge Large Language Model Inference | NVIDIA Technical Blog

NVSwitch

NVSwitch是显卡互联交换机,使用的时候需要配合NVLink,把NVLink一端连到显卡上,另一端连到NVSwitch上。可以让每两张卡间都可以无阻塞全速互联,最新一代的NVSwitch还可以把不同机器间的显卡互联起来,且最高可以连接576张显卡(简直是恐怖,且互联传输速度比InfiniBand还要快)。

NVSwitch发展历程NVSwitch发展历程

八卡互联方案

如果使用NVLink,每张卡都要和其他卡之间有NVLink相连,传输速度取决于单条NVLink速度上限。

使用NVSwitch按如下图方式互联,任意两卡间都可以享受最高速900GB/s,并且0、1两张卡正在通信,其他卡间也可以全速通信,互不影响。

多卡互联方案多卡互联方案
NVLink vs NVSwitch传输速度NVLink vs NVSwitch传输速度

集群互联

最新的NVSwitch可以把576张卡连到一起,这些卡分布在几十台机器上,一般来说机器间是通过网络传输的,最高速的网络协议是InfiniBand。但NVSwitch直接跳过这些,直接把多机器间的卡连起来。以下是使用InfiniBand和NVSwitch互联的性能对比:

NVSwitch相比InfiniBand速度NVSwitch相比InfiniBand速度

可以看到NVSwitch竟然比InfiniBand还要快4.5倍,InfiniBand只有超算中心才能用的起。Nvidia简直是变态。。。。

参考链接:

AI Infra 基础知识 - NVLink 入门 (qq.com)

深入了解 GPU 互联技术——NVLINK (qq.com)

NV Switch 深度解析与性能剖析 (qq.com)

0 人点赞