MIG使用指南(v2.1)

更新时间:
复制为 MD 格式

名称解释

Abbreviation

Meaning

MIG

Multiple Instance GPU. The unified name for the GI/CI feature. It makes a single PPU device could be split to multiple resource unit (GI) and multiple compute unit(CI).

GI

GPU Instance, it’s the basic resource unit of PPU which could be used to create more Compute Instances.

CI

Compute Instance, it’s the basic schedulable unit of PPU for compute tasks.

CE

Compute Engine

CU

Compute Unit, One CE have four CU

1. MIG 介绍

MIG代表的是Multiple Instance GPU,这个技术最近因为英伟达在其最新一代的A100显卡设备上的应用而受到广泛的关注。它代表了一种更为宽裕的GPU共享方式,而有别于传统使用的分时共享的方式。当更多的计算资源,以更高密度容纳进入一块GPU设备中时,通过空间分片的方式实现更为高效的多任务间的并行性。MIG在分片粒度上提供了一定的灵活性,可以让不同的实例占有不同数量的计算资源。更大密度的并行运算,更为可控的算力分配,在本地和平台虚拟化场景下,都有更好的用户体验。每个MIG实例可以独立地进行工作,数据和算力双隔离。

为了能够支持MIG功能,硬件在设计的时候,让计算单元CE和内存单元(LLC、HBM)可以按照一定的规则进行切分,GPU Instance的最大数量被设计成8份。

image.png

1.1 GPU Instance

GPU Instance(GI)表示PPU更细粒度的分片,拥有独立的计算单元,内存,DMA以及VIDEO资源。GI可以更细粒度的划分出CI,CI拥有独立的计算单元和VIDEO资源,共享GI中的内存单元和DMA。GI之间支持故障隔离,多个GI并行跑任务时不相互影响,GI发生故障时可以单独复位。

1.2 Compute Instance

PPU MIG的支持是以Compute Instance为粒度(多个CI共享GI),CIGI更细粒度的分片。APP的必须运行在CI上,CI不支持独立复位。

2. MIG的使用

MIG的使用方式和Nvidia A100 MIG的使用方式一致,首先需要通过ppu-smi工具创建MIG。

2.2 开启/关闭PPUMIG模式

只有当PPU当前没有其他进程占用时,才能开启和关闭MIG模式,否则该步骤会失败,开启和关闭的命令如下:

ppu-smi -i ${ppuId} -mig 1
ppu-smi -i ${ppuId} -mig 0

可以通过ppu-smi查询当前PPU是否开启MIG模式,如下图所示,PPU0开启了MIG mode;PPU1关闭MIG mode

image.png

注意:关闭MIG模式前需要确认当前PPU上没有其他GPU InstanceCompute Instance(MIG),否则关闭操作会失败,GPU Instance的查询参考2.2.3,Compute Instance的查询参考2.3.3

2.2 创建、查询、复位和销毁GPU Instance

2.2.1 查询GPU Instance profile

查询支持的GPU Instance profile,命令如下:

ppu-smi mig -i ${ppuId} -lgip

查询结果如下:

image.png

PPU1.0 机型支持4GPU Instance Profile,ID 分别为3,2,1,0

PPU1.1 机型,目前只支持二切片的规格, ID 分别为3,2

Profile ID 2为例说明:

  • 0 表示当前查询设备是PPU0

  • MIG 4g24gb表示当前Profile 的名字,4g表示4slice,24gb表示24GByte Memory

  • 2 表示当前Profile ID

  • 2/2 Free:当前还可以创建2GI, Total:最多创建2GI

  • 24.00表示当前Profile GI的内存大小

  • No 表示当前GPU instance 不支持P2P, PPU MIG模式下不支持P2P

  • 32 表示32compute unit

  • 2 表示2decoder engine

  • 2 表示2encoder engine

  • 2 表示2dma engine

  • 2 表示2jpeg engine

  • 0 表示 0OFA,PPU不支持OFA

2.2.2 创建GPU Instance

创建Profile 2GPU Instance,命令如下:

ppu-smi mig -i ${ppuId} -cgi ${profileId}

创建结果如下:

image.png

2.2.3 查询GPU Instance

ppu-smi mig -i ${ppuId} -lgi

输出如下:

image.png

Instance ID 0表示当前GIPPU0的序号,0:4 Start 0表示0 slot,4表示4slice,如下图红框:

image.png

