NVIDIA 多实例 GPU 用户指南



本版用户指南介绍了多实例 GPU 功能 NVIDIA® Ampere 架构。


介绍



新的多实例 GPU (MIG) 功能允许基于 NVIDIA Ampere 的 GPU 架构(例如 NVIDIA A100)被安全地划分为多达七个 为 CUDA 应用程序提供单独的 GPU 实例,为多个用户提供单独的 GPU 资源用于优化 GPU 利用率。 此功能特别有利于 未完全饱和 GPU 计算能力的工作负载,因此用户可能希望 并行运行不同的工作负载以最大限度地提高利用率。

对于拥有多租户用例的云服务提供商 (CSP),MIG 可确保一个客户端 除了为客户提供增强的隔离之外,不会影响其他客户的工作或日程安排。

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

使用 MIG,用户将能够在他们的新虚拟 GPU 实例上查看和安排作业,因为 如果它们是物理 GPU。 MIG 适用于 Linux 操作系统,支持使用 Docker 引擎的容器, 支持 Kubernetes 和使用虚拟机管理程序的虚拟机,例如 Red Hat Virtualization 和 VMware vSphere。



  • 裸机,包括容器
  • 在受支持的管理程序之上对 Linux 来宾进行 GPU 直通虚拟化
  • 支持的虚拟机管理程序之上的 vGPU



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



图 1. MIG 概述
 



多块gpu如何合并到一块 gpu有两个怎么利用_运维


 

本文档的目的是介绍 MIG 背后的概念、部署注意事项和 提供 MIG 管理示例,以演示用户如何在 MIG 支持的 GPU 上运行 CUDA 应用程序。


支持的 GPU


对于 NVIDIA Ampere 架构一代,基于 GA100 微架构的 GPU 支持 MIG(即 具有计算能力 8.0 的 GPU)。 下表提供了支持的 GPU 列表:

表 1. 支持的 GPU 产品

产品 建筑学 微架构 计算能力 内存大小 最大实例数 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

此外,包含上述受支持产品(例如 DGX A100、DGX Station A100)的系统支持 MIG 和 HGX A100。


支持的配置


  • 裸机,包括 容器 Kubernetes 
  • 在受支持的管理程序之上对 Linux 来宾进行 GPU 直通虚拟化
  • 支持的虚拟机管理程序之上的 vGPU


虚拟化


  • 在受支持的虚拟机管理程序上的 Linux 来宾下,当 MIG 支持的 GPU 运行时 在 GPU 直通中,相同 工作流程 、工具 和 配置文件 可用 在裸机上可以使用。
  • MIG 允许多个 vGPU(以及虚拟机)在单个虚拟机上并行运行 支持 MIG 的 GPU,同时保留 vGPU 提供的隔离保证。 要配置 GPU 以与 vGPU VM 一起使用,请参阅 章节 vGPU 软件用户 指导。 另请参阅 技术简介 


概念


术语


本节介绍一些用于描述 MIG 背后概念的术语。


流式多处理器

流式多处理器 (SM) 在 GPU 上执行计算指令。


GPU 上下文


  • 误隔离
  • 单独安排
  • 不同的地址空间


GPU引擎

GPU 引擎是在 GPU 上执行工作的引擎。 最常用的发动机是 执行计算指令的计算/图形引擎。 其他引擎包括 负责执行 DMA 的复制引擎 (CE)、用于视频解码的 NVDEC、NVENC 用于编码等。每个引擎可以独立调度并执行不同的工作 GPU 上下文。


GPU 内存片

GPU 内存片是 GA100 GPU 内存的最小部分,包括 相应的内存控制器和缓存。 GPU 内存片大约是 总 GPU 内存资源,包括容量和带宽。


GPU SM 切片

GPU SM 切片是 GA100 GPU 上 SM 的最小部分。 GPU SM 切片是 在 MIG 模式下配置时,大约是 A100 中可用的 SM 总数的七分之一。


GPU 切片

GPU 切片是 GA100 GPU 中结合单个 GPU 内存切片的最小部分 和单个 GPU SM 切片。


GPU 实例

