S41825: LATEST ON NVIDIA MAGNUM IO GPUDIRECT TECHNOLOGIES

Davide Rossetti, Pak Markthub
March 23, 2022

目录


简介 (Page 2)

本演讲由Davide Rossetti和Pak Markthub共同呈现。

介绍
介绍

历届GTC参与 (Page 3)

本团队自GTC 2015以来一直以虚拟形式参与GTC大会,包括:
* GTC 2015
* GTC 2016
* GTC 2017
* GTC 2018
* GTC 2019
* GTC 2021
* GTC 2022(第二次虚拟演讲)

相关录音和资料可在www.nvidia.com/on-demand获取

GPUDirect 技术概述 (Page 4)

本节将概述GPUDirect技术。

GPUDirect 技术分类 (Page 5)

GPUDirect技术主要包括四种类型:

GPUDirect 技术概览 (Page 6)

GPUDirect 技术概览如下:

技术交互图示:
GPUDirect 技术交互概览

图例:
* 紫色箭头:Shared sysmem
* 绿色箭头:P2P
* 蓝色箭头:RDMA
* 黄色箭头:Async

GPUDirect 技术的动机 (Page 7)

动机:
* 背景:传统的卸载计算模型涉及使用GPU DMA引擎进行数据拷贝(in/out)、启动/同步计算。
* 加速直接数据路径是为了:
* 降低延迟
* 提高带宽
* 支持新的使用场景(后续将详细介绍)

MAGNUM IO (Page 8)

GPUDirect 技术是Magnum IO的一部分。Magnum IO是一个分层架构,其中GPUDirect位于最底层。

Magnum IO架构层级:

Magnum IO 架构图
Magnum IO 架构图

MAGNUM IO: 基础技术与库 (Page 9)

Magnum IO涉及基础技术和基于这些技术构建的库。

库 (libraries):
* NVSHMEM
* NCCL
* UCX
* GDRCopy
* GPUDirect Storage
* libgdsync
* SHARP

技术 (technologies):
* GPUDirect P2P
* GPUDirect RDMA
* GPUDirect Async
* nvidia-peermem¹ / nv_peer_mem
* PeerDirect

¹ nvidia-peermem取代nv_peer_mem。

Magnum IO 基础技术与库
Magnum IO 基础技术与库

GPUDirect 技术部署 (Page 10)

GPUDirect 技术在多个垂直领域、硬件和软件栈中广泛部署:

¹ https://aws.amazon.com/about-aws/whats-new/2020/11/efa-supports-nvidia-gpudirect-rdma/

硬件支持矩阵 (Page 11)

下表展示了GPUDirect各项技术在不同NVIDIA硬件系列中的支持情况:

硬件支持矩阵
硬件支持矩阵

脚注:

互联结构支持矩阵 (Page 12)

下表展示了GPUDirect各项技术在不同平台和互联结构中的支持情况:

互联结构支持矩阵
互联结构支持矩阵

脚注:
* ¹ Tegra统一内存。在Xavier上,cudaHostAlloc返回的内存与PCIe和GPU是连贯的。

操作系统支持矩阵 (Page 13)

下表展示了GPUDirect各项技术在不同操作系统中的支持情况:

操作系统支持矩阵
操作系统支持矩阵

脚注:
* ¹ 需要SLI模式。

GPUDirect 虚拟化支持 (Page 14)

下表展示了GPUDirect各项技术在不同虚拟化环境中的支持情况:

GPUDirect 虚拟化支持
GPUDirect 虚拟化支持

脚注:
* ¹ 在1:1配置中。
* ² 支持Vmware ESXi 7.0 HV或更新版本。
* ³ https://docs.nvidia.com/grid

GPUDirect RDMA 支持矩阵 (Page 15)

下表展示了GPUDirect RDMA技术在不同平台和内存分配器中的支持情况:

GPUDirect RDMA 支持矩阵
GPUDirect RDMA 支持矩阵

脚注:
* ¹ 需要具备按需分页和CAPI支持的第三方设备。
* ² 在iGPU管理的内存中映射到cudaHostAlloc内存。
* ³ 系统内存不支持自动迁移。
* ⁴ CUmemAllocationProp中的显式opt-in标志。