2.2.4 复位GPU Instance

重置GPU Instance前需要确保当前GPU Instance下的所有Compute Instance都是空闲状态。

ppu-smi mig -i ${ppuId} -gi ${giId} -r

输出结果如下:

image.png

2.2.5 销毁GPU Instance

ppu-smi mig -i ${ppuId} -gi ${giId} -dgi

输出如下:

image.png

2.3 创建、查询和销毁Compute Instance

2.3.1 查询Compute Instance profile

查询支持的Compute Instance profile,命令如下:

ppu-smi mig -i ${ppuId} -gi ${giId} -lcip

输入结果如下:

image.png

PPU1.0 机型支持 Compute Instance Profile 比较多,最多 19 种 Profile

PPU1.1 机型,目前只支持二切片的规格

Profile 2为例说明:

  • 0 表示当前查询设备是PPU0。

  • 0 表示当前查询GPU Instance设备是0。

  • MIG 3u4g24gb 表示当前Profile 的名字,3u表示3compute unit,4g24gb表示GPU Instance Profile名字。

  • 2 表示当前Profile ID。

  • 8/8 Free:当前还可以创建8CI, Total:最多创建8CI。

  • 3 表示当前Profile CI具有3compute unit。

  • 剩余参考GPU Instance Profile说明。

2.3.2 创建Compute Instance

创建Profile 3Compute Instance,命令如下:

ppu-smi mig -i ${ppuId} -gi ${giId} -cci ${profileId}

输出如下:

image.png

2.3.3 查询Compute Instance

ppu-smi mig -i ${ppuId} -gi ${giId} -lci

输出如下:

image.png

成功创建Compute Instance后,ppu-smi也可以直接查询到Compute Instance,如下图:

image.png

PPU0卡上有一个Compute Instance(MIG),属于GPU Instance 0,该Compute Instance具有4compute unit

查询Compute Instance UUID

ppu-smi -L

输出结果如下,MIG-4416c2c4-534e-4236-b26a-24692af597a1表示当前Compute InstanceUUID。

image.png

2.3.4 销毁Compute Instance

ppu-smi mig -i ${ppuId} -gi ${giId} -ci ${ciId} -dci

输出如下:

image.png

2.4 Host使用MIG设备

Host中使用MIG设备时,只需要使用CUDA_VISIBLE_DEVICES指定MIGUUID即可,UUID的获取可以通过ppu-smi获取。

image.png

export CUDA_VISIBLE_DEVICES=MIG-4416c2c4-534e-4236-b26a-24692af597a1
./app

2.5 容器中使用MIG设备

我们可以将MIG设备透传到容器中使用。具体用法可以参考容器隔离使用指南

3. 注意事项

3.1 PPU开启了MIG或只创建了GI时是不能使用的

如下图,此时通过 CUDA_VISIBLE_DEVICES=0 运行程序会失败。

image.png

3.2 多PPU存在CI时,app默认跑在第一个CI

如下图:

  • 未指定 CUDA_VISIBLE_DEVICES 时,app默认跑在PPU-1/GI-0/CI-0上。

  • CUDA_VISIBLE_DEVICES=0 时,app运行在PPU0上。

  • CUDA_VISIBLE_DEVICES=1 时,app运行在PPU-1/GI-0/CI-0上。

  • CUDA_VISIBLE_DEVICES=MIG-UUID,app运行在指定CI上。

image.png

3.3 CUDA_VISIBLE_DEVICES可以同时指定多个PPU和单个CI

以下命令都是合法的:

CUDA_VISIBLE_DEVICES=3                    # 选择使用PPU3
CUDA_VISIBLE_DEVICES=3,PPU-${UUID},1      # 选择使用PPU3,PPUx,PPU1
CUDA_VISIBLE_DEVICES=MIG-${UUID}          # 选择使用单个CI

3.4 CUDA_VISIBLE_DEVICES同时指定PPU+CI

3.4.1 如果第一个设备是MIG,那么只有该MIG生效,其他设备忽略。

CUDA_VISIBLE_DEVICES=MIG-${UUID},3,PPU-${UUID}          # 只有MIG-${UUID} 生效

3.4.2 如果第一个设备不是MIG,那么只有第一个MIG前的所有PPU生效。

CUDA_VISIBLE_DEVICES=4,2,MIG-${UUID},3,PPU-${UUID}          # 选择使用PPU4,PPU2