GPU 实例 (GI) 是 GPU 切片和 GPU 引擎(DMA、NVDEC 等)的组合。 GPU 实例中的任何内容始终共享所有 GPU 内存片和其他 GPU 引擎, 但它的 SM 切片可以进一步细分为计算实例 (CI)。 GPU 实例提供 内存服务质量。 每个 GPU 切片都包含专用的 GPU 内存资源,这限制了可用的 容量和带宽,并提供内存QoS。 每个 GPU 内存片获得总 GPU 的 1/8 内存资源,每个 GPU SM slice 获得 SM 总数的 1/7。


计算实例

一个 GPU 实例可以细分为多个计算实例。 计算实例 (CI) 包含 父 GPU 实例的 SM 切片和其他 GPU 引擎(DMA、NVDEC 等)的子集。 CI 共享内存和引擎。


分区


使用上面介绍的概念,本节概述了用户如何可以 在 GPU 上创建各种分区。 为便于说明,本文档将使用 以 A100-40GB 为例,但其他支持 MIG 的 GPU 的过程类似。


GPU 实例

GPU的分区是使用内存片进行的,所以可以认为A100-40GB GPU 具有 8x5GB 内存片和 7 个 SM 片,如下图所示。


图 2. A100 上的可用切片

多块gpu如何合并到一块 gpu有两个怎么利用_运维_02


1g.5gb GI简介:


图 3. 组合内存和计算切片


多块gpu如何合并到一块 gpu有两个怎么利用_docker_03


类似地,4x5GB 内存片可以与 4x1 计算片组合以创建 4g.5gb GI简介:


图 4. 结合内存和计算切片


多块gpu如何合并到一块 gpu有两个怎么利用_docker_04


计算实例

一个 GPU Instance 的计算切片可以进一步细分为多个 计算实例 (CI),其中 CI 共享父 GI 的引擎和内存, 但是每个 CI 都有专用的 SM 资源。

使用相同的 4g.20gb 上面的示例,可以创建一个 CI 以仅使用第一个 计算切片如下所示:


图 5. 组合内存和计算切片


多块gpu如何合并到一块 gpu有两个怎么利用_docker_05


在这种情况下,可以通过选择任何计算切片来创建 4 个不同的 CI。 两个计算 切片也可以组合在一起创建一个 2c.4g.20gb 轮廓:


图 6. 组合内存和计算切片


多块gpu如何合并到一块 gpu有两个怎么利用_容器_06


在本例中,也可以组合 3 个计算切片来创建一个 3c.4g.20gb 轮廓 或所有 4 个可以组合以创建一个 4c.4g.20gb 轮廓。 当所有 4 计算切片组合在一起,配置文件简称为 4g.20gb 轮廓。

请参阅有关 规范命名方案 和 。 CUDA 设备 术语


配置文件放置

可以创建 GI 的切片数量不是任意的。 NVIDIA 驱动程序 API 提供了许多“GPU Instance Profiles”,用户可以通过指定创建 GI 这些配置文件之一。

在给定的 GPU 上,可以从这些配置文件的混合和匹配中创建多个 GI,只要 因为有足够的切片可以满足请求。


下表显示了 A100-SXM4-40GB 产品上的配置文件名称。 对于 A100-SXM4-80GB, 配置文件名称将根据内存比例而变化 - 例如, 1g.10gb , 2g.20gb , 3g.40gb , 4g.40gb , 7g.80gb 分别。

有关 A100 和 A30 上所有支持的配置文件组合的列表,请参阅 支持的配置文件 


表 2. A100 上的 GPU 实例配置文件


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

图 7. A100 上的 MIG 配置文件

多块gpu如何合并到一块 gpu有两个怎么利用_配置文件_07

 


在此图中,可以从左侧的实例配置文件开始构建有效的组合,然后 向右移动时将其与其他实例配置文件结合起来,这样没有两个配置文件垂直重叠。 此规则的唯一例外是(4 内存,4 计算)和(4 内存,3 计算)配置文件的组合, 目前不支持。 但是,再次组合(4 内存,3 计算)和(4 内存,3 计算) 支持。 有关 A100 和 A30 上所有支持的配置文件组合和放置的列表,请参阅关于 支持的配置文件 


图 8. A100 上的配置文件放置

多块gpu如何合并到一块 gpu有两个怎么利用_多块gpu如何合并到一块_08

 

请注意,该图表示 GPU 实例一旦存在就会存在的物理布局 在 GPU 上实例化。 由于 GPU 实例在不同位置创建和销毁, 可能会发生碎片,并且一个 GPU 实例的物理位置会影响其他 GPU Instances 可以在它旁边实例化。


