目录
10.1 /dev基于nvidia-capabilities
10.2 / proc 基于 nvidia-capabilities(已弃用)
第一章、介绍
新的多实例GPU(MIG)功能允许GPU(从NVIDIA Ampere架构开始)被安全地分区为最多七个独立的GPU实例,用于CUDA应用程序,为多个用户提供独立的GPU资源,以实现最佳GPU利用率。这一功能特别适用于未完全利用GPU计算能力的工作负载,因此用户可能希望并行运行不同的工作负载以最大化利用率。
对于具有多租户用例的云服务提供商(CSPs),MIG确保一个客户端不会影响其他客户的工作或调度,同时为客户提供增强的隔离性。
通过MIG,每个实例的处理器通过整个内存系统具有独立和隔离的路径 - 芯片上的交叉开关端口、L2缓存块、内存控制器和DRAM地址总线都被唯一地分配给一个单独的实例。这确保了单个用户的工作负载可以以可预测的吞吐量和延迟运行,具有相同的L2缓存分配和DRAM带宽,即使其他任务正在破坏它们自己的缓存或饱和它们的DRAM接口。MIG可以分区可用的GPU计算资源(包括流多处理器或SMs,以及GPU引擎,如复制引擎或解码器),以为不同客户(如VM、容器或进程)提供定义的服务质量(QoS)和故障隔离。MIG使多个GPU实例可以并行运行在单个物理NVIDIA Ampere GPU上。
通过MIG,用户将能够看到并调度他们的新虚拟GPU实例上的作业,就像它们是物理GPU一样。MIG与Linux操作系统配合使用,支持使用Docker Engine的容器,支持Kubernetes和使用Red Hat Virtualization和VMware vSphere等虚拟机监视程序的虚拟机。
MIG支持以下部署配置:
- 裸金属,包括容器
- 在支持的虚拟机监视程序上向Linux客户端进行GPU透传虚拟化
- 在支持的虚拟机监视程序上进行vGPU虚拟化
MIG允许多个vGPU(从而是VM)在单个GPU上并行运行,同时保留vGPU提供的隔离保证。有关使用vGPU和MIG进行GPU分区的更多信息,请参阅技术简介。
本文的目的是介绍MIG背后的概念、部署考虑因素,并提供MIG管理示例,以展示用户如何在支持MIG的GPU上运行CUDA应用程序。
第二章、支持的GPU卡
MIG支持从NVIDIA Ampere一代开始的GPU(即具有计算能力>= 8.0的GPU)。
产品 | 体系架构 | 微体系架构 | 计算能力 | 内存大小 | 支持的最大实例数 |
H100-SXM5 | Hopper | GH100 | 9.0 | 80GB | 7 |
H100-PCIE | Hopper | GH100 | 9.0 | 80GB | 7 |
H100-SXM5 | Hopper | GH100 | 9.0 | 94GB | 7 |
H100-PCIE | Hopper | GH100 | 9.0 | 94GB | 7 |
H100 on GH200 |
Hopper | GH100 | 9.0 | 96GB | 7 |
A100-SXM4 | NVIDIA Ampere |
GA100 | 8.0 | 40GB | 7 |
A100-SXM4 | NVIDIA Ampere |
GA100 | 8.0 | 80GB | 7 |
A100-PCIE | NVIDIA Ampere |
GA100 | 8.0 | 40GB | 7 |
A100-PCIE | NVIDIA Ampere |
GA100 | 8.0 | 80GB | 7 |
A30 | NVIDIA Ampere |
GA100 | 8.0 | 24GB | 4 |
此外,MIG也支持包括上述支持产品在内的系统,如DGX、DGX Station和HGX。
第三章、支持的配置
支持MIG的部署配置包括:
- 裸金属,包括容器和Kubernetes
- 在支持的虚拟机监视程序上向Linux客户端进行GPU透传虚拟化
- 在支持的虚拟机监视程序上进行vGPU虚拟化
第四章、虚拟化
MIG可以与两种类型的虚拟化一起使用:
- 在支持的虚拟机监视程序上,当MIG支持的GPU处于GPU透传模式时,可以使用裸金属上可用的相同工作流、工具和配置文件。
- MIG允许多个vGPU(从而是VM)在单个MIG支持的GPU上并行运行,同时保留vGPU提供的隔离保证。有关如何配置GPU以用于vGPU虚拟机的信息,请参阅vGPU软件用户指南中的相关章节。有关使用vGPU进行GPU分区的更多信息,请参阅技术简介。
第五章、概念
5.1 术语
本节介绍一些用于描述MIG背后概念的术语。
流式多处理器(Streaming Multiprocessor)
流式多处理器(SM)在GPU上执行计算指令。
GPU上下文(GPU Context)
GPU上下文类似于CPU进程。它封装了在GPU上执行操作所需的所有资源,包括独特的地址空间、内存分配等。GPU上下文具有以下属性:
- 故障隔离
- 单独调度
- 独特的地址空间
GPU引擎(Engine)
GPU引擎是执行GPU上工作的组件。最常用的引擎是计算/图形引擎,它执行计算指令。其他引擎包括负责执行DMA的复制引擎(CE)、用于视频解码的NVDEC、用于编码的NVENC等。每个引擎可以独立调度,并为不同的GPU上下文执行工作。
GPU内存切片(GPU Memory Slice)
GPU内存切片是GPU内存的最小部分,包括相应的内存控制器和缓存。一个GPU内存切片大约是总GPU内存资源的八分之一,包括容量和带宽。
GPU SM切片(GPU SM Slice)
GPU SM切片是GPU上SM的最小部分。配置为MIG模式时,GPU SM切片大约是GPU中可用SM总数的七分之一。
GPU切片(GPU Slice)
GPU切片是GPU的最小部分,结合了单个GPU内存切片和单个GPU SM切片。
GPU实例(GPU Instance)
GPU实例(GI)是GPU切片和GPU引擎(DMA、NVDEC等)的组合。GPU实例内的所有内容始终共享所有GPU内存切片和其他GPU引擎,但其SM切片可以进一步细分为计算实例(CI)。GPU实例提供内存服务质量(QoS)。每个GPU切片包含专用的GPU内存资源,限制可用的容量和带宽,并提供内存QoS。每个GPU内存切片获得总GPU内存资源的1/8,每个GPU SM切片获得SM总数的1/7。
计算实例(Compute Instance)
GPU实例可以细分为多个计算实例。计算实例(CI)包含父GPU实例的SM切片和其他GPU引擎(DMA、NVDEC等)的子集。计算实例共享内存和引擎。
5.2 分区(Partitioning)
利用上述介绍的概念,本节提供了用户如何在GPU上创建各种分区的概述。为了说明,本文档将以A100-40GB为例,但对于其他支持MIG的GPU,过程是类似的。
GPU实例(GPU Instance)
GPU的分区是通过内存切片进行的,因此可以将A100-40GB GPU视为具有8个5GB内存切片和7个SM切片,如下图所示。
如上所述,创建GPU实例(GI)需要将一定数量的内存切片与一定数量的计算切片结合在一起。在下图中,一个5GB内存切片与1个计算切片结合以创建一个1g.5gb GI配置文件:
同样,4个5GB内存切片可以与4个1个计算切片结合以创建4g.5gb GI配置文件:
计算实例(Compute Instance)
GPU实例的计算切片可以进一步细分为多个计算实例(CI),这些CI共享父级GI的引擎和内存,但每个CI具有专用的SM资源。
使用上述相同的4g.20gb示例,可以创建一个CI,仅使用第一个计算切片,如下所示:
在这种情况下,可以通过选择任何计算切片来创建4个不同的CI。两个计算切片也可以组合在一起,以创建一个2c.4g.20gb配置文件:
在这个例子中,3个计算切片也可以组合在一起,创建一个3c.4g.20gb配置文件,或者所有4个切片可以组合在一起,创建一个4c.4g.20gb配置文件。当所有4个计算切片组合在一起时,该配置文件简单地称为4g.20gb配置文件。
请参阅关于标准命名方案和CUDA设备术语的相关章节。
配置文件放置(Profile Placement)
GI可以创建的切片数量并不是任意的。NVIDIA驱动程序API提供了多个“GPU实例配置文件”,用户可以通过指定其中一个配置文件来创建GI。
在给定的GPU上,可以通过混合和匹配这些配置文件创建多个GI,只要有足够的切片可用以满足请求。
注意:
下表显示了A100-SXM4-40GB产品上的配置文件名称。对于A100-SXM4-80GB,配置文件名称将根据内存比例而变化——例如,分别为1g.10gb、2g.20gb、3g.40gb、4g.40gb、7g.80gb。
有关MIG支持的所有配置文件组合的列表,请参阅支持的配置文件部分。
配置文件名称 | 内存比例 | SM比例 | 硬件单位 | L2 Cache Size |
复制引擎 | 可用实例数 |
MIG 1g.5gb |
1/8 | 1/7 | 0 NVDECs /0 JPEG /0 OFA |
1/8 | 1 | 7 |
MIG 1g.5gb +me |
1/8 | 1/7 | 1 NVDEC /1 JPEG /1 OFA |
1/8 | 1 | 1(一个1g 配置文件可以包括 媒体扩展) |
MIG 1g.10gb |
1/8 | 1/7 | 1 NVDECs /0 JPEG /0 OFA |
1/8 | 1 | 4 |
MIG 2g.10gb |
2/8 | 2/7 | 1 NVDECs /0 JPEG /0 OFA |
2/8 | 2 | 3 |
MIG 3g.20gb |
4/8 | 3/7 | 2 JPEG /0 |
4/8 | 3 | 2 |
MIG 4g.20gb |
4/8 | 4/7 | 2 NVDECs /0 JPEG /0 OFA |
4/8 | 4 | 1 |
MIG 7g.40gb |
Full | 7/7 | 5 NVDECs /1 JPEG /1 OFA |
Full | 7 | 1 |
下图展示了如何构建所有有效的GPU实例组合的示意图。
在该图中,可以通过从左侧的实例配置文件开始,并将其与向右移动时的其他实例配置文件结合,来构建一个有效的组合,确保没有两个配置文件在垂直方向上重叠。有关A100和A30上所有支持的组合和配置文件放置的列表,请参阅支持的配置文件部分。
请注意,在NVIDIA驱动程序发布R510之前,(4内存,4计算)和(4内存,3计算)配置文件的组合是不支持的。这个限制在较新的驱动程序上不再适用。
请注意,该图表示GPU实例在GPU上实例化后将存在的物理布局。由于GPU实例在不同位置创建和销毁,可能会发生碎片化,一个GPU实例的物理位置将在其旁边可以实例化哪些其他GPU实例中发挥作用。
5.3 CUDA并发机制
MIG被设计为对CUDA应用程序基本透明,以使CUDA编程模型保持不变,以最小化编程工作量。CUDA已经暴露了多种技术,用于在GPU上并行运行工作,值得展示这些技术与MIG的比较。请注意,流和MPS是CUDA编程模型的一部分,因此在与GPU实例一起使用时可以正常工作。
CUDA流是CUDA编程模型的一个特性,在CUDA应用程序中,不同的工作可以提交到独立队列中,并由GPU独立处理。CUDA流只能在单个进程内使用,并且不提供太多的隔离性——地址空间是共享的,SM是共享的,GPU内存带宽、缓存和容量都是共享的。最后,任何错误都会影响所有流和整个进程。
MPS是CUDA多进程服务。它允许协作多进程应用程序共享GPU上的计算资源。它通常被MPI作业使用,这些作业进行合作,但它也被用于在无关的应用程序之间共享GPU资源,同时接受这种解决方案带来的挑战。MPS目前不提供客户端之间的错误隔离,而每个MPS客户端使用的流多处理器可以选择性地限制为所有SM的一部分,调度硬件仍然是共享的。内存带宽、缓存和容量在MPS客户端之间都是共享的。最后,MIG是NVIDIA GPU提供的新形式的并发性,同时解决了其他CUDA技术在运行并行工作时的一些限制。
流 | MPS | MIG | |
分区类型 | 单个进程 | 逻辑Logical | 物理 |
最大分区 | 不限制 | 48 | 7 |
SM性能隔离 | No | Yes(按百分比) 不分区) |
Yes |
内存保护 | No | Yes | Yes |
内存带宽 QoS |
No | No | Yes |
错误隔离 | No | No | Yes |
网格互操作 | 总是 | IPC | Limited IPC |
重新配置 | 动态 | 进程启动(Process Launch) | 当空闲 |
第六章、部署考虑事项
MIG功能作为NVIDIA GPU驱动程序的一部分提供。
- 从CUDA 12/R525驱动程序开始支持H100 GPU。
- 从CUDA 11/R450驱动程序开始支持A100和A30 GPU。
系统考虑事项
以下系统考虑事项与GPU处于MIG模式时相关。
-
MIG仅在CUDA支持的Linux操作系统发行版上受支持。建议使用最新的NVIDIA数据中心Linux。请参阅快速入门指南。
注意:
还要注意设备节点和nvidia-capabilities以公开MIG设备。自450.51.06起,/proc机制用于系统级接口已被弃用,建议使用基于/dev的系统级接口通过cgroups控制对MIG设备的访问机制。此功能从450.80.02+驱动程序开始提供。 -
支持的配置包括
- 裸金属,包括容器
- 在支持的虚拟化程序上将GPU传递给Linux客户机
- 在支持的虚拟化程序上的vGPU
MIG允许多个vGPU(从而是VM)在单个A100上并行运行,同时保留vGPU提供的隔离保证。有关使用vGPU和MIG进行GPU分区的更多信息,请参阅技术简介。
-
在A100/A30上设置MIG模式需要GPU重置(因此需要超级用户权限)。一旦GPU处于MIG模式,实例管理就变得动态。请注意,设置是基于每个GPU的。
-
在NVIDIA Ampere GPU上,类似于ECC模式,MIG模式设置在重新启动期间是持久的,直到用户明确切换设置。
-
在启用MIG之前,所有持有驱动程序模块句柄的守护程序都需要停止。
-
对于可能运行系统健康监控服务(如nvsm或GPU健康监控)或遥测服务(如DCGM)的系统(如DGX),这一点很重要。
-
切换MIG模式需要CAP_SYS_ADMIN功能。默认情况下,其他MIG管理(例如创建和销毁实例)需要超级用户权限,但可以通过调整/proc/中的MIG功能权限将其委托给非特权用户。
6.2 应用考虑事项
当A100处于MIG模式时,用户应注意以下事项:
- 不支持图形API(例如OpenGL、Vulkan等)
- 不支持GPU到GPU的P2P(无论是PCIe还是NVLink)
- CUDA应用程序将计算实例和其父GPU实例视为单个CUDA设备。请参阅CUDA设备枚举部分。
- 不支持跨GPU实例的CUDA IPC。支持跨计算实例的CUDA IPC
- 支持CUDA调试(例如使用cuda-gdb)和内存/竞争检查(例如使用cudamemcheck或compute-sanitizer)
- 在MIG之上支持CUDA MPS。唯一的限制是客户端的最大数量(48)与计算实例大小成比例降低
- 当从GPU实例使用时,支持GPUDirect RDMA
第七章、MIG设备名称
默认情况下,MIG设备由单个“GPU实例”和单个“计算实例”组成。下表突出了一种命名约定,通过其GPU实例的计算切片数量和总内存(而不仅仅是内存切片数量)来引用MIG设备。
当仅创建一个CI(消耗GI的整个计算容量)时,设备名称中隐含了CI的大小。
注意:
下面的描述显示了A100-SXM4-40GB产品上的配置文件名称。对于A100-SXM4-80GB,配置文件名称将根据内存比例更改 - 例如,分别为1g.10gb、2g.20gb、3g.40gb、4g.40gb、7g.80gb。
内存 | 20gb | 10gb | 5gb |
GPU Instance(GPU实例) | 3g | 2g | 1g |
Compute Instance(计算实例) | 3c | 2c | 1c |
MIG设备 | 3g.20gb | 2g.10gb | 1g.5gb |
GPC GPC GPC | GPC GPC | GPC |
每个GI可以根据用户的工作负载需求进一步细分为多个CI。下表突出显示了在这种情况下MIG设备的名称会是什么样子。所示示例是将一个3g.20gb设备细分为一组具有不同计算实例切片计数的子设备。
内存 | 20gb | 20gb | |||
GPU Instance(GPU实例) | 3g | 3g | |||
Compute Instance(计算实例) | 1c | 1c | 1c | 2c | 1c |
MIG设备 | 1c.3g.20gb | 1c.3g.20gb | 1c.3g.20gb | 2c.3g.20gb | 1c.3g.20gb |
GPC | GPC | GPC | GPC GPC | GPC |
7.1 设备枚举
GPU实例(GIs)和计算实例(CIs)在新的/proc文件系统布局中为MIG进行了枚举。
相应的设备节点(在mig-minors中)被创建在/dev/nvidia-caps下。 有关设备节点和功能的更多信息,请参考有关章节。
7.2 CUDA设备枚举
MIG通过指定应在其上运行应用程序的CUDA设备来支持运行CUDA应用程序。在CUDA 11/R450和CUDA 12/R525中,仅支持对单个MIG实例进行枚举。换句话说,无论创建了多少个MIG设备(或向容器提供了多少个),单个CUDA进程只能枚举一个MIG设备。 CUDA应用程序将一个CI及其父GI视为单个CUDA设备。CUDA仅限于使用单个CI,如果有多个CI可见,则会选择第一个可用的CI。总结一下,有两个约束条件:
-
CUDA只能枚举单个计算实例
-
如果在任何其他GPU上枚举了任何计算实例,则CUDA不会枚举非MIG GPU 请注意,这些约束条件可能会在未来NVIDIA驱动程序发布的MIG版本中放宽。 CUDA_VISIBLE_DEVICES已扩展以支持MIG。根据使用的驱动程序版本,支持两种格式:
-
使用驱动程序>= R470(470.42.