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 分区的更多信息,请参阅 技术简介 。

本文档的目的是介绍 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
概念
术语
本节介绍一些用于描述 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 实例 (GI) 需要结合一些 具有一定数量计算切片的内存切片。 在下图中,5GB 内存 slice 与 1 个计算 slice 组合以创建一个 1g.5gb GI简介:
图 3. 组合内存和计算切片
类似地,4x5GB 内存片可以与 4x1 计算片组合以创建 4g.5gb GI简介:
图 4. 结合内存和计算切片
计算实例
一个 GPU Instance 的计算切片可以进一步细分为多个 计算实例 (CI),其中 CI 共享父 GI 的引擎和内存, 但是每个 CI 都有专用的 SM 资源。
使用相同的 4g.20gb 上面的示例,可以创建一个 CI 以仅使用第一个 计算切片如下所示:
图 5. 组合内存和计算切片
在这种情况下,可以通过选择任何计算切片来创建 4 个不同的 CI。 两个计算 切片也可以组合在一起创建一个 2c.4g.20gb 轮廓:
图 6. 组合内存和计算切片
在本例中,也可以组合 3 个计算切片来创建一个 3c.4g.20gb 轮廓 或所有 4 个可以组合以创建一个 4c.4g.20gb 轮廓。 当所有 4 计算切片组合在一起,配置文件简称为 4g.20gb 轮廓。
配置文件放置
可以创建 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 实例配置文件
个人资料名称 记忆分数 部分 SM 硬件单元 L2 缓存大小 可用实例数 MIG 1g.5gb 1/8 1/7 0 NVDECs 1/8 7 MIG 2g.10gb 2/8 2/7 1 NVDECs 2/8 3 MIG 3g.20gb 4/8 3/7 2 NVDECs 4/8 2 MIG 4g.20gb 4/8 4/7 2 NVDECs 4/8 1 MIG 7g.40gb Full 7/7 5 NVDECs Full 1图 7. A100 上的 MIG 配置文件
在此图中,可以从左侧的实例配置文件开始构建有效的组合,然后 向右移动时将其与其他实例配置文件结合起来,这样没有两个配置文件垂直重叠。 此规则的唯一例外是(4 内存,4 计算)和(4 内存,3 计算)配置文件的组合, 目前不支持。 但是,再次组合(4 内存,3 计算)和(4 内存,3 计算) 支持。 有关 A100 和 A30 上所有支持的配置文件组合和放置的列表,请参阅关于 支持的配置文件 。
图 8. A100 上的配置文件放置
请注意,该图表示 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 并发机制
Streams MPS MIG Partition Type Single Process Logical Physical Max Partitions Unlimited 48 7 SM Performance Isolation No Yes (by percentage, not partitioning) Yes Memory Protection No Yes Yes Memory Bandwidth QoS No No Yes Error Isolation No No Yes Cross-Partition Interop Always IPC Limited IPC Reconfigure Dynamic Process Launch When Idle部署注意事项
从 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
下面的描述显示了 A100-SXM4-40GB 产品上的配置文件名称。 对于 A100-SXM4-80GB, 配置文件名称将根据内存比例而变化 - 例如, 1g.10gb , 2g.20gb , 3g.40gb , 4g.40gb , 7g.80gb 分别。
表 4. 使用单个 CI 时的设备名称
记忆 20GB 10GB 5GB GPU 实例 3g 2g 1g 计算实例 3c 2c 1c MIG 设备 3g.20gb 2g.10gb 1g.5gb GPC GPC GPC GPC GPC GPC每个 GI 可以根据用户的工作负载进一步细分为多个 CI。 桌子 下面突出显示了在这种情况下 MIG 设备的名称。 所示示例适用于 将 3g.20gb 设备细分为一组具有不同计算实例切片计数的子设备。
表 5. 使用多个 CI 时的设备名称
记忆 20GB 20GB GPU 实例 3g 3g 计算实例 1c 1c 1c 2c 1c MIG 设备 1c.3g.20gb 1c.3g.20gb 1c.3g.20gb 2c.3g.20gb 1c.3g.20gb GPC GPC GPC GPC GPC GPC支持的 MIG 配置文件
本节概述了支持的配置文件以及 MIG 配置文件的可能位置 支持的 GPU。
下表显示了 A30-24GB 产品支持的配置文件。
个人资料名称 | 记忆分数 | 部分 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 上的配置文件
下表显示了 A100-SXM4-40GB 产品上支持的配置文件。 对于 A100-SXM4-80GB, 配置文件名称将根据内存比例而变化 - 例如, 1g.10gb , 2g.20gb , 3g.40gb , 4g.40gb , 7g.80gb 分别。
表 7. A100 上的 GPU 实例配置文件
个人资料名称 记忆分数 部分 SM 硬件单元 L2 缓存大小 可用实例数 MIG 1g.5gb 1/8 1/7 0 NVDECs /0 JPEG /0 OFA 1/8 7 MIG 1g.5gb+me 1/8 1/7 1 NVDEC /1 JPEG /1 OFA 1/8 1 (A single 1g profile can include media extensions) MIG 2g.10gb 2/8 2/7 1 NVDECs /0 JPEG /0 OFA 2/8 3 MIG 3g.20gb 4/8 3/7 2 NVDECs /0 JPEG /0 OFA 4/8 2 MIG 4g.20gb 4/8 4/7 2 NVDECs /0 JPEG /0 OFA 4/8 1 MIG 7g.40gb Full 7/7 5 NVDECs /1 JPEG /1 OFA Full 1这 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 选项。 之一 可以使用三个选项来指定要创建的实例配置文件:
- 配置文件 ID(例如 9、14、5)
- 配置文件的简称(例如 3g.20gb
- 实例的完整配置文件名称(例如 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,并且 如果其中几个可见,将选择第一个可用的。 总而言之,有两个约束:
-
CUDA 只能枚举单个计算实例
-
如果在任何其他 GPU 上枚举任何计算实例,CUDA 将不会枚举非 MIG GPU
请注意,这些限制可能会在未来用于 MIG 的 NVIDIA 驱动程序版本中放宽。
CUDA_VISIBLE_DEVICES 已扩展以添加对 MIG 的支持。 根据所使用的驱动程序版本, 支持两种格式:
- 驱动程序 >= R470 ( 470.42.01 +),每个 MIG 设备都分配有一个 GPU UUID,以 ME-<UUID> .
- 使用驱动程序 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 设备:
-
MIG-<GPU-UUID>/<GPU instance ID>/<compute instance ID> 当使用 R450 和 R460 驱动程序或 ME-<UUID> 从...开始 R470 驱动程序。
-
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。
设备节点和功能
目前,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 , 包括 授予和撤销对它们的访问权限的必要步骤。
系统级接口
- 什么时候 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 ,并且只有那些 用户希望授予容器的功能应该 绑定挂载 。由于主机的用户/组信息在绑定挂载中保留, 在将这些功能注入之前,必须确保在主机上为这些功能设置了正确的用户权限 一个容器。