MIG功能,本质上和NV的vGPU逻辑一致,只不过是软件层面方便用户榨干显卡性能提高训练效率(之前有看到对比测试MIG实例对比vGPU实例的训练性能测试,MIG会快一些,可能是少了虚拟化层面的损耗,当然这个不是我们的重点)。MIG不需要vGPU GRID驱动,所以不需要难以获取的企业vGPU驱动,但同时也意味着不能像vGPU一样通过VFIO映射到虚拟机里,只能以驱动作为媒介通过向软件暴露多个CUDA设备实现,使用tensorflow或者pytorch都可以看到多个CUDA设备。以下是一个简单的引导。

Nvidia N卡 MIG功能 入门教程-MLEN

1. 用前须知

  1. 使用MIG功能前,首先要确定显卡是否支持该功能,该功能并没有二进制文件破解,所以必须要显卡本身支持。MIG功能,Nvidia官方支持列表:NVIDIA Multi-Instance GPU User Guide :: NVIDIA Data Center GPU Driver Documentation(如果不支持,但想要类似的功能,可以尝试使用二进制破解补丁过的GRID vGPU驱动,然后把显卡SRIOV成多个虚拟GPU设备。)
  2. 想清楚是否需要该功能,该功能的效果主要是分配计算性能(计算块)和内存资源(多少GB)来创建虚拟显卡设备,并不能直通到虚拟机,而且资源都是独享的,所以不能超量分配(虚拟化的vGPU是共享资源的)。
  3. 搞清楚软件/驱动等兼容性,有四个关键的版本兼容:Python版本,驱动版本,CUDA工具箱版本,Pytorch/Tensorflow版本(Pytorch版本兼容性列表如下Start Locally | PyTorch)。简单解释一下:Pytorch/Tensorflow需要特定Python版本,只有特定CUDA的lib,所以必须要提前看好,最好找到之前有人踩过的版本,比如Pytorch官方有写的应该是11.8,12.1,12.4三个版本,而CUDA版本又依赖驱动版本,所以驱动版本也需要考虑到。
  4. 学会使用Anaconda3,主要是Anaconda比较好切换和配置环境,可以查看anaconda官网的教程来安装,这里就不赘述。关键词放在这里:conda create –name <my-env>,conda activate <my-env>
    官方教程:Managing environments — conda 24.7.2.dev7 documentation
  5. 系统版本:免费用户推荐Ubuntu 22.04 LTS(撰文日期2024年7月),付费用户推荐RHV或者Ubuntu Pro,或者直接去官方企业后台找客服帮你装驱动。安装的时候大概率是要关闭X server的GUI,以及完全卸载当前驱动,所以Ubuntu对于小白,一般使用系统更新里面的第一个测试过的驱动即可,具体版本要看个人需要,也可以自己装openkernel本地compile。

2. 安装驱动

安装驱动有多种方式,Ubuntu是最简单的,可以直接使用软件更新里的第三方驱动里面实现。以下为通用教程。

  1. 官网下载对应版本驱动:Official Drivers | NVIDIA,自己对于软件版本选择Linux的对应发行版本,也要选择对应的CUDA-ToolKit版本
  2. 本地运行驱动程序前,更新系统和所有的包,安装必要的运行库,安装必要的Linux Header,可能用到的指令如下:
# 更新所有包
sudo apt update
sudo apt upgrade

# 删除不需要的包
sudo apt autoremove

# 安装对应的Linux Header
sudo apt-get install linux-headers-$(uname -r)

# 删除现有驱动程序或者默认驱动
sudo apt remove --purge '^nvidia-.*'

# 移除 X server GUI (移除后可以用Ctrl+Alt+F2切换到CLI)
sudo apt remove --purge xserver-xorg

# 可能会用到的安装DKMS(GRID vGPU驱动一般需要用这个)
sudo apt install nvidia-dkms-${DRIVER_BRANCH}${SERVER}

3. 安装软件

