admin管理员组

文章数量:1607884

目录

第一章、介绍

第二章、支持的GPU卡

第三章、支持的配置 

第四章、虚拟化 

第五章、概念 

5.1 术语

5.2 分区(Partitioning)

 5.3 CUDA并发机制

第六章、部署考虑事项

6.1 系统考虑事项

6.2 应用考虑事项

 第七章、MIG设备名称

7.1  设备枚举

7.2 CUDA设备枚举

第八章、支持的MIG配置文件 

8.1 A30 MIG配置文件

8.2 A100 MIG配置文件

8.3 H100 MIG配置文件

8.4 H200 MIG配置文件

第九章、开始使用MIG 

9.1 先决条件

9.2 启用MIG模式

9.2.1 在Hopper+ GPU卡上重置GPU

9.2.2 在Ampere GPU卡重启GPU

9.2.3 客户端驱动程序

9.3 列出GPU实例配置文件

9.4 创建GPU实例

9.5 在裸机上运行CUDA应用程序

9.5.1 GPU实例

9.5.2 计算实例

9.6 销毁GPU实例

9.7 监控MIG设备

9.8 MIG与CUDA MPS

9.9 以容器形式运行CUDA应用程序

9.9.1 安装Docker

9.9.2 安装NVIDIA容器工具包

9.9.3 运行容器

9.10 MIG与Kubernetes

9.11 MIG与Slurm

第十章、设备节点和功能

10.1 /dev基于nvidia-capabilities

10.2 / proc 基于 nvidia-capabilities(已弃用)

 第十一章、变更日志


第一章、介绍

新的多实例GPU(MIG)功能允许GPU(从NVIDIA Ampere架构开始)被安全地分区为最多七个独立的GPU实例,用于CUDA应用程序,为多个用户提供独立的GPU资源,以实现最佳GPU利用率。这一功能特别适用于未完全利用GPU计算能力的工作负载,因此用户可能希望并行运行不同的工作负载使GPU的利用率达到最大化。

对于具有多租户用例的云服务提供商(CSPs),MIG确保1个客户端不会影响其他客户端的工作或调度,同时为客户端提供增强的隔离性。

通过MIG,每个实例的处理器通过整个内存系统具有独立和隔离的路径 - 芯片上的交叉开关端口、L2缓存块、内存控制器和DRAM地址总线都被唯一地分配给一个单独的实例。这确保了单个用户的工作负载可以以可预测的吞吐量和延迟运行,具有相同的L2缓存分配和DRAM带宽,即使其他任务正在破坏它们自己的缓存或饱和它们的DRAM接口。MIG可以分区成可用的GPU计算资源(包括流多处理器或SMs,以及GPU引擎,如复制引擎或解码器),为不同客户端(如虚拟机、容器或进程)提供一个可定义的服务质量(QoS)和故障隔离。MIG使多个GPU实例可以并行运行在单个物理NVIDIA Ampere GPU上。

通过MIG,用户将能够看到并调度他们的新虚拟GPU实例上的作业,就像它们是物理GPU一样。MIG与Linux操作系统配合使用,支持使用Docker 引擎的容器,支持Kubernetes和使用Red Hat kvm虚拟化和VMware vSphere等虚拟机的监控程序。

MIG支持以下部署配置:

  • 裸金属,包括容器
  • 在支持的虚拟机监视程序上向Linux客户机进行GPU透传虚拟化
  • 支持虚拟机管理程序之上的vGPU

MIG允许多个vGPU(从而是VM)在单个GPU上并行运行,同时保留vGPU提供的隔离保证。有关使用vGPU和MIG进行GPU分区的更多信息,请参阅技术简介。

MIG概述

本文的目的是介绍MIG背后的概念、部署考虑因素,并提供MIG管理示例,以展示用户如何在支持MIG的GPU上运行CUDA应用程序。

第二章、支持的GPU卡

MIG支持从NVIDIA Ampere一代开始的GPU(即具有计算能力>= 8.0的GPU)。

以下表格提供了支持的GPU列表:
产品体系架构微体系架构计算能力内存大小支持的最大实例数
H100-SXM5HopperGH1009.080GB7
H100-PCIEHopperGH1009.080GB7
H100-SXM5HopperGH1009.094GB7
H100-PCIEHopperGH1009.094GB7
H100 on
GH200
HopperGH1009.096GB7
A100-SXM4NVIDIA
Ampere
GA1008.040GB7
A100-SXM4NVIDIA
Ampere
GA1008.080GB7
A100-PCIENVIDIA
Ampere
GA1008.040GB7
A100-PCIENVIDIA
Ampere
GA1008.080GB7
A30NVIDIA
Ampere
GA1008.024GB4

此外,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切片,如下图所示。

A100上的可用切片

如上所述,创建GPU实例(GI)需要将一定数量的内存切片与一定数量的计算切片结合在一起。在下图中,一个5GB内存切片与1个计算切片结合以创建一个1g.5gb GI配置文件:

结合内存和计算切片

同样,4个5GB内存切片可以与4个1g计算切片结合以创建4g.20gb 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支持的所有配置文件组合的列表,请参阅支持的配置文件部分。

A100上的GPU实例配置文件
配置文件名称内存比例SM比例硬件单位L2 Cache
Size
复制引擎可用实例数
MIG
1g.5gb
1/81/70
NVDECs /0
JPEG /0
OFA
1/817
MIG
1g.5gb
+me
1/81/71
NVDEC /1
JPEG /1
OFA
1/811(一个1g
配置文件可以包括
媒体扩展)
MIG
1g.10gb
1/81/71
NVDECs /0
JPEG /0
OFA
1/814
MIG
2g.10gb
2/82/71
NVDECs /0
JPEG /0
OFA
2/823
MIG
3g.20gb
4/83/7

2
NVDECs /0

JPEG /0
OFA

4/832
MIG
4g.20gb
4/84/72
NVDECs /0
JPEG /0
OFA
4/841
MIG
7g.40gb
Full7/75
NVDECs /1
JPEG /1
OFA
Full71

下图展示了如何构建所有有效的GPU实例组合的示意图。

在A100上的MIG配置文件

在该图中,可以通过从左侧的实例配置文件开始,并将其与向右移动时的其他实例配置文件结合,来构建一个有效的组合,确保没有两个配置文件在垂直方向上重叠。有关A100和A30上所有支持的组合和配置文件放置的列表,请参阅支持的配置文件部分。
请注意,在NVIDIA驱动程序发布R510之前,(4内存,4计算)和(4内存,3计算)配置文件的组合是不支持的。这个限制在较新的驱动程序上不再适用。

A100上的配置文件放置

请注意,该图表示GPU实例在GPU上实例化后将存在的物理布局。由于GPU实例在不同位置创建和销毁,可能会发生碎片化,一个GPU实例的物理位置将在其旁边可以实例化哪些其他GPU实例中发挥作用。

 5.3 CUDA并发机制


MIG被设计为对CUDA应用程序基本透明,以使CUDA编程模型保持不变,以最小化编程工作量。CUDA已经暴露了多种技术,用于在GPU上并行运行工作,值得展示这些技术与MIG的比较。请注意,streams(数据流或流控制)和MPS是CUDA编程模型的一部分,因此在与GPU实例一起使用时可以正常工作。
CUDA streams(数据流或流控制)是CUDA编程模型的一个特性,在CUDA应用程序中,不同的工作可以提交到独立队列中,并由GPU独立处理。CUDA streams(数据流或流控制)只能在单个进程内使用,并且不提供太多的隔离性——地址空间是共享的,SMs(流式多处理器)是共享的,GPU内存带宽、缓存和容量都是共享的。最后,任何错误都会影响所有streams(数据流或流控制)和整个进程。
MPS是CUDA多进程服务。它允许协作多进程应用程序共享GPU上的计算资源。它通常被MPI作业使用,这些作业进行合作,但它也被用于在无关的应用程序之间共享GPU资源,同时接受这种解决方案带来的挑战。MPS目前不提供客户端之间的错误隔离,而每个MPS客户端使用的流多处理器可以选择性地限制为所有SMs(流式多处理器)的一部分,调度硬件仍然是共享的。内存带宽、缓存和容量在MPS客户端之间都是共享的。最后,MIG是NVIDIA GPU提供的新形式的并发性,同时解决了其他CUDA技术在运行并行工作时的一些限制。

CUDA并发机制
MPSMIG
分区类型单个进程逻辑Logical物理
最大分区不限制487
SM性能隔离NoYes(按百分比)
不分区)
Yes
内存保护NoYesYes
内存带宽
QoS
NoNoYes
错误隔离NoNoYes
网格互操作总是IPCLimited IPC
重新配置动态进程启动(Process Launch)当空闲

第六章、部署考虑事项

MIG功能作为NVIDIA GPU驱动程序的一部分提供。

  • 从CUDA 12/R525驱动程序开始支持H100 GPU。
  • 从CUDA 11/R450驱动程序开始支持A100和A30 GPU。

6.1 系统考虑事项

以下系统考虑事项与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的大小。

MIG设备名称

注意:
下面的描述显示了A100-SXM4-40GB产品上的配置文件名称。对于A100-SXM4-80GB,配置文件名称将根据内存比例更改 - 例如,分别为1g.10gb、2g.20gb、3g.40gb、4g.40gb、7g.80gb。