新特性

GPUDIRECT 概述

NVIDIA H100 GPU 特性带来了多项更新和改进:
* GPU 驱动程序中的 PeerDirect 支持(更新)。
* 为预启动的 GPU 工作启用 GPUDirect RDMA(更新)。
* 持久性 GPU 映射。
* GPU 启动的通信。

NVIDIA H100 GPU GPUDirect 特性

GPUDirect P2P (点对点)
* 第四代 NVLink。
* NVLink 带宽增加 50%。
* 450+450 GB/s。
* 更高效率。
* NVswitch SHARP。

GPUDirect RDMA
* PCIe 带宽翻倍。
* PCIe x16 Gen5 链路。
* 每方向有效峰值带宽约为 48 GB/s。

GPUDIRECT RDMA:GPU 驱动程序中的即用型 PeerDirect 支持

以下伪代码展示了相关操作:

# cd MLNX_OFED_LINUX-5.2-2.2.0-rhel8.2-x86_64/
# ./mlnxofedinstall
...
# cd NVIDIA-Linux-x86_64-XY/kernel
# make modules
...
CC  [M]  /root/NVIDIA-Linux-x86_64-XY/kernel/nvidia-peermem/nvidia-peermem.o
LD  [M]  /root/NVIDIA-Linux-x86_64-XY/kernel/nvidia-peermem.ko
...
cc  /root/NVIDIA-Linux-x86_64-XY/kernel/nvidia-peermem.mod.o
LD  [M]  /root/NVIDIA-Linux-x86_64-XY/kernel/nvidia-peermem.ko

GPUDIRECT RDMA:PeerDirect 支持状态

以下表格展示了 PeerDirect 的支持状态:
GPUDIRECT RDMA Status of PeerDirect support Page 20

脚注:
¹ feature backported to selected 5.1+ branches
² need "peerdirect_support=1" kernel module param
³ Issue #2302010 at https://docs.nvidia.com/networking/display/OFEDv512580/Bug+Fixes

GPUDIRECT RDMA:入站流量排序

GPUDIRECT RDMA Ordering of ingress traffic Page 21
GPUDIRECT RDMA Ordering of ingress traffic Page 21

新的 API 包括:
* cudaFlushGPUDirectRDMAWritesOptionHost
* cudaFlushGPUDirectRDMAWritesOptionMemOps
* cudaDevAttrGPUDirectRDMAFlushWritesOptions
* cudaDevAttrGPUDirectRDMAWritesOrdering
* cudaGPUDirectRDMAWritesOrderingNone
* cudaGPUDirectRDMAWritesOrderingOwner
* cudaGPUDirectRDMAWritesOrderingAllDevices (<= Ampere)
* H100 (新的优化)

三方场景

Three-party scenario Page 22
Three-party scenario Page 22

步骤
* CPU: 启动 GPU 工作。
* CPU: 轮询 flag1。 (H100 上不需要)
* NIC: 写入数据。
* NIC: 写入 flag1。
* CPU: cudaDeviceFlushGPUDirectRDMAWrite GPU1。 (H100 上不需要)
* CPU: 写入 flag2。
* GPU1: 观察 flag2 并本地获取数据。

三方场景 H100 优化

Three-party scenario H100 optimized Page 23
Three-party scenario H100 optimized Page 23

步骤(优化后)
* CPU: 启动 GPU 工作。
* NIC: 写入数据。
* NIC: 写入 flag1。
* GPU1: 观察 flag1 并本地获取数据。

四方场景

Four-party scenario Page 24
Four-party scenario Page 24

步骤
* CPU: 在 GPU2 上启动工作。
* CPU: 轮询 flag1。
* NIC: 写入数据。
* NIC: 写入 flag1。
* CPU: cudaDeviceFlushGPUDirectRDMAWrite GPU1
* CPU: 写入 flag2。
* GPU2: 观察 flag2 并获取数据。

四方场景:一致性 API

// 在远程主机上,伪代码
ibv_post_send(gp,  (RDMA_WRITE, gpui_data_mr.rkey,
                    gpui_data_ptr, localdata));