CUDA 并发机制


MIG 被设计成对 CUDA 应用程序在很大程度上是透明的——因此 CUDA 编程模型保持不变,以最大限度地减少编程工作量。 CUDA 已经 公开了在 GPU 上并行运行工作的多种技术,值得 展示这些技术与 MIG 的比较。 请注意,流和 MPS 是 CUDA 编程模型,因此在与 GPU 实例一起使用时可以工作。

CUDA Streams 是一种 CUDA 编程模型功能,在 CUDA 应用程序中,不同的 工作可以提交到独立的队列并由 GPU 独立处理。 CUDA 流只能在单个进程中使用,并且不提供太多隔离 - 地址空间共享、SM 共享、GPU 内存带宽、缓存和容量 是共享的。 最后,任何错误都会影响所有流和整个过程。

MPS 是 CUDA 多进程服务。 它允许协作的多进程应用程序共享 GPU 上的计算资源。 合作的 MPI 作业通常使用它,但它也被 用于在不相关的应用程序之间共享 GPU 资源,同时接受挑战 这样的解决方案带来了。 MPS 目前不提供客户端之间的错误隔离,而 每个 MPS 客户端使用的流式多处理器可以选择限制为所有 SM 的百分比, 调度硬件仍然是共享的。 内存带宽、缓存和容量都是共享的 MPS 客户端之间。

最后,MIG 是 NVIDIA A100 提供的新并发形式,同时解决了一些 其他 CUDA 技术对运行并行工作的限制。


表 3. CUDA 并发机制


部署注意事项


从 CUDA 11.0 / R450 版本开始,MIG 功能作为 NVIDIA GPU 驱动程序的一部分提供。


系统注意事项


当 GPU 处于 MIG 模式时,以下系统注意事项与 NVIDIA A100 相关。



  • 仅受 CUDA 11/R450 或更高版本支持的 Linux 操作系统发行版支持 MIG。 也推荐 至少使用 使用 NVIDIA Datacenter Linux 驱动程序 450.80.02 或更高版本。 可以使用 .run 安装此驱动程序 安装程序包 或 通过使用 cuda-drivers-450 的元包 网络存储库 
    还要注意设备节点和 nvidia-capabilities 用于暴露 MIG 设备。 这 /proc 机制 自 450.51.06 起,系统级接口已弃用,建议使用 /dev 基于系统级接口 用于通过 cgroups 控制 MIG 设备的访问机制。 此功能从 450.80.02+ 开始可用 司机。
  • 裸机,包括容器
  • 在受支持的管理程序之上对 Linux 来宾进行 GPU 直通虚拟化
  • 支持的虚拟机管理程序之上的 vGPU

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

  • 在 A100 上设置 MIG 模式需要 GPU 重置和超级用户权限。 一旦 A100 处于 MIG 模式,实例管理就是动态的(即不需要 GPU 重置)。 笔记 该设置是基于每个 GPU 的。
  • 与 ECC 模式类似,MIG 模式设置在重新启动后保持不变,直到用户明确切换设置
  • 在启用 MIG 之前,需要停止所有持有驱动程序模块句柄的守护程序。
  • 对于可能正在运行系统健康监控服务的 DGX 等系统而言,情况确实如此 比如 nvsm  或 GPU 运行状况监控或遥测服务,例如 直流通用 
  • 切换 MIG 模式需要 CAP_SYS_ADMIN 能力。 其他 MIG 管理,例如创建和销毁实例, 默认情况下需要超级用户,但可以通过调整 MIG 功能的权限来委派给非特权用户 在 /proc/ .


应用注意事项


当 A100 处于 MIG 模式时,用户应注意以下注意事项:



  • 不支持图形 API(例如 OpenGL、Vulkan 等)
  • 不支持 GPU 到 GPU P2P(PCIe 或 NVLink)
  • CUDA 应用程序将计算实例及其父 GPU 实例视为单个 CUDA 设备。 请参阅 本 节有关 CUDA 的设备枚举
  • 不支持跨 GPU 实例的 CUDA IPC。 支持跨计算实例的 CUDA IPC
  • CUDA 调试(例如使用 cuda-gdb)和内存/竞争检查 (例如使用 cuda-memcheck 或 compute-sanitizer)受支持
  • 在 MIG 之上支持 CUDA MPS。 唯一的限制是客户端的最大数量(48)是 与计算实例大小成比例降低
  • 从 GPU 实例使用时支持 GPUDirect RDMA