使用单个CI时的设备名称
内存20gb10gb5gb
GPU Instance(GPU实例)3g2g1g
Compute Instance(计算实例)3c2c1c
MIG设备3g.20gb2g.10gb1g.5gb
GPC GPC GPCGPC GPCGPC

每个GI可以根据用户的工作负载需求进一步细分为多个CI。下表突出显示了在这种情况下MIG设备的名称会是什么样子。所示示例是将一个3g.20gb设备细分为一组具有不同计算实例切片计数的子设备。

使用多个ci时的设备名称
内存20gb20gb
GPU Instance(GPU实例)3g3g
Compute Instance(计算实例)1c1c1c2c1c
MIG设备1c.3g.20gb1c.3g.20gb1c.3g.20gb2c.3g.20gb1c.3g.20gb
GPCGPCGPCGPC GPCGPC

7.1  设备枚举

  GPU实例(GIs)和计算实例(CIs)在新的/proc文件系统布局中为MIG进行了枚举。

$ ls -l /proc/driver/nvidia-caps/
-r--r--r-- 1 root root 0 Nov 21 21:22 mig-minors
-r--r--r-- 1 root root 0 Nov 21 21:22 nvlink-minors
-r--r--r-- 1 root root 0 Nov 21 21:22 sys-minors

相应的设备节点(在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。总结一下,有两个约束条件:

  1. CUDA只能枚举单个计算实例

  2. 如果在任何其他GPU上枚举了任何计算实例,则CUDA不会枚举非MIG GPU 请注意,这些约束条件可能会在未来NVIDIA驱动程序发布的MIG版本中放宽。 CUDA_VISIBLE_DEVICES已扩展以支持MIG。根据使用的驱动程序版本,支持两种格式:

  3. 使用驱动程序>= R470(470.42.01+),每个MIG设备都分配了以MIG-<UUID>开头的GPU UUID。

  4. 使用驱动程序< R470(例如R450和R460),通过指定CI和相应的父GI来枚举每个MIG设备。格式遵循此约定:MIG-<GPU-UUID>/<GPU实例ID>/<计算实例ID>。

注意: 使用R470 NVIDIA数据中心驱动程序(470.42.01+)的示例如下所示,显示了在每个GPU配置不同的8-GPU系统中如何分配MIG设备的GPU UUIDs。

$ nvidia-smi -L
GPU 0: A100-SXM4-40GB (UUID: GPU-5d5ba0d6-d33d-2b2c-524d-9e3d8d2b8a77)
MIG 1g.5gb Device 0: (UUID: MIG-c6d4f1ef-42e4-5de3-91c7-45d71c87eb3f)
MIG 1g.5gb Device 1: (UUID: MIG-cba663e8-9bed-5b25-b243-5985ef7c9beb)
MIG 1g.5gb Device 2: (UUID: MIG-1e099852-3624-56c0-8064-c5db1211e44f)
MIG 1g.5gb Device 3: (UUID: MIG-8243111b-d4c4-587a-a96d-da04583b36e2)
MIG 1g.5gb Device 4: (UUID: MIG-169f1837-b996-59aa-9ed5-b0a3f99e88a6)
MIG 1g.5gb Device 5: (UUID: MIG-d5d0152c-e3f0-552c-abee-ebc0195e9f1d)
MIG 1g.5gb Device 6: (UUID: MIG-7df6b45c-a92d-5e09-8540-a6b389968c31)
GPU 1: A100-SXM4-40GB (UUID: GPU-0aa11ebd-627f-af3f-1a0d-4e1fd92fd7b0)
MIG 2g.10gb Device 0: (UUID: MIG-0c757cd7-e942-5726-a0b8-0e8fb7067135)
MIG 2g.10gb Device 1: (UUID: MIG-703fb6ed-3fa0-5e48-8e65-1c5bdcfe2202)
MIG 2g.10gb Device 2: (UUID: MIG-532453fc-0faa-5c3c-9709-a3fc2e76083d)
GPU 2: A100-SXM4-40GB (UUID: GPU-08279800-1cbe-a71d-f3e6-8f67e15ae54a)
MIG 3g.20gb Device 0: (UUID: MIG-aa232436-d5a6-5e39-b527-16f9b223cc46)
MIG 3g.20gb Device 1: (UUID: MIG-3b12da37-7fa2-596c-8655-62dab88f0b64)
GPU 3: A100-SXM4-40GB (UUID: GPU-71086aca-c858-d1e0-aae1-275bed1008b9)
MIG 7g.40gb Device 0: (UUID: MIG-3e209540-03e2-5edb-8798-51d4967218c9)
GPU 4: A100-SXM4-40GB (UUID: GPU-74fa9fb7-ccf6-8234-e597-7af8ace9a8f5)
MIG 1c.3g.20gb Device 0: (UUID: MIG-79c62632-04cc-574b-af7b-cb2e307120d8)
MIG 1c.3g.20gb Device 1: (UUID: MIG-4b3cc0fd-6876-50d7-a8ba-184a86e2b958)
MIG 1c.3g.20gb Device 2: (UUID: MIG-194837c7-0476-5b56-9c45-16bddc82e1cf)
MIG 1c.3g.20gb Device 3: (UUID: MIG-291820db-96a4-5463-8e7b-444c2d2e3dfa)
MIG 1c.3g.20gb Device 4: (UUID: MIG-5a97e28a-7809-5e93-abae-c3818c5ea801)
MIG 1c.3g.20gb Device 5: (UUID: MIG-3dfd5705-b18a-5a7c-bcee-d03a0ccb7a96)
GPU 5: A100-SXM4-40GB (UUID: GPU-3301e6dd-d38f-0eb5-4665-6c9659f320ff)
MIG 4g.20gb Device 0: (UUID: MIG-6d96b9f9-960e-5057-b5da-b8a35dc63aa8)
GPU 6: A100-SXM4-40GB (UUID: GPU-bb40ed7d-cbbb-d92c-50ac-24803cda52c5)
MIG 1c.7g.40gb Device 0: (UUID: MIG-66dd01d7-8cdb-5a13-a45d-c6eb0ee11810)
MIG 2c.7g.40gb Device 1: (UUID: MIG-03c649cb-e6ae-5284-8e94-4b1cf767e06c)
MIG 3c.7g.40gb Device 2: (UUID: MIG-8abf68e0-2808-525e-9133-ba81701ed6d3)
GPU 7: A100-SXM4-40GB (UUID: GPU-95fac899-e21a-0e44-b0fc-e4e3bf106feb)
MIG 4g.20gb Device 0: (UUID: MIG-219c765c-e07f-5b85-9c04-4afe174d83dd)
MIG 2g.10gb Device 1: (UUID: MIG-25884364-137e-52cc-a7e4-ecf3061c3ae1)
MIG 1g.5gb Device 2: (UUID: MIG-83e71a6c-f0c3-5dfc-8577-6e8b17885e1f)

第八章、支持的MIG配置文件 

本节概述了支持的配置文件以及在支持的GPU上可能的配置文件放置方式。

8.1 A30 MIG配置文件

以下图表显示了在NVIDIA A30上支持的配置文件:

在A30上的配置文件

下表显示了A30-24GB产品上支持的配置文件。

A30上的GPU实例配置文件
配置文件名称内存比例SM比例硬件单元L2缓存大小复制引擎可用实例数
MIG
1g.6gb
1/41/40
NVDECs /0
JPEG /0
OFA
1/414
MIG
1g.6gb
+me
1/41/41
NVDEC /1
JPEG /1
OFA
1/411(单个1g配置文件可以包括媒体扩展)
MIG
2g.12gb
2/42/42
NVDECs /0
JPEG /0
OFA
2/422
MIG
2g.12gb
+me
2/42/42
NVDECs /1
JPEG /1
OFA
2/421(一个2g配置文件可以包括媒体扩展)
MIG
4g.24gb
全部4/44
NVDECs /1
JPEG /1
OFA
全部41

注意: 1g.6gb+me配置文件仅从R470驱动程序开始提供。 2g.12gb+me配置文件仅从R525驱动程序开始提供。 

8.2 A100 MIG配置文件

 以下图表显示了在NVIDIA A100上支持的配置文件:

A100上MIG配置文件

下表显示了A100-SXM4-40GB产品上支持的配置文件。对于A100-SXM4-80GB,配置文件名称将根据内存比例进行更改 - 例如,1g.10gb,1g.10gb+me,1g.20gb,2g.20gb,3g.40gb,4g.40gb,7g.80gb等。

A100上的GPU实例配置文件
配置文件名称内存比例SM比例硬件单元L2缓存大小复制引擎可用实例数
MIG
1g.5gb
1/81/70
NVDECs /0
JPEG /0
OFA
1/817
MIG
1g.5gb
+me
1/81/71
NVDEC /1
JPEG /1
OFA
1/811(单个1g配置文件可以包括媒体扩展)
MIG
1g.10gb
1/81/71
NVDECs /0
JPEG /0
OFA
1/814
MIG
2g.10gb
2/82/71
NVDECs /0
JPEG /0
OFA
2/823
MIG
3g.20gb
4/83/72
NVDECs /0
JPEG /0
OFA
4/832
MIG
4g.20gb
4/84/72
NVDECs /0
JPEG /0
OFA
4/841
MIG
7g.40gb
全部7/75
NVDECs /1
JPEG /1
OFA
全部71

 注意:
1 g.5gb+me配置文件仅适用于R470驱动程序。
1 g.10gb配置文件仅从R525驱动程序开始可用。

8.3 H100 MIG配置文件

下图显示了NVIDIA H100支持的配置文件:

H100上的MIG配置文件


​​​​

下表显示了H100 80GB产品上支持的配置文件(PCIe和SXM5)。 

在H100 80G产品上的GPU实例配置文件
配置文件名称内存比例SM比例硬件单元L2缓存大小复制引擎可用实例数
MIG
1g.10gb
1/81/71
NVDECs /1
JPEG /0
OFA
1/817
MIG
1g.10gb
+me
1/81/71
NVDEC /1
JPEG /1
OFA
1/811(单个1g配置文件可以包括媒体扩展)
MIG
1g.20gb
1/41/71
NVDECs /1
JPEG /0
OFA
1/814
MIG
2g.20gb
2/82/72
NVDECs /2
JPEG /0
OFA        
2/823
MIG
3g.40gb
4/83/73
NVDECs /3
JPEG /0
OFA
4/832
MIG
4g.40gb
4/84/74
NVDECs /4
JPEG /0
OFA
4/841
MIG
7g.80gb
全部7/77
NVDECs /7
JPEG /1
OFA
全部81

下表显示了H100 94GB产品上支持的配置文件(PCIe和SXM5)。 

在H100 94G产品上的GPU实例配置文件
配置文件名称内存比例SM比例硬件单元L2缓存大小复制引擎可用实例数
MIG
1g.11gb
1/81/71
NVDECs /1
JPEG /0
OFA
1/817
MIG
1g.11gb
+me
1/81/71
NVDEC /1
JPEG /1
OFA
1/811(单个1g配置文件可以包括媒体扩展)
MIG
1g.22gb
1/41/71
NVDECs /1
JPEG /0
OFA
1/814
MIG
2g.22gb
2/82/72
NVDECs /2
JPEG /0
OFA        
2/823
MIG
3g.44gb
4/83/73
NVDECs /3
JPEG /0
OFA
4/832
MIG
4g.44gb
4/84/74
NVDECs /4
JPEG /0
OFA
4/841
MIG
7g.88gb
全部7/77
NVDECs /7
JPEG /1
OFA
全部81

 下表显示了H100 96GB产品(H100 on)上支持的配置文件GH200)。

