GPU 虚拟化
对于 NVIDIA GPU 的虚拟化,有以下几种方案:
1. NVIDIA GRID vGPU
以前叫 Grid,现在叫 vGPU。是一套软件,并不是直接硬件上做的。
性能低于直接透传设备,需要 License 授权。
2. NVIDIA MIG
Ampere/Hopper 以及之后才支持。硬件级别的虚拟化,支持 7 个。空间分割所以资源受限不能运行大负载任务,无法做到削峰填谷。此外不是 100% 的资源可以被售卖,比如 10% 左右的 SM 无法被 MIG 实例使用。不支持 GPU - GPU P2P(PCIe, NVLINK)。
3. NVIDIA MIPS
因为同一时刻只能跑一个进程的 context,所以这个方案是把不同进程的 context 进行合并,因此无法做到软件故障隔离(一个进程出故障会影响到另一个进程),也就导致了在生产上基本是不可用的。
4. 第三方(非 NVIDIA)的 CUDA 拦截方案
需要修改 CUDA lib 代码,需要侵入容器,需要用户升级 CUDA 库和容器。而且也是粗粒度(kernel 级别)对任务进行控制。
5. 在内核驱动层截获
不用修改 CUDA lib 和用户程序。支持虚拟化出来的实例数原则上是没有限制的(上千)。时分 QoS 控制,做到完全精确调度。也支持故障隔离。阿里云 cGPU, 腾讯 qGPU 以及字节 eGPU 都是基于这个实现的。
/var/run/nvidia-topologyd/virtualTopology.xml
/ NCCL_TOPO_FILE
/ nvidia-topologyd
Service
这个目录主要是直通给 VM 让 VM 来看的,所以物理机上不需要这个目录和服务(EBM 也不需要),这也就是为什么叫做 virtualTopology.xml
。
这是 NCCL 会看的一个目录。下面有一个很重要的文件(核心作用就是存放这个文件):virtualTopology.xml
。
该文件包含 GPU 和 RDMA 网卡的 PCI 拓扑信息,是 NCCL 初始化时默认检索的拓扑配置文件,直接影响多卡通信(如 all_reduce、 all_to_all 等操作)的正确性和性能。
Environment Variables — NCCL 2.27.5 documentation
NCCL 会参考的一个环境变量是 NCCL_TOPO_FILE
:
Path to an XML file to load before detecting the topology. By default, NCCL will load
/var/run/nvidia-topologyd/virtualTopology.xml
if present.
这个 XML 文件是谁来生成的呢?
是 nvidia-topologyd
这个 service 生成的。
Typically, nvidia-topologyd service generates the xml file at system startup and goes into an inactive state. The service does not run all the time because the physical GPU topology does not change after it is started.
systemctl status nvidia-topologyd.service