AI基础设施核心技术详解:NVLink技术深度解析
AI基础设施核心技术详解:NVLink技术深度解析
NVLink是一种专有系统互连硬件,可促进多个Nvidia GPU和支持CPU之间的一致数据和控制传输。它于2014年推出,旨在解决PCIe总线在大数据集处理时的瓶颈问题。NVLink通过提供更高的带宽和附加功能(如共享内存),显著提升了GPU之间的数据传输效率。本文将详细介绍NVLink的技术原理、发展历程及其在不同版本中的性能提升。
概述
NVLink于2014年初发布,旨在作为PCI Express的替代解决方案,具有更高的带宽和附加功能(例如共享内存),专门设计用于与Nvidia自己的多GPU系统的GPU ISA兼容。在推出NVLink和Pascal(例如Kepler)之前,多个Nvidia的GPU会位于共享的PCIe总线上。尽管已经可以使用Nvidia的统一虚拟寻址通过PCIe总线实现直接的GPU-GPU传输和访问,但随着数据集的大小不断增长,总线成为越来越大的系统瓶颈。通过使用PCIe交换机,吞吐量可以进一步提高。
NVLink旨在取代通过PCIe通道进行的GPU间通信。值得注意的是,NVLink还设计用于带宽高于PCIe的CPU-GPU通信。尽管AMD或Intel不太可能在x86系统上实现NVLink,但IBM已与Nvidia合作,在其POWER微处理器上支持NVLink。对于受支持的微处理器,NVLink可以完全消除所有链路的PCIe。
链接
NVLink通道称为Brick(或NVLink Brick)。单个NVLink是双向接口,每个方向包含8个差分对,总共32条线。这些线是直流耦合的,使用带有嵌入式时钟的85Ω差分终端。为了简化路由,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个数据有效负载数据块。典型的事务至少包含请求和响应,而发布的操作不需要响应。
头部flit
Header flit为128位。它包含25位CRC字段(如下所述)、83位事务字段和20位数据链路(DL)层字段。事务字段包括请求类型、地址、流控制位和标签标识符。数据链路字段包括数据包长度、应用程序编号标签和确认标识符等内容。
地址扩展(AE)数据块保留用于相当静态的位,并且通常仅传输变化的位。
纠错
Nvidia指定错误率为1/1×1012。错误检测通过25位循环冗余校验头字段完成。接收器负责将数据保存在重放缓冲区中。传输的数据包按顺序排列,如果CRC正确,则将确认发送回发送端。超时后丢失的确认将启动回复序列,重新传输所有后续数据包。
CRC字段由25位组成,允许最大数据包最多有5个随机位出错,或者,对于差分对突发,它可以支持最多25个连续位错误。CRC实际上根据报头和前一个有效载荷计算,因此无需为数据有效载荷设置单独的CRC字段。请注意,由于报头还包含数据包长度,因此它也包含在CRC校验中。
例如,考虑两个数据有效载荷(32字节)flit及其附带的标头序列。下一个数据包将对当前标头以及来自前一个事务的两个数据有效载荷进行CRC校验。如果这是第一个事务,则CRC假定前一个事务是NULL事务。
数据速率
版本 | 信令速率 | 车道/连接 | 评分/链接 | 双向带宽/链路 | 链接/芯片 | BiDir BW/芯片 |
---|---|---|---|---|---|---|
NVLink 1.0 | 20 GT/秒 | 8 | 20 GB/秒 | 40 GB/秒 | 4(P100) | 160 GB/秒(P100) |
NVLink 2.0 | 25 GT/秒 | 8 | 25 GB/秒 | 50 GB/秒 | 6(V100) | 300 GB/秒(V100) |
NVlink 3.0 | 50 GT/秒 | 4 | 25 GB/秒 | 50 GB/秒 | 12(A100) | 600 GB/秒(A100) |
NVlink 4.0 | 100 GT/秒 | 2 | 25 GB/秒 | 50 GB/秒 | 18(H100) | 900 GB/秒(H100) |
GT/s — Giga Transmission per second(千兆传输/秒),即每一秒内传输的次数。
与PCI Express速度对比:
PCI Express 总线性能版本 | 推出 | Line 编码 | 每通道传输率[i] | 带宽(每个方向)[i] |
---|---|---|---|---|
x1 | x2 | x4 | x8 | x16 |
1.0 | 2003 | NRZ | 8b/10b | 2.5 GT/s |
2.0 | 2007 | 5.0 GT/s | 0.500GB/s | 1.000 GB/s |
3.0 | 2010 | 128b/130b | 8.0 GT/s | 0.985GB/s |
4.0 | 2017 | 16.0 GT/s | 1.969 GB/s | 3.938 GB/s |
5.0 | 2019 | 32.0 GT/s[ii] | 3.938GB/s | 7.877 GB/s |
6.0 | 2021 | PAM-4FEC | 1b/1b242B/256B FLIT | 64.0 GT/s32.0 GBd |
7.0 | 2025(预计) | 128.0 GT/s64.0 GBd | 15.125GB/s | 30.250GB/s |
- 每条通道(lane)都是全双工通道。
- 出于技术可行性,最初也考虑过25.0 GT/s
以PCIe 2.0为例,每秒5GT(Gigatransfer)原始数据传输率,编码方式为8b/10b(每10个比特只有8个有效数据),即有效带宽为4Gb/s = 500MByte/s。
NVLink 1.0
NVLink 1.0最初是在基于Pascal微架构的P100 GPGPU中引入的。除了能够从CPU端访问系统内存外,P100还配备了自己的HBM内存。P100有四个NVLink,支持高达20 GB/s的双向带宽,即40 GB/s,总聚合带宽为160 GB/s。在最基本的配置中,除了连接到CPU以访问系统DRAM的PCIe通道外,所有四个链路都连接在两个GPU之间,以实现160 GB/s的GPU-GPU带宽。
第一款原生支持NVLink的CPU是IBM POWER8+,它允许NVLink互连扩展到CPU,取代速度较慢的PCIe链路。由于P100只有四个NVLink,因此可以使用来自每个GPU的单个链路将CPU链接到GPU。典型的全配置节点由四个P100 GPU和两个Power CPU组成。四个GPU完全相互连接,第四个链路连接到CPU。
由于基于Intel的CPU不支持NVLink(并且不太可能永远支持它们),因此可能存在从两个到四个P100 GPU的几种变化。在每种配置中,GPU都完全相互连接,每两个GPU都连接到一个直接连接到CPU的PCIe交换机。无论配置如何,每个链接都是40 GB/s双向的,并且可以聚合以在任何两个GPU之间提供更高的带宽,它们之间使用的链接越多。
DGX-1配置
2017年,Nvidia推出了充分利用NVLink的DGX-1系统。DGX-1由八个Tesla P100 GPU以及双插槽Xeon CPU组成,这些GPU以混合立方体网格NVLink网络拓扑连接。两个Xeon通过英特尔的QPI相互通信,而GPU通过NVLink通信。
NVLink 2.0
NVLink 2.0最早是在基于Volta微架构的V100 GPGPU和IBM的POWER9中推出的。Nvidia增加了CPU主控支持,允许GPU和CPU在平面地址空间中访问彼此的内存(即直接加载和存储)。平面地址空间通过新的地址转换服务得到支持。此外,还为CPU和GPU添加了对原子操作的本机支持。随着平面地址空间的增加,NVLink现在具有缓存一致性支持,允许CPU高效缓存GPU内存,显著改善延迟并提高性能。NVLink 2.0将信令速率提高到每线25 Gbps(25 GT/s),实现50 GB/s双向带宽。V100还将片上NVLink的数量增加到6个,总聚合带宽为300 GB/s。值得注意的是,还添加了额外的省电功能,例如在空闲期间停用通道。
NVLink 2.0是随第二代DGX-1推出的,但完整的拓扑结构变化发生在DGX-2中。Nvidia还随DGX-2推出了NVSwitch,这是一款18 NVLink端口交换机。这款20亿晶体管交换机可以将流量从9个端口路由到其他9个端口中的任何一个。每个端口50 GB/s,交换机总共能够提供900 GB/s的带宽。
对于DGX-2,Nvidia使用六个NVSwitches将八个GPU中的每一个与同一底板上的所有其他七个GPU完全连接。然后将两个底板相互连接,以将所有16个GPU完全连接在一起。
NVLink 3.0
NVLink 3.0首次在基于Ampere微架构的A100 GPGPU中推出。NVLink 3.0使用50 Gbps信号速率。
参考
- IEEE HotChips 34 (HC28), 2022
- IEEE HotChips 30 (HC28), 2018
- IEEE HotChips 29 (HC29), 2017
- IEEE HotChips 28 (HC28), 2016