在H100 96G产品上的GPU实例配置文件
配置文件名称内存比例SM比例硬件单元L2缓存大小复制引擎可用实例数
MIG
1g.12gb
1/81/71
NVDECs /1
JPEG /0
OFA
1/817
MIG
1g.12gb
+me
1/81/71
NVDEC /1
JPEG /1
OFA
1/811(单个1g配置文件可以包括媒体扩展)
MIG
1g.24gb
1/41/71
NVDECs /1
JPEG /0
OFA
1/814
MIG
2g.24gb
2/82/72
NVDECs /2
JPEG /0
OFA        
2/823
MIG
3g.48gb
4/83/73
NVDECs /3
JPEG /0
OFA
4/832
MIG
4g.48gb
4/84/74
NVDECs /4
JPEG /0
OFA
4/841
MIG
7g.96gb
全部7/77
NVDECs /7
JPEG /1
OFA
全部81

8.4 H200 MIG配置文件

下图显示了NVIDIA H200支持的配置文件:

H200 MIG配置文件

下表显示了H200 141GB产品上支持的配置文件。

在H200 141G产品上的GPU实例配置文件
配置文件名称内存比例SM比例硬件单元L2缓存大小复制引擎可用实例数
MIG
1g.18gb
1/81/71
NVDECs /1
JPEG /0
OFA
1/817
MIG
1g.18gb
+me
1/81/71
NVDEC /1
JPEG /1
OFA
1/811(单个1g配置文件可以包括媒体扩展)
MIG
1g.35gb
1/41/71
NVDECs /1
JPEG /0
OFA
1/814
MIG
2g.35gb
2/82/72
NVDECs /2
JPEG /0
OFA        
2/823
MIG
3g.71gb
4/83/73
NVDECs /3
JPEG /0
OFA
4/832
MIG
4g.71gb
4/84/74
NVDECs /4
JPEG /0
OFA
4/841
MIG
7g.141gb
全部7/77
NVDECs /7
JPEG /1
OFA
全部81

第九章、开始使用MIG 

9.1 先决条件

在使用支持MIG模式的GPU时,建议满足以下先决条件和最低软件版本。

  • ‣ MIG仅在此处列出的GPU和系统上受支持
  • ‣ 建议安装最新的NVIDIA数据中心驱动程序。

最低版本如下:

  • ‣ 如果使用H100,则需要CUDA 12和NVIDIA驱动程序R525(>= 525.53)或更高版本
  • ‣ 如果使用A100/A30,则需要CUDA 11和NVIDIA驱动程序R450(>= 450.80.02)或更高版本

‣ 支持CUDA的Linux操作系统发行版

‣ 如果运行容器或使用Kubernetes,则:

  • ‣ NVIDIA容器工具包(nvidia-docker2):v2.5.0或更高版本
  • ‣ NVIDIA K8s设备插件:v0.7.0或更高版本
  • ‣ NVIDIA gpu-feature-discovery:v0.2.0或更高版本 MIG可以通过NVIDIA管理库(NVML)API或其命令行接口nvidia-smi进行程序化管理。

请注意,为了简洁起见,以下示例中的部分nvidia-smi输出可能会被裁剪,以展示相关的重点部分。 有关MIG命令的更多信息,请参见nvidia-smi手册页或运行nvidia-smi mig --help。有关MIG管理API的信息,请参见CUDA Toolkit包中包含的NVML头文件(nvml.h)(安装在/usr/local/cuda/include/nvml.h下)。有关配置MIG的自动化工具支持,请参考NVIDIA MIG分区编辑器(或mig-parted)工具。

9.2 启用MIG模式

默认情况下,GPU未开启MIG模式。例如,运行nvidia-smi显示
MIG模式被禁用:

$ nvidia-smi -i 0
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 A100-SXM4-40GB Off | 00000000:36:00.0 Off | 0 |
| N/A 29C P0 62W / 400W | 0MiB / 40537MiB | 6% Default |
| | | Disabled |
+-------------------------------+----------------------+----------------------+

可以通过以下命令在每个GPU上启用MIG模式:nvidia-smi -i <GPU IDs> -mig 1。可以使用逗号分隔的GPU索引、PCI总线ID或UUID来选择GPU。如果未指定GPU ID,则MIG模式将应用于系统上的所有GPU。 当在GPU上启用MIG时,具体取决于GPU产品,驱动程序将尝试重置GPU,以使MIG模式生效。

$ sudo nvidia-smi -i 0 -mig 1
Enabled MIG Mode for GPU 00000000:36:00.0
All done.
$ nvidia-smi -i 0 --query-gpu=pci.bus_id,mig.mode.current --format=csv
pci.bus_id, mig.mode.current
00000000:36:00.0, Enabled

9.2.1 在Hopper+ GPU卡上重置GPU

 从Hopper系列GPU开始,启用MIG模式不再需要重置GPU才能生效(因此驱动程序不会在后台尝试重置GPU)。
请注意,MIG模式(禁用启用状态)仅在驱动程序驻留在系统中时保持有效(即内核模块已加载)。MIG模式不再在系统重启后保持有效(不再在GPU InfoROM中存储状态位)。
因此,卸载和重新加载驱动程序内核模块将禁用MIG模式。

9.2.2 在Ampere GPU卡重启GPU

在NVIDIA Ampere GPU上,当启用MIG模式时,驱动程序将尝试重置GPU,以使MIG模式生效。
请注意,MIG模式(禁用启用状态)在系统重启后是持久的(在GPU InfoROM中存储了状态位)。因此,必须显式禁用MIG模式,以将GPU恢复到其默认状态。

注意:

如果您在使用NVIDIA Ampere GPU(A100或A30)进行直通的虚拟机中使用MIG,则可能需要重启虚拟机,以允许GPU处于MIG模式,因为在某些情况下,由于安全原因,超管不允许进行GPU重置。以下示例可以说明这一点:

$ sudo nvidia-smi -i 0 -mig 1
Warning: MIG mode is in pending enable state for GPU 00000000:00:03.0:Not
Supported
Reboot the system or try nvidia-smi --gpu-reset to make MIG mode effective on
GPU 00000000:00:03.0
All done.
$ sudo nvidia-smi --gpu-reset
Resetting GPU 00000000:00:03.0 is not supported.

9.2.3 客户端驱动程序

在某些情况下,如果系统上有使用GPU的代理(例如监控代理),则可能无法启动GPU重置。例如,在DGX系统上,您可能会遇到以下消息:

