MIG功能,本质上和NV的vGPU逻辑一致,只不过是软件层面方便用户榨干显卡性能提高训练效率(之前有看到对比测试MIG实例对比vGPU实例的训练性能测试,MIG会快一些,可能是少了虚拟化层面的损耗,当然这个不是我们的重点)。MIG不需要vGPU GRID驱动,所以不需要难以获取的企业vGPU驱动,但同时也意味着不能像vGPU一样通过VFIO映射到虚拟机里,只能以驱动作为媒介通过向软件暴露多个CUDA设备实现,使用tensorflow或者pytorch都可以看到多个CUDA设备。以下是一个简单的引导。
1. 用前须知
- 使用MIG功能前,首先要确定显卡是否支持该功能,该功能并没有二进制文件破解,所以必须要显卡本身支持。MIG功能,Nvidia官方支持列表:NVIDIA Multi-Instance GPU User Guide :: NVIDIA Data Center GPU Driver Documentation(如果不支持,但想要类似的功能,可以尝试使用二进制破解补丁过的GRID vGPU驱动,然后把显卡SRIOV成多个虚拟GPU设备。)
- 想清楚是否需要该功能,该功能的效果主要是分配计算性能(计算块)和内存资源(多少GB)来创建虚拟显卡设备,并不能直通到虚拟机,而且资源都是独享的,所以不能超量分配(虚拟化的vGPU是共享资源的)。
- 搞清楚软件/驱动等兼容性,有四个关键的版本兼容:Python版本,驱动版本,CUDA工具箱版本,Pytorch/Tensorflow版本(Pytorch版本兼容性列表如下Start Locally | PyTorch)。简单解释一下:Pytorch/Tensorflow需要特定Python版本,只有特定CUDA的lib,所以必须要提前看好,最好找到之前有人踩过的版本,比如Pytorch官方有写的应该是11.8,12.1,12.4三个版本,而CUDA版本又依赖驱动版本,所以驱动版本也需要考虑到。
- 学会使用Anaconda3,主要是Anaconda比较好切换和配置环境,可以查看anaconda官网的教程来安装,这里就不赘述。关键词放在这里:conda create –name <my-env>,conda activate <my-env>
官方教程:Managing environments — conda 24.7.2.dev7 documentation - 系统版本:免费用户推荐Ubuntu 22.04 LTS(撰文日期2024年7月),付费用户推荐RHV或者Ubuntu Pro,或者直接去官方企业后台找客服帮你装驱动。安装的时候大概率是要关闭X server的GUI,以及完全卸载当前驱动,所以Ubuntu对于小白,一般使用系统更新里面的第一个测试过的驱动即可,具体版本要看个人需要,也可以自己装openkernel本地compile。
2. 安装驱动
安装驱动有多种方式,Ubuntu是最简单的,可以直接使用软件更新里的第三方驱动里面实现。以下为通用教程。
- 官网下载对应版本驱动:Official Drivers | NVIDIA,自己对于软件版本选择Linux的对应发行版本,也要选择对应的CUDA-ToolKit版本
- 本地运行驱动程序前,更新系统和所有的包,安装必要的运行库,安装必要的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):
- 创建并且激活一个能分辨的Conda Env(高手可以oneline + package install),比如
conda create –name newenv python=3.10
(创建新的环境+python3.10)
conda activate newenv - 在对应的Env里面安装对应的环境和驱动,如笔者当时用的是12.1就是如下指令:
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
(Start Locally | PyTorch,选conda会给你指令) - 部分情况你可能需要使用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找我,谢谢老板)
评论 (0)