MIG 设备名称


默认情况下,MIG 设备由一个“GPU Instance”和一个“Compute Instance”组成。 下表突出显示了通过其 GPU 实例引用 MIG 设备的命名约定 计算切片计数及其以 GB 为单位的总内存(而不仅仅是其内存切片计数)。

当只创建一个 CI(消耗 GI 的全部计算能力)时, 那么设备名称中隐含了 CI 大小。

图 9. MIG 设备名称


多块gpu如何合并到一块 gpu有两个怎么利用_多块gpu如何合并到一块_09


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


表 4. 使用单个 CI 时的设备名称


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


表 5. 使用多个 CI 时的设备名称


支持的 MIG 配置文件


本节概述了支持的配置文件以及 MIG 配置文件的可能位置 支持的 GPU。


A30 MIG 型材


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

图 10. A30 上的配置文件


多块gpu如何合并到一块 gpu有两个怎么利用_docker_10

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

表 6. A30 上的 GPU 实例配置文件

个人资料名称

记忆分数

部分 SM

硬件单元

L2 缓存大小

可用实例数

MIG 1g.6gb

1/4

1/4

0 NVDECs /0 JPEG /0 OFA

1/4

4

MIG 1g.6gb+me

1/4

1/4

1 NVDEC /1 JPEG /1 OFA

1/4

1 (A single 1g profile can include media extensions)

MIG 2g.12gb

2/4

2/4

2 NVDECs /0 JPEG /0 OFA

2/4

2

MIG 4g.24gb

Full

4/4

4 NVDECs /1 JPEG /1 OFA

Full

1

这 1g.6gb+me 概况 仅从 R470 驱动程序开始可用。


A100 MIG 配置文件


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

图 11. A100 上的配置文件

多块gpu如何合并到一块 gpu有两个怎么利用_多块gpu如何合并到一块_11

下表显示了 A100-SXM4-40GB 产品上支持的配置文件。 对于 A100-SXM4-80GB, 配置文件名称将根据内存比例而变化 - 例如, 1g.10gb , 2g.20gb , 3g.40gb , 4g.40gb , 7g.80gb 分别。


表 7. A100 上的 GPU 实例配置文件


这 1g.5gb+me 概况 仅从 R470 驱动程序开始可用。


开始使用 MIG


先决条件


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


  • MIG 仅在 此处 
  • CUDA 11 和 NVIDIA 驱动程序 450.80.02 或更高版本
  • CUDA 11 支持的 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 的信息,请参阅 NVML 标头 ( nvml.11.0.h ) 包含在 CUDA 11 中。 有关配置 MIG 的自动化工具支持,请参阅 MIG NVIDIA 分区 编辑 器(或 mig-parted ) 工具 


启用 ME 模式


默认情况下,NVIDIA A100 未启用 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 GPU 索引、PCI 总线 ID 或 UUID。 如果未指定 GPU ID,则 MIG 模式将应用于系统上的所有 GPU。 请注意,MIG 模式( Disabled 或者 Enabled 状态)在系统重新启动后保持不变。

$ 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

笔记:

如果您在具有 GPU 直通功能的 VM 内使用 MIG,则可能需要重新启动 VM 以使 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.

笔记:

在某些情况下,如果系统上有使用 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 功能允许非 root 用户在 A100 配置为 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

列出 GPU 实例配置文件


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

$ sudo 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     0/7        4.75       No     14     0     0   |
|                                                             1     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 1g.5gb+me     20     0/1        4.75       No     14     1     0   |
|                                                             1     1     1   |
+-----------------------------------------------------------------------------+
|   0  MIG 2g.10gb       14     0/3        9.75       No     28     1     0   |
|                                                             2     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 3g.20gb        9     0/2        19.62      No     42     2     0   |
|                                                             3     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 4g.20gb        5     0/1        19.62      No     56     2     0   |
|                                                             4     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 7g.40gb        0     0/1        39.50      No     98     5     0   |
|                                                             7     1     1   |
+-----------------------------------------------------------------------------+


使用以下命令列出可用的可能展示位置。 展示位置的语法是 {<index>}:<GPU Slice Count> 并显示实例在 GPU 上的位置。 显示的放置索引指示配置文件在 GPU 上的映射方式,如 支持的配置文件表 