如果是使用Anaconda,一般会使用自己的CUDA lib,但如果要在系统上直接安装,可以去官网下载最新版CUDA Toolkit 12.5 Update 1 Downloads | NVIDIA Developer,一般官网是给rpm或者deb安装包文件或者是run(除非你想每次用.run卸载,你可以用.run,卸载的时候加–uninstall的flag)。以下会以Anaconda为例(NV官方库nvidia :: Anaconda.org):

  1. 创建并且激活一个能分辨的Conda Env(高手可以oneline + package install),比如
    conda create –name newenv python=3.10
    (创建新的环境+python3.10)
    conda activate newenv
  2. 在对应的Env里面安装对应的环境和驱动,如笔者当时用的是12.1就是如下指令:
    conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
    Start Locally | PyTorch,选conda会给你指令)
  3. 部分情况你可能需要使用Nightly版本,也就是,Preview版本。
    conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch-nightly -c nvidia
    如果稳定版不工作,或者Driver太新,都可以试试。

4. 启动MIG模式

MIG模式启动后,显卡会无法被CUDA使用,但仍然会被检测到。必须要手动设置实例后,CUDA会检测到所有的MIG实例。

# 显示所有设备和信息
nvidia-smi

# 显示详细信息(详细信息非常长,但是具体显卡支持的功能都会显示)
nvidia-smi -q

# 显示index 0设备的信息(看到MIG是关闭的,新驱动底下还会有MIG和线程信息)
# 如下是一张A100 40G的默认预设
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 |
+-------------------------------+----------------------+----------------------+

# 启动设备0的MIG模式(一旦启动,只能手动关闭,重启也会是这个模式)
sudo nvidia-smi -i 0 -mig 1
Enabled MIG Mode for GPU 00000000:36:00.0

# 关闭设备0的MIG模式(防止呆逼)
sudo nvidia-smi -i 0 -mig 0

# 显示MIG实例的预设(每个显卡不一样,比如笔者的A100 80G,19号是8g.10gb)
# (意思是8个计算块的性能+10GB的显存上限,+me是媒体引擎也就是编解码器,以此类推)
# 如下是一张A100 40G的默认预设
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     7/7        4.75       No     14     0     0   |
|                                                             1     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 1g.5gb+me     20     1/1        4.75       No     14     1     0   |
|                                                             1     1     1   |
+-----------------------------------------------------------------------------+
|   0  MIG 1g.10gb       15     4/4        9.62       No     14     1     0   |
|                                                             1     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 2g.10gb       14     3/3        9.62       No     28     1     0   |
|                                                             2     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 3g.20gb        9     2/2        19.50      No     42     2     0   |
|                                                             3     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 4g.20gb        5     1/1        19.50      No     56     2     0   |
|                                                             4     0     0   |
+-----------------------------------------------------------------------------+
|   0  MIG 7g.40gb        0     1/1        39.25      No     98     5     0   |
|                                                             7     1     1   |
+-----------------------------------------------------------------------------+

# 根据预设创建MIG实例
(9是预设9,3g.20gb是手动设置,-C创建计算资源,不加这个nvidia-smi看不到,CUDA也看不到)
sudo nvidia-smi mig -cgi 9,3g.20gb -C

# 根据预设创建MIG实例,以此类推你可以
(比如这个指令,在我的A100上创建7个19号instance,在笔者的设备上刚好ME够分,内存也够)
sudo nvidia-smi mig -cgi 19,19,19,19,19,19,19 -C

# 创建完成你就可以在nvidia-smi里面看到所有MIG设备了
# 注:重启会消失,你可以在systemd里面创建一个服务,开机自动分配(不会,问ChatGPT)
# 不用试Persistence Mode了,变Legacy了,而且我也试过了,没什么用,官方让用systemd service。

5. 额外信息

更多详细的官方信息,可以看NVIDIA Multi-Instance GPU User Guide :: NVIDIA Data Center GPU Driver Documentation。其实这个功能类似vGPU,但没vGPU那么难折腾,甚至nvidia-smi的显示方式都类似开了vGPU模式的lspci的设备信息。看每个人用途吧,MIG貌似是对部分计算用途有所帮助,在Tensorflow和Pytorch的代码里面都会识别出多个CUDA设备。看到该文章的人可以少走点弯路。方便的话点个赞或者收藏一下就行。


(转载教程署名即可,有问题可以TB找我,谢谢老板)