由于GPU,尤其是高端GPU的成本高昂,公司常常会有这样一种想法:GPU的利用率很少能达到100%——我们能否像在服务器上运行多个虚拟机一样分割GPU,将一部分分配给每个用户,从而显著提高GPU的利用率?
然而,在现实中,GPU虚拟化远远落后于CPU虚拟化,原因有以下几点:
1. GPU和CPU工作方式的固有差异
2. GPU和CPU用例的固有差异
3. 制造商和行业发展进度的差异
今天,我们将从GPU的工作方式开始概述,并探索几种共享GPU资源的方法,最终讨论在AI时代企业最需要什么样的GPU共享,以及如何提高GPU的利用率和效率。
1. GPU工作方式概述
1. 高度并行的硬件架构
GPU(图形处理单元)最初是为图形加速而设计的,是一种为大规模数据并行计算而构建的处理器。与CPU的通用性质相比,GPU包含大量的流式多处理器(SMs或类似的术语),能够在单一指令,多数据(SIMD,或大致上SIMT)模型下同时执行成百上千个线程。
2. 上下文和显存(VRAM)
上下文:在CUDA编程环境中,如果不同的进程(或容器)想要使用GPU,每个都需要自己的CUDA上下文。GPU通过时间切片或合并它们共享(例如,NVIDIA MPS将多个进程合并为单一上下文)来在这些上下文之间切换。
显存(VRAM):GPU的板载内存容量通常是固定的,其管理与CPU不同(CPU主要使用操作系统内核的MMU进行内存分页)。GPU通常需要显式分配VRAM。如下所示,GPU具有众多ALU,每个都有自己的缓存空间:
3. GPU端硬件和调度模式
GPU上下文切换比CPU切换更复杂且效率更低。GPU通常需要完成运行一个内核(一个GPU端计算函数)后才能切换,并且在进程之间保存/恢复上下文数据的成本比CPU上下文切换更高。
GPU资源有两个主要维度:计算能力(对应于SMs等)和VRAM。在实践中,必须同时考虑计算利用率和VRAM可用性。
2. 为什么GPU共享技术落后于CPU共享
1. 成熟的CPU虚拟化具有强大的指令集和硬件支持
CPU虚拟化(例如,KVM、Xen、VMware)已经发展了几十年,得到了广泛的硬件支持(例如,Intel VT-x、AMD-V)。CPU上下文相对简单,硬件供应商与虚拟化提供商深度合作。
2. GPU的高并行性和成本高昂的上下文切换
由于GPU上下文切换的复杂性和成本高于CPU,实现GPU上的“共享”需要灵活处理不同进程的并发访问、VRAM争用和与闭源内核驱动程序的兼容性。对于拥有数百或数千个核心的GPU,制造商难以像CPU那样提供完整的硬件虚拟化抽象,或者需要漫长的演变过程。
(下图说明了GPU上下文切换,显示了它引入的显著延迟。)
3. 用例需求的差异
CPU通常在大规模多用户虚拟机或容器之间共享,大多数用例要求高CPU效率,而不是深度学习训练中看到的成千上万线程的矩阵乘法或卷积操作。在GPU训练和推理场景中,目标通常是最大化峰值计算能力。虚拟化或共享引入了上下文切换开销,并与资源QoS保证冲突,导致技术碎片化。
4. 供应商生态系统的差异
CPU供应商相对集中,英特尔和AMD在海外以x86架构为主,国内供应商大多使用x86(或C86)、ARM,偶尔使用像LoongArch这样的专有指令集。相比之下,GPU供应商表现出显著的多样性,分为CUDA、CUDA兼容、ROCm和各种专有生态系统,包括CANN,导致生态系统严重碎片化。
总之,这些因素导致GPU共享技术落后于CPU虚拟化的成熟度和灵活性。
II. 常见GPU共享方法的优缺点及用例
广义上讲,GPU共享方法可以分为以下几类(名称可能不同,但原理相似):
1. vGPU(在硬件/内核/用户级别有多种实现,例如,NVIDIA vGPU、AMD MxGPU、内核级cGPU/qGPU)
2. MPS(NVIDIA多进程服务,上下文合并解决方案)
3. MIG(NVIDIA多实例GPU,A100/H100架构中的硬件隔离)
4. CUDA Hook(API劫持/拦截,例如,用户级解决方案如GaiaGPU)
1. vGPU
基本原理:通过内核或用户级机制将单个GPU分割成多个虚拟GPU(vGPU)实例。NVIDIA vGPU和AMD MxGPU是最强大的官方硬件/软件解决方案。也存在开源选项,如KVMGT(Intel GVT-g)、cGPU和qGPU。
优点:
灵活分配计算能力和VRAM,实现“在一张卡上
返回列表