$ sudo 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 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)。

创建 GPU 实例


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

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


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


如果不创建 GPU 实例(和相应的计算实例),CUDA 工作负载就无法在 GPU 上运行。 在 换句话说,仅仅在 GPU 上启用 MIG 模式是不够的。 另请注意,创建的 MIG 设备不是 在系统重新启动后持续存在。 因此,用户或系统管理员需要重新创建所需的 MIG 配置 如果 GPU 或系统被重置。 有关为此目的的自动化工具支持,请参阅 MIG NVIDIA 分区 编辑 器(或 mig-parted ) 工具 


以下示例展示了用户如何创建 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     |
+----------------------------------------------------+

现在验证是否创建了 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 | 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                                                 |
+-----------------------------------------------------------------------------+

实例几何

如上一节中所述  分区 ,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-1 几何:

$ 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 Nov  6 20:34 access
dr-xr-xr-x 2 root root 0 Nov  6 20:34 ci0

/proc/driver/nvidia/capabilities/gpu0/mig/gi2:
total 0
-r--r--r-- 1 root root 0 Nov  6 20:34 access
dr-xr-xr-x 2 root root 0 Nov  6 20:34 ci0

设备枚举


GPU 实例 (GI) 和计算实例 (CI) 在新的 /proc ME的文件系统布局

在裸机上运行 CUDA 应用程序


CUDA 设备枚举


MIG 通过指定应运行应用程序的 CUDA 设备来支持运行 CUDA 应用程序。 使用 CUDA 11,仅支持单个 MIG 实例的枚举。

CUDA 应用程序将 CI 及其父 GI 视为单个 CUDA 设备。 CUDA 仅限于使用单个 CI,并且 如果其中几个可见,将选择第一个可用的。 总而言之,有两个约束:


  1. CUDA 只能枚举单个计算实例
  2. 如果在任何其他 GPU 上枚举任何计算实例,CUDA 将不会枚举非 MIG GPU


请注意,这些限制可能会在未来用于 MIG 的 NVIDIA 驱动程序版本中放宽。

CUDA_VISIBLE_DEVICES 已扩展以添加对 MIG 的支持。 根据所使用的驱动程序版本, 支持两种格式:


  1. 驱动程序 >= R470 ( 470.42.01 +),每个 MIG 设备都分配有一个 GPU UUID,以 ME-<UUID> .
  2. 使用驱动程序 R450 和 R460,每个 MIG 设备都通过指定 CI 和 对应的父 GI。 格式遵循以下约定: MIG-<GPU-UUID>/<GPU instance ID>/<compute instance ID> .


使用 R470 NVIDIA 数据中心驱动程序( 470.42.01 +),下面的例子显示 如何在 8 GPU 系统中为 MIG 设备分配 GPU UUID,每个 GPU 配置不同。

$ 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)


虽然本文档中的其余示例引用了旧的枚举格式,但新格式可以 等价使用。


GPU 实例


以下示例显示了两个 CUDA 应用程序如何在两个不同的 GPU 实例上并行运行。 在这个例子中, 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-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/1/0)
  MIG 3g.20gb Device 1: (UUID: MIG-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/2/0)


$ CUDA_VISIBLE_DEVICES=MIG-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/1/0 ./BlackScholes &
$ CUDA_VISIBLE_DEVICES=MIG-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/2/0 ./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 设备。 从前面的例子中, 利用率显示为 N/A 运行 CUDA 程序时:

$ nvidia-smi
+-----------------------------------------------------------------------------+
| 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      On   | 00000000:00:04.0 Off |                   On |
| N/A   47C    P0   300W / 400W |    537MiB / 40537MiB |     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  |    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 功能的 GPU(例如 A100)上的 MIG 设备,包括 GPU 指标的归属 (包括利用率和其他分析指标),建议使用 NVIDIA DCGM v2.0.13 或更高版本。 查看 分析指标  有关入门的更多详细信息,请参阅 DCGM 用户指南中的部分。


计算实例


如本文档前面所述,可以通过使用计算实例 (CI) 实现更高级别的并发性。 以下示例显示了如何在同一个 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 个 CI,每个类型为 1c 计算容量(配置文件 ID 0)。