$ sudo nvidia-smi -i 0 -mig 1
Warning: MIG mode is in pending enable state for GPU 00000000:07:00.0:In use by
another client
00000000:07:00.0 is currently being used by one or more other processes (e.g. CUDA
application or a monitoring application such as another instance of nvidia-smi).
Please first kill all processes using the device and retry the command or reboot
the system to make MIG mode effective.
All done.

在这个特定的DGX示例中,您需要停止nvsm和dcgm服务,启用所需GPU上的MIG模式,然后恢复监控服务:

$ sudo systemctl stop nvsm
$ sudo systemctl stop dcgm
$ sudo nvidia-smi -i 0 -mig 1
Enabled MIG Mode for GPU 00000000:07:00.0
All done.

本文档中显示的示例使用超级用户权限。如设备节点部分所述,授予对mig/config功能的读取访问权限允许非根用户在GPU配置为MIG模式后管理实例。mig/config文件的默认文件权限如下所示。

$ ls -l /proc/driver/nvidia/capabilities/*
/proc/driver/nvidia/capabilities/mig:
total 0
-r-------- 1 root root 0 May 24 16:10 config
-r--r--r-- 1 root root 0 May 24 16:10 monitor

9.3 列出GPU实例配置文件

NVIDIA驱动程序提供了一些配置文件,用户在配置A100的MIG功能时可以选择这些配置文件。配置文件是用户可以创建的GPU实例的大小和能力。驱动程序还提供有关放置的信息,指示可以创建的实例类型和数量。

nvidia-smi mig -lgip
+-----------------------------------------------------------------------------+
| GPU instance profiles: |
| GPU Name ID Instances Memory P2P SM DEC ENC |
| Free/Total GiB CE JPEG OFA |
|=============================================================================|
| 0 MIG 1g.5gb 19 7/7 4.75 No 14 0 0 |
| 1 0 0 |
+-----------------------------------------------------------------------------+
| 0 MIG 1g.5gb+me 20 1/1 4.75 No 14 1 0 |
| 1 1 1 |
+-----------------------------------------------------------------------------+
| 0 MIG 1g.10gb 15 4/4 9.62 No 14 1 0 |
| 1 0 0 |
+-----------------------------------------------------------------------------+
| 0 MIG 2g.10gb 14 3/3 9.62 No 28 1 0 |
| 2 0 0 |
+-----------------------------------------------------------------------------+
| 0 MIG 3g.20gb 9 2/2 19.50 No 42 2 0 |
| 3 0 0 |
+-----------------------------------------------------------------------------+
| 0 MIG 4g.20gb 5 1/1 19.50 No 56 2 0 |
| 4 0 0 |
+-----------------------------------------------------------------------------+
| 0 MIG 7g.40gb 0 1/1 39.25 No 98 5 0 |
| 7 1 1 |
+-----------------------------------------------------------------------------+

使用以下命令列出可用的放置选项。放置的语法为{<index>}:<GPU切片计数>,显示实例在GPU上的放置。所示的放置索引指示配置文件在GPU上的映射,如支持的配置文件表所示。

$ nvidia-smi mig -lgipp
GPU 0 Profile ID 19 Placements: {0,1,2,3,4,5,6}:1
GPU 0 Profile ID 20 Placements: {0,1,2,3,4,5,6}:1
GPU 0 Profile ID 15 Placements: {0,2,4,6}:2
GPU 0 Profile ID 14 Placements: {0,2,4}:2
GPU 0 Profile ID 9 Placements: {0,4}:4
GPU 0 Profile ID 5 Placement : {0}:4
GPU 0 Profile ID 0 Placement : {0}:8

该命令显示用户可以创建两个类型为3g.20gb(配置文件ID 9)的实例或七个类型为1g.5gb(配置文件ID 19)的实例。

9.4 创建GPU实例

在开始使用MIG之前,用户需要使用-cgi选项创建GPU实例。可以使用以下三种选项之一来指定要创建的实例配置文件:

  1. 配置文件ID(例如9、14、5)
  2. 配置文件的简短名称(例如3g.20gb)
  3. 实例的全名(例如MIG 3g.20gb)

一旦创建了GPU实例,就需要创建相应的计算实例(CI)。通过使用-C选项,nvidia-smi可以创建这些实例。

注意: 如果不创建GPU实例(及相应的计算实例),则无法在GPU上运行CUDA工作负载。换句话说,仅仅在GPU上启用MIG模式是不够的。还要注意,创建的MIG设备在系统重启后并不持久。因此,如果GPU或系统重置,用户或系统管理员需要重新创建所需的MIG配置。有关此目的的自动化工具支持,请参考NVIDIA MIG分区编辑器(或mig-parted)工具,包括创建一个可以在系统启动时重新创建MIG几何结构的systemd服务。

以下示例展示了用户如何创建GPU实例(及相应的计算实例)。在此示例中,用户可以创建两个GPU实例(类型为3g.20gb),每个GPU实例拥有一半的可用计算和内存容量。在此示例中,我们故意使用配置文件ID和简短配置文件名称来展示如何使用任一选项:

$ sudo nvidia-smi mig -cgi 9,3g.20gb -C
Successfully created GPU instance ID 2 on GPU 0 using profile MIG 3g.20gb (ID 9)
Successfully created compute instance ID 0 on GPU 0 GPU instance ID 2 using
profile MIG 3g.20gb (ID 2)
Successfully created GPU instance ID 1 on GPU 0 using profile MIG 3g.20gb (ID 9)
Successfully created compute instance ID 0 on GPU 0 GPU instance ID 1 using
profile MIG 3g.20gb (ID 2)

现在列出可用的GPU实例:

$ sudo nvidia-smi mig -lgi
+----------------------------------------------------+
| GPU instances: |
| GPU Name Profile Instance Placement |
| ID ID Start:Size |
|====================================================|
| 0 MIG 3g.20gb 9 1 4:4 |
+----------------------------------------------------+
| 0 MIG 3g.20gb 9 2 0:4 |
+----------------------------------------------------+

现在验证已创建GIs和相应的CIs:

$ nvidia-smi
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 0 1 0 0 | 11MiB / 20224MiB | 42 0 | 3 0 2 0 0 |
+------------------+----------------------+-----------+-----------------------+
| 0 2 0 1 | 11MiB / 20096MiB | 42 0 | 3 0 2 0 0 |
+------------------+----------------------+-----------+-----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+

实例几何(Instance Geometry)
如分区部分所述,NVIDIA驱动程序API提供了一些可供用户选择的GPU实例配置文件。
如果用户指定了混合几何配置文件,则NVIDIA驱动程序将选择各种配置文件的放置。这可以在以下示例中看到。
示例1:创建4-2-1几何结构。创建实例后,可以观察到配置文件的放置:

$ sudo nvidia-smi mig -cgi 19,14,5
Successfully created GPU instance ID 13 on GPU 0 using profile MIG 1g.5gb (ID 19)
Successfully created GPU instance ID 5 on GPU 0 using profile MIG 2g.10gb (ID 14)
Successfully created GPU instance ID 1 on GPU 0 using profile MIG 4g.20gb (ID 5)
$ sudo nvidia-smi mig -lgi
+----------------------------------------------------+
| GPU instances: |
| GPU Name Profile Instance Placement |
| ID ID Start:Size |
|====================================================|
| 0 MIG 1g.5gb 19 13 6:1 |
+----------------------------------------------------+
| 0 MIG 2g.10gb 14 5 4:2 |
+----------------------------------------------------+
| 0 MIG 4g.20gb 5 1 0:4 |
+----------------------------------------------------+

示例2:创建3-2-1-1几何结构。

注意: 由于API存在已知问题,必须首先按顺序指定配置文件ID 9或3g.20gb。如果不这样做,将会导致以下错误。

$ sudo nvidia-smi mig -cgi 19,19,14,9
Successfully created GPU instance ID 13 on GPU 0 using profile MIG 1g.5gb (ID
19)
Successfully created GPU instance ID 11 on GPU 0 using profile MIG 1g.5gb (ID
19)
Successfully created GPU instance ID 3 on GPU 0 using profile MIG 2g.10gb
(ID 14)
Unable to create a GPU instance on GPU 0 using profile 9: Insufficient
Resources
Failed to create GPU instances: Insufficient Resources

请为3g.20gb配置文件指定正确的顺序。其余配置文件的组合没有此要求。

$ sudo nvidia-smi mig -cgi 9,19,14,19
Successfully created GPU instance ID 2 on GPU 0 using profile MIG 3g.20gb (ID 9)
Successfully created GPU instance ID 7 on GPU 0 using profile MIG 1g.5gb (ID 19)
Successfully created GPU instance ID 4 on GPU 0 using profile MIG 2g.10gb (ID 14)
Successfully created GPU instance ID 8 on GPU 0 using profile MIG 1g.5gb (ID 19)
$ sudo nvidia-smi mig -lgi
+----------------------------------------------------+
| GPU instances: |
| GPU Name Profile Instance Placement |
| ID ID Start:Size |
|====================================================|
| 0 MIG 1g.5gb 19 7 0:1 |
+----------------------------------------------------+
| 0 MIG 1g.5gb 19 8 1:1 |
+----------------------------------------------------+
| 0 MIG 2g.10gb 14 4 2:2 |
+----------------------------------------------------+
| 0 MIG 3g.20gb 9 2 4:4 |
+----------------------------------------------------+

示例3:创建一个2-1-1-1-1几何结构:

$ sudo nvidia-smi mig -cgi 14,19,19,19,19,19
Successfully created GPU instance ID 5 on GPU 0 using profile MIG 2g.10gb (ID 14)
Successfully created GPU instance ID 13 on GPU 0 using profile MIG 1g.5gb (ID 19)
Successfully created GPU instance ID 7 on GPU 0 using profile MIG 1g.5gb (ID 19)
Successfully created GPU instance ID 8 on GPU 0 using profile MIG 1g.5gb (ID 19)
Successfully created GPU instance ID 9 on GPU 0 using profile MIG 1g.5gb (ID 19)
Successfully created GPU instance ID 10 on GPU 0 using profile MIG 1g.5gb (ID 19)
$ sudo nvidia-smi mig -lgi
+----------------------------------------------------+
| GPU instances: |
| GPU Name Profile Instance Placement |
| ID ID Start:Size |
|====================================================|
| 0 MIG 1g.5gb 19 7 0:1 |
+----------------------------------------------------+
| 0 MIG 1g.5gb 19 8 1:1 |
+----------------------------------------------------+
| 0 MIG 1g.5gb 19 9 2:1 |
+----------------------------------------------------+
| 0 MIG 1g.5gb 19 10 3:1 |
+----------------------------------------------------+
| 0 MIG 1g.5gb 19 13 6:1 |
+----------------------------------------------------+
| 0 MIG 2g.10gb 14 5 4:2 |
+----------------------------------------------------+

9.5 在裸机上运行CUDA应用程序

9.5.1 GPU实例

以下示例展示了如何在两个不同的GPU实例上并行运行两个CUDA应用程序。在这个示例中,BlackScholes CUDA示例同时在A100上创建的两个GI上运行。

$ nvidia-smi -L
GPU 0: A100-SXM4-40GB (UUID: GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0)
MIG 3g.20gb Device 0: (UUID: MIG-c7384736-a75d-5afc-978f-d2f1294409fd)
MIG 3g.20gb Device 1: (UUID: MIG-a28ad590-3fda-56dd-84fc-0a0b96edc58d)
$ CUDA_VISIBLE_DEVICES=MIG-c7384736-a75d-5afc-978f-d2f1294409fd ./BlackScholes &
$ CUDA_VISIBLE_DEVICES=MIG-a28ad590-3fda-56dd-84fc-0a0b96edc58d ./BlackScholes &

现在验证两个CUDA应用程序是否在两个单独的GPU实例上运行:

$ nvidia-smi
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 0 1 0 0 | 268MiB / 20224MiB | 42 0 | 3 0 2 0 0 |
+------------------+----------------------+-----------+-----------------------+
| 0 2 0 1 | 268MiB / 20096MiB | 42 0 | 3 0 2 0 0 |
+------------------+----------------------+-----------+-----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 1 0 58866 C ./BlackScholes 253MiB |
| 0 2 0 58856 C ./BlackScholes 253MiB |
+-----------------------------------------------------------------------------+

GPU利用率指标

NVML(以及nvidia-smi)不支持将利用率指标归因于MIG设备。从前面的示例中,运行CUDA程序时,利用率显示为N/A:

$ nvidia-smi
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | BAR1-Usage | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 0 1 0 0 | 268MiB / 20096MiB | 42 0 | 3 0 2 0 0 |
| | 4MiB / 32767MiB | | |
+------------------+----------------------+-----------+-----------------------+
| 0 2 0 1 | 268MiB / 20096MiB | 42 0 | 3 0 2 0 0 |
| | 4MiB / 32767MiB | | |
+------------------+----------------------+-----------+-----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 1 0 6217 C ...inux/release/BlackScholes 253MiB |
| 0 2 0 6223 C ...inux/release/BlackScholes 253MiB |
+-----------------------------------------------------------------------------+

对于监视MIG设备的MIG可用GPU(如A100),包括GPU指标(包括利用率和其他性能指标)的归因,建议使用NVIDIA DCGM v2.0.13或更高版本。有关入门详细信息,请参阅DCGM用户指南中的性能指标部分。

9.5.2 计算实例

如前文所述,通过使用计算实例(CIs),可以实现更高级别的并发性。以下示例展示了如何在同一GI上运行3个CUDA进程(BlackScholes CUDA示例)。首先,列出使用我们之前配置的在A100上创建2个GI的可用CI配置文件。

$ sudo nvidia-smi mig -lcip -gi 1
+--------------------------------------------------------------------------------------+
| Compute instance profiles: |
| GPU GPU Name Profile Instances Exclusive Shared |
| Instance ID Free/Total SM DEC ENC OFA |
| ID CE JPEG |
|======================================================================================|
| 0 1 MIG 1c.3g.20gb 0 0/3 14 2 0 0 |
| 3 0 |
+--------------------------------------------------------------------------------------+
| 0 1 MIG 2c.3g.20gb 1 0/1 28 2 0 0 |
| 3 0 |
+--------------------------------------------------------------------------------------+
| 0 1 MIG 3g.20gb 2* 0/1 42 2 0 0 |
| 3 0 |
+--------------------------------------------------------------------------------------+

在第一个GI上创建3个类型为1c计算容量(配置文件ID 0)的CI。

$ sudo nvidia-smi mig -cci 0,0,0 -gi 1
Successfully created compute instance on GPU 0 GPU instance ID 1 using profile MIG
1c.3g.20gb (ID 0)
Successfully created compute instance on GPU 0 GPU instance ID 1 using profile MIG
1c.3g.20gb (ID 0)
Successfully created compute instance on GPU 0 GPU instance ID 1 using profile MIG
1c.3g.20gb (ID 0)

使用nvidia-smi,在GI 1上现在创建了以下CI。

$ sudo nvidia-smi mig -lci -gi 1
+-------------------------------------------------------+
| Compute instances: |
| GPU GPU Name Profile Instance |
| Instance ID ID |
| ID |
|=======================================================|
| 0 1 MIG 1c.3g.20gb 0 0 |
+-------------------------------------------------------+
| 0 1 MIG 1c.3g.20gb 0 1 |
+-------------------------------------------------------+
| 0 1 MIG 1c.3g.20gb 0 2 |
+-------------------------------------------------------+

驱动程序现在枚举了在A100上创建的GI和CI。

$ nvidia-smi
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 0 1 0 0 | 11MiB / 20224MiB | 14 0 | 3 0 2 0 0 |
+------------------+ +-----------+-----------------------+
| 0 1 1 1 | | 14 0 | 3 0 2 0 0 |
+------------------+ +-----------+-----------------------+
| 0 1 2 2 | | 14 0 | 3 0 2 0 0 |
+------------------+----------------------+-----------+-----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+

现在,可以创建并并行运行三个BlackScholes应用程序:

$ CUDA_VISIBLE_DEVICES=MIG-c7384736-a75d-5afc-978f-d2f1294409fd ./BlackScholes &
$ CUDA_VISIBLE_DEVICES=MIG-c376546e-7559-5610-9721-124e8dbb1bc8 ./BlackScholes &
$ CUDA_VISIBLE_DEVICES=MIG-928edfb0-898f-53bd-bf24-c7e5d08a6852 ./BlackScholes &

并且可以使用nvidia-smi查看这三个CI上正在运行的进程。

$ nvidia-smi
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 0 1 0 0 | 476MiB / 20224MiB | 14 0 | 3 0 2 0 0 |
+------------------+ +-----------+-----------------------+
| 0 1 1 1 | | 14 0 | 3 0 2 0 0 |
+------------------+ +-----------+-----------------------+
| 0 1 2 2 | | 14 0 | 3 0 2 0 0 |
+------------------+----------------------+-----------+-----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 1 0 59785 C ./BlackScholes 153MiB |
| 0 1 1 59796 C ./BlackScholes 153MiB |
| 0 1 2 59885 C ./BlackScholes 153MiB |
+-----------------------------------------------------------------------------+

9.6 销毁GPU实例

一旦GPU处于MIG模式,就可以动态配置GIs和CIs。以下示例展示了如何销毁先前示例中创建的CIs和GIs。

注意: 如果意图是销毁所有的CIs和GIs,那么可以使用以下命令完成:

$ sudo nvidia-smi mig -dci && sudo nvidia-smi mig -dgi
Successfully destroyed compute instance ID 0 from GPU 0 GPU instance ID 1
Successfully destroyed compute instance ID 1 from GPU 0 GPU instance ID 1
Successfully destroyed compute instance ID 2 from GPU 0 GPU instance ID 1
Successfully destroyed GPU instance ID 1 from GPU 0
Successfully destroyed GPU instance ID 2 from GPU 0

在这个示例中,我们删除了在GI 1下创建的特定CIs。

$ sudo nvidia-smi mig -dci -ci 0,1,2 -gi 1
Successfully destroyed compute instance ID 0 from GPU 0 GPU instance ID 1
Successfully destroyed compute instance ID 1 from GPU 0 GPU instance ID 1
Successfully destroyed compute instance ID 2 from GPU 0 GPU instance ID 1

可以验证CI设备现在已经在GPU上被销毁:

$ nvidia-smi
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| No MIG devices found |
+-----------------------------------------------------------------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+

现在必须删除GIs:

$ sudo nvidia-smi mig -dgi
Successfully destroyed GPU instance ID 1 from GPU 0
Successfully destroyed GPU instance ID 2 from GPU 0

9.7 监控MIG设备

对于监视包括GPU指标(如利用率和其他性能指标)的MIG设备,建议使用NVIDIA DCGM v3或更高版本。有关入门详细信息,请参阅DCGM用户指南中的性能指标部分。

注意: 在Ampere安培GPU(如A100或A30)上,NVML(和nvidia-smi)不支持将利用率指标归因于MIG设备。从前面的示例中,运行CUDA程序时,利用率显示为N/A:

$ nvidia-smi
+-----------------------------------------------------------------------------
+
| MIG devices:
|
+------------------+----------------------+-----------+-----------------------
+
| GPU GI CI MIG | Memory-Usage | Vol| Shared
|
| ID ID Dev | BAR1-Usage | SM Unc| CE ENC DEC OFA
JPG|
| | ECC|
|
|==================+======================+===========
+=======================|
| 0 1 0 0 | 268MiB / 20096MiB | 42 0 | 3 0 2 0 0
|
| | 4MiB / 32767MiB | |
|
+------------------+----------------------+-----------+-----------------------
+
| 0 2 0 1 | 268MiB / 20096MiB | 42 0 | 3 0 2 0 0
|
| | 4MiB / 32767MiB | |
|
+------------------+----------------------+-----------+-----------------------
+
+-----------------------------------------------------------------------------
+
| Processes:
|
| GPU GI CI PID Type Process name GPU Memory
|
| ID ID Usage
|
|
=============================================================================|
| 0 1 0 6217 C ...inux/release/BlackScholes 253MiB
|
| 0 2 0 6223 C ...inux/release/BlackScholes 253MiB
|
+-----------------------------------------------------------------------------

9.8 MIG与CUDA MPS

正如在CUDA并发机制部分所述,CUDA多进程服务(MPS)使协作多进程CUDA应用程序能够在GPU上并发处理。MPS和MIG可以共同工作,潜在地为某些工作负载实现更高水平的利用率。请参考MPS文档以了解MPS的架构和配置顺序。在接下来的部分中,我们将介绍在MIG设备上运行MPS的示例。

工作流程总结如下

  • 配置GPU上所需的MIG几何结构。
  • 设置CUDA_MPS_PIPE_DIRECTORY变量,指向唯一目录,以便多个MPS服务器和客户端可以使用命名管道和Unix域套接字相互通信。
  • 通过指定MIG设备使用CUDA_VISIBLE_DEVICES启动应用程序。

注意:MPS文档建议设置EXCLUSIVE_PROCESS模式,以确保单个MPS服务器正在使用GPU。然而,当GPU处于MIG模式时,此模式不受支持,因为我们使用多个MPS服务器(每个MIG GPU实例一个)。

配置GPU实例

按照前面部分中概述的步骤配置GPU上所需的MIG几何结构。对于本示例,我们将GPU配置为3g.20gb,3g.2gb几何结构:

$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.73.01 Driver Version: 460.73.01 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 A100-PCIE-40GB On | 00000000:65:00.0 Off | On |
| N/A 37C P0 66W / 250W | 581MiB / 40536MiB | N/A Default |
| | | Enabled |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | BAR1-Usage | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 0 1 0 0 | 290MiB / 20096MiB | 42 0 | 3 0 2 0 0 |
| | 8MiB / 32767MiB | | |
+------------------+----------------------+-----------+-----------------------+
| 0 2 0 1 | 290MiB / 20096MiB | 42 0 | 3 0 2 0 0 |
| | 8MiB / 32767MiB | | |
+------------------+----------------------+-----------+-----------------------+

设置MPS控制守护进程(Setup the MPS Control Daemons)
在此步骤中,我们启动一个MPS控制守护进程(具有管理员权限),并确保为每个守护进程使用不同的套接字:

export CUDA_MPS_PIPE_DIRECTORY=/tmp/<MIG_UUID>
mkdir -p $CUDA_MPS_PIPE_DIRECTORY
CUDA_VISIBLE_DEVICES=<MIG_UUID> \
CUDA_MPS_PIPE_DIRECTORY=/tmp/<MIG_UUID> \
nvidia-cuda-mps-control -d

启动应用程序(Launch the Application)
现在,我们可以通过使用CUDA_VISIBLE_DEVICES指定所需的MIG设备来启动应用程序:

CUDA_VISIBLE_DEVICES=<MIG_UUID> \
my-cuda-app

完整示例(A Complete Example)
我们现在提供一个脚本,在该脚本中,我们尝试在GPU上创建的两个MIG设备上运行之前的BlackScholes:

#!/usr/bin/env bash
set -euo pipefail
#GPU 0: A100-PCIE-40GB (UUID: GPU-63feeb45-94c6-b9cb-78ea-98e9b7a5be6b)
# MIG 3g.20gb Device 0: (UUID: MIG-GPU-63feeb45-94c6-b9cb-78ea-98e9b7a5be6b/1/0)
# MIG 3g.20gb Device 1: (UUID: MIG-GPU-63feeb45-94c6-b9cb-78ea-98e9b7a5be6b/2/0)
GPU_UUID=GPU-63feeb45-94c6-b9cb-78ea-98e9b7a5be6b
for i in MIG-$GPU_UUID/1/0 MIG-$GPU_UUID/2/0; do
# set the environment variable on each MPS
# control daemon and use different socket for each MIG instance
export CUDA_MPS_PIPE_DIRECTORY=/tmp/$i
mkdir -p $CUDA_MPS_PIPE_DIRECTORY
sudo CUDA_VISIBLE_DEVICES=$i \
CUDA_MPS_PIPE_DIRECTORY=/tmp/$i \
nvidia-cuda-mps-control -d
# now launch the job on the specific MIG device
# and select the appropriate MPS server on the device
CUDA_MPS_PIPE_DIRECTORY=/tmp/$i \
CUDA_VISIBLE_DEVICES=$i \
./bin/BlackScholes &
done

运行此脚本时,我们可以观察到每个MIG设备上的两个MPS服务器,以及使用nvidia-smi时作为MPS客户端启动的相应CUDA程序:

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 1 0 46781 M+C ./bin/BlackScholes 251MiB |
| 0 1 0 46784 C nvidia-cuda-mps-server 29MiB |
| 0 2 0 46797 M+C ./bin/BlackScholes 251MiB |
| 0 2 0 46798 C nvidia-cuda-mps-server 29MiB |
+-----------------------------------------------------------------------------+

9.9 以容器形式运行CUDA应用程序

NVIDIA容器工具包已增强以支持MIG设备,允许用户使用Docker等运行时运行GPU容器。本节提供了在A100上使用MIG运行Docker容器的概述。

9.9.1 安装Docker

许多Linux发行版可能会预装Docker-CE。如果没有,请使用Docker安装脚本安装Docker。

$ curl https://get.docker | sh \
&& sudo systemctl start docker \
&& sudo systemctl enable docker

9.9.2 安装NVIDIA容器工具包

现在安装NVIDIA容器工具包(以前称为nvidia-docker2)。MIG支持从nvidia-docker2的v2.3版本(或nvidia-container-toolkit包的v1.1.1版本)开始提供。为了访问/dev/nvidia功能,建议至少使用nvidia-docker2的v2.5.0版本。有关更多信息,请参阅安装指南NVIDIA Container Toolkit安装配置指南-CSDN博客。为简洁起见,这里提供的安装说明适用于Ubuntu 18.04 LTS。有关其他Linux发行版的说明,请参考NVIDIA容器工具包页面。

设置软件源和GPG密钥:

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor
-o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidiacontainer.
list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkitkeyring.
gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

安装NVIDIA容器工具包包(及其依赖项):

$ sudo apt-get install -y nvidia-docker2 \
&& sudo systemctl restart docker

9.9.3 运行容器

要在特定的MIG设备上运行容器——无论这些设备是GIs还是特定的底层CIs,都可以使用NVIDIA_VISIBLE_DEVICES变量(或在Docker 19.03+中使用--gpus选项)。

NVIDIA_VISIBLE_DEVICES支持以下格式来指定MIG设备:

  1. 当使用R450和R460驱动时,格式为MIG-<GPU-UUID>/<GPU实例ID>/<计算实例ID;从R470驱动开始,格式为MIG-<UUID>。
  2. GPUDeviceIndex>:<MIGDeviceIndex>

如果使用Docker 19.03,可以使用--gpus选项通过以下格式指定MIG设备:‘“device=MIG-device”’,其中MIG-device可以遵循上述NVIDIA_VISIBLE_DEVICES指定的任一格式。

以下示例展示了在CUDA容器内使用这两种格式运行nvidia-smi。正如示例所示,当使用任一格式时,容器中仅可见所选择的一个MIG设备。

$ sudo docker run --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES=MIG-c7384736-a75d-5afc-978f-d2f1294409fd \
nvidia/cuda nvidia-smi
+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 0 1 0 0 | 11MiB / 20224MiB | 42 0 | 3 0 2 0 0 |
+------------------+----------------------+-----------+-----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
# For Docker versions < 19.03
$ sudo docker run --runtime=nvidia \
-e NVIDIA_VISIBLE_DEVICES="0:0" \
nvidia/cuda nvidia-smi -L
GPU 0: A100-SXM4-40GB (UUID: GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0)
MIG 3g.20gb Device 0: (UUID: MIG-c7384736-a75d-5afc-978f-d2f1294409fd)
# For Docker versions >= 19.03
$ sudo docker run --gpus '"device=0:0"' \
nvidia/cuda nvidia-smi -L
GPU 0: A100-SXM4-40GB (UUID: GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0)
MIG 3g.20gb Device 0: (UUID: MIG-c7384736-a75d-5afc-978f-d2f1294409fd)

 一个更复杂的示例是运行一个TensorFlow容器,以使用GPU在MNIST数据集上进行训练。如下所示:

$ sudo docker run --gpus '"device=0:1"' \
nvcr.io/nvidia/pytorch:20.11-py3 \
/bin/bash -c 'cd /opt/pytorch/examples/upstream/mnist && python main.py'
=============
== PyTorch ==
=============
NVIDIA Release 20.11 (build 17345815)
PyTorch Version 1.8.0a0+17f8c32
Container image Copyright (c) 2020, NVIDIA CORPORATION. All rights reserved.
Copyright (c) 2014-2020 Facebook Inc.
Copyright (c) 2011-2014 Idiap Research Institute (Ronan Collobert)
Copyright (c) 2012-2014 Deepmind Technologies (Koray Kavukcuoglu)
Copyright (c) 2011-2012 NEC Laboratories America (Koray Kavukcuoglu)
Copyright (c) 2011-2013 NYU (Clement Farabet)
Copyright (c) 2006-2010 NEC Laboratories America (Ronan Collobert, Leon Bottou, Iain
Melvin, Jason Weston)
Copyright (c) 2006 Idiap Research Institute (Samy Bengio)
Copyright (c) 2001-2004 Idiap Research Institute (Ronan Collobert, Samy Bengio,
Johnny Mariethoz)
Copyright (c) 2015 Google Inc.
Copyright (c) 2015 Yangqing Jia
Copyright (c) 2013-2016 The Caffe contributors
All rights reserved.
NVIDIA Deep Learning Profiler (dlprof) Copyright (c) 2020, NVIDIA CORPORATION. All
rights reserved.
Various files include modifications (c) NVIDIA CORPORATION. All rights reserved.
NVIDIA modifications are covered by the license terms that apply to the underlying
project or file.
NOTE: Legacy NVIDIA Driver detected. Compatibility mode ENABLED.
9920512it [00:01, 7880654.53it/s]
32768it [00:00, 129950.31it/s]
1654784it [00:00, 2353765.88it/s]
8192it [00:00, 41020.33it/s]
/opt/conda/lib/python3.6/site-packages/torchvision/datasets/mnist.py:480:
UserWarning: The given NumPy array is not writeable, and PyTorch does not support
non-writeable tensors. This means you can write to the underlying (supposedly
non-writeable) NumPy array using the tensor. You may want to copy the array to
protect its data or make it writeable before converting it to a tensor. This type
of warning will be suppressed for the rest of this program. (Triggered internally
at ../torch/csrc/utils/tensor_numpy.cpp:141.)
return torch.from_numpy(parsed.astype(m[2], copy=False)).view(*s)
Downloading http://yann.lecun/exdb/mnist/train-images-idx3-ubyte.gz to ../data/
MNIST/raw/train-images-idx3-ubyte.gz
Extracting ../data/MNIST/raw/train-images-idx3-ubyte.gz to ../data/MNIST/raw
Downloading http://yann.lecun/exdb/mnist/train-labels-idx1-ubyte.gz to ../data/
MNIST/raw/train-labels-idx1-ubyte.gz
Extracting ../data/MNIST/raw/train-labels-idx1-ubyte.gz to ../data/MNIST/raw
Downloading http://yann.lecun/exdb/mnist/t10k-images-idx3-ubyte.gz to ../data/
MNIST/raw/t10k-images-idx3-ubyte.gz
Extracting ../data/MNIST/raw/t10k-images-idx3-ubyte.gz to ../data/MNIST/raw
Downloading http://yann.lecun/exdb/mnist/t10k-labels-idx1-ubyte.gz to ../data/
MNIST/raw/t10k-labels-idx1-ubyte.gz
Extracting ../data/MNIST/raw/t10k-labels-idx1-ubyte.gz to ../data/MNIST/raw
Processing...
Done!
Train Epoch: 1 [0/60000 (0%)] Loss: 2.320747
Train Epoch: 1 [640/60000 (1%)] Loss: 1.278727

9.10 MIG与Kubernetes

Kubernetes中的MIG支持从NVIDIA Device Plugin for Kubernetes的v0.7.0版本开始提供。请访问有关MIG和Kubernetes入门的文档。Kubernetes 中的 MIG 支持 — 使用 NVIDIA GPU 的 Kubernetes 1.0.0 文档

9.11 MIG与Slurm

 Slurm是一个广泛用于高性能计算中心(如政府实验室和大学)的工作负载管理器。从21.08版本开始,Slurm支持使用MIG设备。请参考官方文档以了解入门信息。Slurm Workload Manager - Generic Resource (GRES) Scheduling (schedmd)

第十章、设备节点和功能

目前,NVIDIA内核驱动程序通过一些系统范围的设备节点公开其接口。每个物理GPU都有其自己的设备节点表示,例如nvidia0、nvidia1等。以下是一个2-GPU系统的示例。

/dev
├── nvidiactl
├── nvidia-modeset
├── nvidia-uvm
├── nvidia-uvm-tools
├── nvidia-nvswitchctl
├── nvidia0
└── nvidia1

从CUDA 11/R450开始,引入了一种称为nvidia-capabilities的新抽象。其理念是,访问特定功能是通过驱动程序执行某些操作所必需的。如果用户有权访问该功能,则操作将被执行。如果用户没有访问该功能的权限,则操作将失败。唯一的例外是如果您是root用户(或具有CAP_SYS_ADMIN权限的任何用户)。拥有CAP_SYS_ADMIN权限的用户隐式地可以访问所有nvidia-capabilities。例如,mig-config功能允许在任何支持MIG的GPU(例如A100 GPU)上创建和销毁MIG实例。如果没有此功能,所有创建或销毁MIG实例的尝试将失败。同样,fabric-mgmt功能允许以非root但特权的守护进程身份运行Fabric Manager。如果没有此功能,所有以非root用户身份启动Fabric Manager的尝试将失败。

以下部分将介绍管理这些新nvidia-capabilities的系统级接口,包括授予和撤销访问权限所需的步骤。

系统级接口(System Level Interface)
有两种不同的系统级接口可用于处理nvidia-capabilities。第一种是通过/dev,第二种是通过/proc。基于/proc的接口依赖于用户权限和挂载命名空间来限制对特定功能的访问,而基于/dev的接口依赖于cgroups。从技术上讲,基于/dev的接口也依赖于用户权限作为第二级访问控制机制(在实际的设备节点文件本身上),但主要的访问控制机制是cgroups。目前的CUDA 11/R450 GA(Linux驱动450.51.06)支持这两种机制,但未来将优先使用基于/dev的接口,基于/proc的接口将被弃用。现在,用户可以通过在nvidia.ko内核模块上使用nv_cap_enable_devfs参数选择所需的接口:

  • 当nv_cap_enable_devfs=0时,启用基于/proc的接口。
  • 当nv_cap_enable_devfs=1时,启用基于/dev的接口。
  • 对于R450驱动(截至Linux 450.51.06),nv_cap_enable_devfs=0为默认设置。
  • 所有未来的NVIDIA数据中心驱动程序将默认设置为nv_cap_enable_devfs=1。

以下是设置此参数加载nvidia内核模块的示例:

$ modprobe nvidia nv_cap_enable_devfs=1

10.1 /dev基于nvidia-capabilities

与/dev基础功能进行交互的系统级接口实际上是通过/proc和/dev的组合。 首先,一个新的主设备现在与nvidia-caps相关联,并且可以从标准的/proc/devices文件中读取。

$ cat /proc/devices | grep nvidia-caps
508 nvidia-caps

其次,在/proc/driver/nvidia/capabilities下存在完全相同的文件集。 这些文件不再直接控制对功能的访问,而是这些文件的内容指向/dev下的一个设备节点,通过该节点,可以使用cgroups来控制对功能的访问。 可以在下面的示例中看到这一点:

$ cat /proc/driver/nvidia/capabilities/mig/config
DeviceFileMinor: 1
DeviceFileMode: 256
DeviceFileModify: 1

nvidia-caps的设备主要组合和此文件中的DeviceFileMinor值指示,mig-config功能(允许用户创建和销毁MIG设备)由主:次为238:1的设备节点控制。因此,为了配置MIG设备,需要使用cgroups授予进程对该设备的读取访问。此文件中的DeviceFileMode和DeviceFileModify字段的目的将在本节后面解释。 这些设备节点的标准位置是在/dev/nvidia-caps下,如下面的示例所示:

$ ls -l /dev/nvidia-caps
total 0
cr-------- 1 root root 508, 1 Nov 21 17:16 nvidia-cap1
cr--r--r-- 1 root root 508, 2 Nov 21 17:16 nvidia-cap2
...

不幸的是,NVIDIA驱动程序无法在创建/删除/proc/driver/nvidia/capabilities下的文件时自动创建/删除这些设备节点(由于GPL合规性问题)。相反,提供了一个名为nvidia-modprobe的用户级程序,可以从用户空间调用以执行此操作。例如:

$ nvidia-modprobe \
-f /proc/driver/nvidia/capabilities/mig/config \
-f /proc/driver/nvidia/capabilities/mig/monitor
$ ls -l /dev/nvidia-caps
total 0
cr-------- 1 root root 508, 1 Nov 21 17:16 nvidia-cap1
cr--r--r-- 1 root root 508, 2 Nov 21 17:16 nvidia-cap2

nvidia-modprobe查看每个功能文件中的DeviceFileMode,并使用指示的权限创建设备节点(例如,从我们的示例中的mig-config的值256(o400)创建+ur)。 诸如nvidia-smi之类的程序将自动调用nvidia-modprobe(如果可用)代表您创建这些设备节点。在其他情况下,不一定需要使用nvidia-modprobe来创建这些设备节点,但这确实简化了该过程。 如果您确实希望阻止nvidia-modprobe代表您创建特定设备节点,可以执行以下操作:

# Give a user write permissions to the capability file under /proc
$ chmod +uw /proc/driver/nvidia/capabilities/mig/config
# Update the file with a “DeviceFileModify” setting of 0
$ echo "DeviceFileModify: 0" > /proc/driver/nvidia/capabilities/mig/config

然后,您将负责管理/proc/driver/nvidia/capabilities/mig/config引用的设备节点的创建。如果将来要更改此设置,只需使用相同的命令序列将其重置为“DeviceFileModify: 1”。 在容器的上下文中,这一点非常重要,因为我们可能希望即使在/proc层次结构中不存在某种功能,也要为容器提供对某种功能的访问。

例如,授予容器mig-config功能意味着我们还应该授予它访问系统上任何GPU可能创建的所有可能gis和cis的功能。否则,一旦这些gis和cis实际创建,容器将无法与它们一起工作。

关于基于/dev的功能的最后一点需要注意的是,所有可能功能的次要编号是预先确定的,并且可以在各种形式的文件下查询:

/proc/driver/nvidia-caps/*-minors

例如,所有与MIG相关的功能可以查找为:

$ cat /proc/driver/nvidia-caps/mig-minors
config 1
monitor 2
gpu0/gi0/access 3
gpu0/gi0/ci0/access 4
gpu0/gi0/ci1/access 5
gpu0/gi0/ci2/access 6
...
gpu31/gi14/ci6/access 4321
gpu31/gi14/ci7/access 4322

内容的格式如下:GPU<deviceMinor>/gi<GPU实例ID>/ci<计算实例ID>

请注意,GPU设备次要编号可以通过以下任一机制获得:

  • NVML API nvmlDeviceGetMinorNumber(),因此返回设备次要编号
  • 或使用/proc/driver/nvidia/gpus/下可用的PCI BDF。此文件包含一个“设备次要编号”字段。

注意: NVML设备编号(例如,通过nvidia-smi)不是设备次要编号。

例如,如果MIG几何结构创建如下:

+-----------------------------------------------------------------------------+
| MIG devices: |
+------------------+----------------------+-----------+-----------------------+
| GPU GI CI MIG | Memory-Usage | Vol| Shared |
| ID ID Dev | BAR1-Usage | SM Unc| CE ENC DEC OFA JPG|
| | | ECC| |
|==================+======================+===========+=======================|
| 0 1 0 0 | 19MiB / 40192MiB | 14 0 | 3 0 3 0 3 |
| | 0MiB / 65535MiB | | |
+------------------+ +-----------+-----------------------+
| 0 1 1 1 | | 14 0 | 3 0 3 0 3 |
| | | | |
+------------------+ +-----------+-----------------------+
| 0 1 2 2 | | 14 0 | 3 0 3 0 3 |
| | | | |
+------------------+----------------------+-----------+-----------------------+

那么相应的设备节点将被创建为:/dev/nvidia-cap12、/dev/nvidia-cap13、/dev/nvidia-cap14和/dev/nvidia-cap15。

10.2 / proc 基于 nvidia-capabilities(已弃用

与基于 /proc 的 nvidia-capabilities 进行交互的系统级接口根植于 /proc/driver/nvidia/capabilities。此层次结构下的文件用于表示每个功能,读取这些文件的权限控制用户是否具有特定功能。这些文件没有内容,仅用于表示特定功能。例如,mig-config 功能(允许用户创建和销毁 MIG 设备)表示如下:

/proc/driver/nvidia/capabilities
└── mig
└── config

同样,在创建 MIG 设备后,运行工作负载所需的功能表示如下(即访问组成 MIG 设备的 GPU 实例和计算实例):

/proc/driver/nvidia/capabilities
└── gpu0
└── mig
├── gi0
│ ├── access
│ └── ci0
│ └── access
├── gi1
│ ├── access
│ └── ci0
│ └── access
└── gi2
├── access
└── ci0
└── access

相应的文件系统布局如下所示,具有读取权限:

$ ls -l /proc/driver/nvidia/capabilities/gpu0/mig/gi*
/proc/driver/nvidia/capabilities/gpu0/mig/gi1:
total 0
-r--r--r-- 1 root root 0 May 24 17:38 access
dr-xr-xr-x 2 root root 0 May 24 17:38 ci0
/proc/driver/nvidia/capabilities/gpu0/mig/gi2:
total 0
-r--r--r-- 1 root root 0 May 24 17:38 access
dr-xr-xr-x 2 root root 0 May 24 17:38 ci0

为了使 CUDA 进程能够在 MIG 上运行,它需要访问计算实例功能及其父 GPU 实例。因此,MIG 设备由以下格式标识:

MIG-<GPU-UUID>/<GPU instance ID>/<compute instance ID>

例如,拥有对以下路径的读取权限将允许在表示 <gpu0, gi0, ci0> 的 MIG 设备上运行工作负载:

/proc/driver/nvidia/capabilities/gpu0/mig/gi0/access
/proc/driver/nvidia/capabilities/gpu0/mig/gi0/ci0/access

请注意,没有表示在 gpu0 上运行工作负载的功能的访问文件(仅在位于 gpu0 下的 gi0 和 ci0 上)。这是因为仍然需要使用 cgroups 来控制对顶级 GPU 设备(以及任何所需的元设备)的访问。如前文所示,cgroups 机制适用于:

/dev/nvidia0
/dev/nvidiactl
/dev/nvidiactl-uvm
...

在容器的上下文中,应在 /proc/driver/nvidia/capabilities 的路径上覆盖一个新的挂载命名空间,并且仅应将用户希望授予容器的那些功能进行绑定挂载。由于主机的用户/组信息在绑定挂载中被保留,因此在将这些功能注入容器之前,必须确保在主机上为这些功能设置正确的用户权限。

 第十一章、变更日志

‣ 2022年11月17日(作者:PR):包括以下更改: ‣ 更新了Hopper、CUDA 12.0/R525 ‣ 重新组织了几个章节 ‣ 增加了有关基于/dev的功能的更多信息

‣ 2022年7月19日(作者:PR):包括以下更改: ‣ 添加了一个关于虚拟化的章节。

‣ 2022年6月6日(作者:PR):包括以下更改: ‣ 修复了列出A30配置文件的表格。 ‣ 更新了Slurm文档链接。

‣ 2021年8月26日(作者:PR):包括以下更改: ‣ 改进了GPU分区的解释。

‣ 2021年6月30日(作者:PR):包括以下更改: ‣ 添加了有关MIG设备唯一UUID的信息。 ‣ 更新了支持的配置文件。

‣ 2021年4月22日(作者:PR):包括以下更改: ‣ 添加了有关Slurm和CUDA MPS的信息。

‣ 2021年4月14日(作者:PR):包括以下更改: ‣ 添加了额外支持的产品。 ‣ 更新了图表。 ‣ 添加了vGPU文档链接。

‣ 2021年2月17日(作者:PR):包括以下更改: ‣ 添加了有关MIG设备持久性的说明。 ‣ 添加了收集MIG遥测的链接。 ‣ 添加了K8s文档链接。

‣ 2020年11月24日(作者:PR):包括以下更改: ‣ 修复了损坏的容器示例。 ‣ 添加了Kubernetes文档链接。 ‣ 添加了最低所需软件版本。 ‣ 添加了在DGX A100上启用MIG模式的示例。

‣ 2020年11月6日(作者:PR):包括以下更改: ‣ 更新了示例。 ‣ 添加了新CLI选项的文档。 ‣ 添加了vGPU的文档链接。 ‣ 添加了Kubernetes支持的文档链接。 ‣ 修复了拼写错误。

‣ 2020年8月7日(作者:PR): ‣ 添加了关于设备节点和nvidia-capabilities与CUDA 11.0 GA的信息。

‣ 2020年5月28日(作者:PR): ‣ 初始版本。

本文标签: 中文实例用户指南GPUMIG