ibv_post_send(gp,  (RDMA_WRITE, flag1_mr.rkey, flag1_ptr,
                    0x1));

// 在 CPU 工作线程上
int dev_ordering = 0;
cudaDeviceGetAttribute(&dev_ordering,
                      cudaDevAttrGPUDirectRDMAWritesOrdering, gpui);
cudaSetDevice(gpui);
...
wait_value(flag1, 0x1);
if ((int)cudaGPUDirectRDMAWritesOrderingAllDevices >
    (int)dev_ordering)
{
    cudaFlushGPUDirectRDMAWrite(
        cudaFlushGPUDirectRDMAWritesTargetCurrentDevice,
        cudaFlushGPUDirectRDMAWritesToAllDevices);
}
set_value(flag2, 0x1);

// 在 GPU2 上
__device__ void _user_krn() {
    wait_value(flag2, 0x1);
    fetch(gpui_data, &localbuf);
    calculate(localbuf);
}

持久性 GPU 映射

GPUDIRECT RDMA:常规映射

这是一个关键的架构图,展示了常规映射的工作原理:
GPUDIRECT RDMA: REGULAR MAPPINGS Page 27

流程
1. 应用程序在用户空间中调用 cuMemAlloc 进行内存分配,并在内核空间中通过 ibv_reg_mr 注册内存区域。
2. 这些请求通过 nv_peer_mem / nvidia_peermem 模块处理。
3. nv_peer_mem / nvidia_peermem 调用 nvidia_p2p_get_pages 来获取页面,并设置回调函数。
4. NIC 驱动程序调用 nvidia_p2p_dma_map_pages 来映射 GPU DMA 地址。
5. NVIDIA 驱动程序负责 Pin (锁定) 并暴露 DMA 地址。
6. 最终,NIC 和 GPU 通过 DMA 进行硬件层面的通信。

常规映射失效

这是一个关键的架构图,展示了常规映射失效的过程:
REGULAR MAPPINGS INVALIDATION Page 28

问题:如果失效需要等到适当的拆卸 (tear down) 完成怎么办?
失效流程
1. 应用程序调用 cuMemFree 释放内存,并通过 ibv_dereg_mr 取消注册内存区域。
2. 一个 free_callback 被触发并发送给 NVIDIA 驱动程序。
3. nv_peer_mem / nvidia_peermem 向 NIC 驱动程序发送 mapping invalidation 请求。
4. NIC 驱动程序向硬件 (NIC) 发送进一步的 mapping invalidation 请求。
5. DMA 连接在硬件层面被移除。
6. NVIDIA 驱动程序向硬件 (GPU) 发送 free 命令。

常规映射失效的详细说明

持久性 GPU 映射:将生命周期扩展到应用程序之外

GPU 发起通信

引言 (Page 32)

本节介绍 GPU 发起通信。

CPU 代理回顾 (Page 33)

反向卸载通信技术

CPU 代理回顾
CPU 代理回顾

GPU 发起通信:工作原理 (Page 34)

GPU 发起通信
GPU 发起通信

简单带宽基准测试 (Page 35)

在 DGX-A100 上通过 IB 在 2 个 GPU 之间进行测试

简单带宽基准测试
简单带宽基准测试

简单消息速率基准测试 (Page 36)

在 DGX-A100 上通过 IB 在 2 个 GPU 之间进行 8B 消息大小测试

简单消息速率基准测试
简单消息速率基准测试

简单 All-to-All 基准测试 (Page 37)

在 2 个 DGX-A100 上通过 IB 进行测试

简单 All-to-All 基准测试
简单 All-to-All 基准测试

案例研究:NCCL (Page 38)

在 2 个 DGX-A100 上通过 IB 进行 64B All-to-All 测试

案例研究:NCCL
案例研究:NCCL

案例研究:NVSHMEM (Page 39)

在 2 个 DGX-A100 上通过 IB 进行 1k x 1k 64 位元素矩阵转置

案例研究:NVSHMEM
案例研究:NVSHMEM

总结与路线图 (Page 40)

结论 (Page 41)

关键要点 (Page 42)

MAGNUM IO @ GTC22 (Page 43)