$ sudo nvidia-smi mig -cci 0,0,0 -gi 1
Successfully created compute instance on GPU  0 GPU instance ID  1 using profile ID  0
Successfully created compute instance on GPU  0 GPU instance ID  1 using profile ID  0
Successfully created compute instance on GPU  0 GPU instance ID  1 using profile 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-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/1/0 ./BlackScholes &
$ CUDA_VISIBLE_DEVICES=MIG-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/1/1 ./BlackScholes &
$ CUDA_VISIBLE_DEVICES=MIG-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/1/2 ./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 |
+-----------------------------------------------------------------------------+

销毁 GPU 实例


一旦 A100 处于 MIG 模式,就可以动态配置 GI 和 CI。 以下示例显示了如何销毁前面示例中创建的 CI 和 GI。

$ 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

可以验证,现在 A100 上的 MIG 设备已经被拆掉了:


$ 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                                                 |
+-----------------------------------------------------------------------------+

带有 CUDA MPS 的 MIG


部分 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 控制守护程序

在这一步中,我们启动一个 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

启动应用程序

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


CUDA_VISIBLE_DEVICES=<MIG_UUID> \
   my-cuda-app

一个完整的例子

我们现在在下面提供一个脚本,我们尝试在其中运行 BlackScholes 之前在两台 MIG 设备上 在 GPU 上创建:

#!/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 服务器以及启动的相应 CUDA 程序 作为一个 MPS客户端使用时 nvidia-smi :

+-----------------------------------------------------------------------------+
| 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 |
+-----------------------------------------------------------------------------+

将 CUDA 应用程序作为容器运行


NVIDIA Container Toolkit 已得到增强,可提供对 MIG 设备的支持,允许用户运行 具有运行时的 GPU 容器,例如 Docker。 本部分概述了使用 MIG 在 A100 上运行 Docker 容器。


安装 Docker


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


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

安装 NVIDIA 容器工具包


现在安装 NVIDIA Container Toolkit(以前称为 nvidia-docker2 )。 从 v2.3 开始提供 MIG 支持 nvidia-docker2 (或 v1.1.1 的 nvidia-container-toolkit 包裹)。

要访问 /dev nvidia capabilities , 建议至少使用 v2.5.0 的 nvidia-docker2 . 见 安装指南 了解更多信息。

为简洁起见,此处提供的安装说明适用于 Ubuntu 18.04 LTS。 请参阅  NVIDIA Container Toolkit 页面,了解有关其他 Linux 发行版的说明。

设置存储库和 GPG 密钥:


$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
    && distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list \
    && sudo apt-get update

安装 NVIDIA Container Toolkit 软件包(及其依赖项):

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

运行容器


要在特定 MIG 设备上运行容器 - 无论是 GI 还是特定的底层 CI, 然后 NVIDIA_VISIBLE_DEVICES 变量(或 --gpus 选项 Docker 19.03+)可以使用。

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


  1. MIG-<GPU-UUID>/<GPU instance ID>/<compute instance ID> 当使用 R450 和 R460 驱动程序或 ME-<UUID> 从...开始 R470 驱动程序。
  2. GPUDeviceIndex>:<MIGDeviceIndex>


如果使用 Docker 19.03,则 --gpus 选项可用于指定 MIG 设备 使用以下格式:‘“device=MIG-device”’ , MIG-device 可以跟随 上面指定的格式之一 NVIDIA_VISIBLE_DEVICES .

以下示例显示运行 nvidia-smi 从使用这两种格式的 CUDA 容器中。 从示例中可以看出,当使用任一格式时,只有一个选定的 MIG 设备对容器可见。


$ sudo docker run --runtime=nvidia \
    -e NVIDIA_VISIBLE_DEVICES=MIG-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/1/0 \
    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-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/1/0)


# 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-GPU-e86cb44c-6756-fd30-cd4a-1e6da3caf9b0/1/0)

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

$ 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.com/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.com/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.com/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.com/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


MIG 与 Kubernetes


Kubernetes 中的 MIG 支持从 NVIDIA Device Plugin for Kubernetes v0.7.0 。 访问 文档  开始使用 MIG 和 Kubernetes。


带有 Slurm 的 MIG


Slurm 是一个 工作负载管理器,广泛用于政府实验室、大学等高性能计算中心。

从 21.08 开始,Slurm 支持使用 MIG 设备。 参考官方 文件  在开始。


设备节点和功能


目前,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 上创建和销毁 MIG 实例 (例如 A100 GPU)。 如果没有此功能,所有创建或销毁 MIG 实例的尝试都将失败。 同样, fabric-mgmt 功能允许将 Fabric Manager 作为非 root 但具有特权的守护进程运行。 没有这种能力,所有的尝试 启动 Fabric Manager 作为非 root 用户将失败。

以下部分将介绍用于管理这些新的系统级界面 nvidia-capabilities , 包括 授予和撤销对它们的访问权限的必要步骤。


系统级接口


nvidia-capabilities . 第一个是通过 /dev 第二个是通过 /proc . 这 /proc 基于接口依赖用户权限和挂载命名空间来限制访问 到特定的能力,而 /dev 基于接口依赖于 cgroups 。 从技术上讲, /dev 基于接口 还依赖用户权限作为二级访问控制机制(在实际的设备节点文件本身上),但是 主要访问控制 机制是cgroups。 当前的 CUDA 11/R450 GA(Linux 驱动程序 450.51.06)支持这两种机制,但未来 /dev 基于接口 是首选的方法和 /proc 不推荐使用基于接口的接口。 目前,用户可以使用 nv_cap_enable_devfs 上的参数 英伟达 内核模块:

  • 什么时候 nv_cap_enable_devfs=0 这 /proc 基于接口已启用。
  • 什么时候 nv_cap_enable_devfs=1 这 /dev 基于接口已启用。
  • 一个设置 nv_cap_enable_devfs=0 是 R450 驱动程序的默认值(从 Linux 450.51.06 开始)。
  • 所有未来的 NVIDIA 数据中心驱动程序都将默认设置为 nv_cap_enable_devfs=1。


使用此参数集加载 nvidia 内核模块的示例如下所示:

$ modprobe nvidia nv_cap_enable_devfs=1

基于 /dev 的 nvidia 功能


用于交互的系统级接口 /dev 基于能力实际上是通过组合 /proc 和 /dev .

首先,一个新的主要设备现在与 nvidia-capabilites 并且可以从标准中读取 /proc/devices 文件。


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

其次,完全相同的文件集存在于 /proc/driver/nvidia/capabilities 正如他们所做的那样 /proc 基于能力,除了 这些文件不再直接控制对该功能的访问。 相反,这些文件的内容指向设备节点 在下面 /dev , 通过这 cgroups 可用于控制对该功能的访问。

这可以在下面的示例中看到:

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

设备专业的组合 nvidia-caps 和价值 DeviceFileMinor 在这个文件中表明 mig-config 能力(允许用户创建和销毁 MIG 设备)由设备节点控制 major:minor 的 238:1 . ,需要使用 cgroups 为了配置 MIG 设备 的目的 DeviceFileMode 和 DeviceFileModify 此文件中的字段将在本节后面解释。

这些设备节点的标准位置在 /dev/nvidia-caps 如下例所示:

$ ll /dev/nvidia-caps 
total 0
cr--------  1 root root 238,   1 May 30 20:41 nvidia-cap1
cr--r--r--  1 root root 238,   2 May 30 20:41 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 

$ ll /dev/nvidia-caps 
total 0
cr--------  1 root root 238,   1 May 30 20:41 nvidia-cap1
cr--r--r--  1 root root 238,   2 May 30 20:41 nvidia-cap2

nvidia-modprobe 看着 DeviceFileMode 在每个功能文件中,并使用指示的权限创建设备节点 (例如 +ur 从一个值 256 (o400) 从我们的例子 mig-config ).

程序如 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" 具有相同的命令序列。

最后要注意的一件事 /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

这在容器的上下文中很重要,因为我们可能希望让容器访问某些功能,甚至 如果它不存在于 /proc 层次结构呢。

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

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


用于交互的系统级接口 /proc 基于 nvidia-capabilities 植根于 /proc/driver/nvidia/capabilities . 此层次结构下的文件用于表示每个功能,其中 读取 权限控制用户是否具有给定的能力。 这些文件 没有内容 并且 只存在于表示给定的能力。

例如, mig-config 能力(允许用户创建和销毁 MIG 设备)表示如下:

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

同样,创建 MIG 设备后在其上运行工作负载所需的功能表示如下 (即访问构成 MIG 设备的 GPU Instance 和 Compute Instance):

/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>

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

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

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

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

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