1 背景
随着Nvidia GPU在渲染、编解码和计算领域发挥着越来越重要的作用,各大软件厂商对于Nvidia GPU的研究也越来越深入,尽管Nvidia倾向于生态闭源,但受制于极大的硬件成本压力,提升GPU利用率、压榨GPU性能逐渐成为基础设施领域关注的焦点。自然地,为了追求GPU上显存资源和算力资源的时分复用和空分复用,大家都开始考虑软件定义GPU,GPU虚拟化应运而生。2 GPU虚拟化
在深度学习领域,Nvidia GPU的软件调用栈大致如下图所示,从上至下分别为: User APP:业务层,如训练或推理任务等 Framework:框架层,如tensorflow、pytorch、paddle、megengine等 CUDA Runtime:CUDA Runtime及周边生态库,如cudart、cublas、cudnn、cufft、cusparse等 CUDA User Driver:用户态CUDA Driver,如cuda、nvml等 CUDA Kernel Driver:内核态CUDA Driver,参考官方开源代码,如nvidia.ko等 Nvidia GPU HW:GPU硬件![](https://pica.zhimg.com/80/v2-53dc6b26129922435943a39089c4fee0_720w.png)
2.1 用户态虚拟化
目前比较常用的方法是在用户态CUDA Driver的动态库做劫持,参考cuda hook开源代码。通过拦截CUDA Driver API的调用,实现显存资源和算力资源的隔离。不仅对用户代码零侵入,而且灵活性较高,无论是部署在Bare Metal,还是结合容器化进行部署,都比较方便。2.2 内核态虚拟化
通过劫持CUDA Driver动态库部署,可能会存在用户篡改的风险,在公有云上一般不能容忍。而内核态的优势在于可以一定程度上防止用户篡改,但由于Nvidia的闭源性,在内核态做显存资源和算力资源的隔离,技术难度较高。目前阿里云、腾讯云和百度云已经实现部署。![](https://picx.zhimg.com/80/v2-33154dce3da50c9fdb3d99ce787053aa_720w.png)
2.3 硬件虚拟化
Nvidia官方硬件虚拟化方案MIG(Multi-Instance GPU),从Ampere架构开始支持硬件层面的隔离,隔离程度更彻底,但最多只支持7个GPU实例的虚拟化环境。![](https://picx.zhimg.com/80/v2-acd14de3b09f6e51b276c41459c55d87_720w.png)
3 其他
3.1 vGPU
Nvidia官方虚拟GPU解决方案,主要用于支持交付图形丰富的虚拟桌面和工作站,可以将GPU资源重新划分,以保证GPU资源可以在多个虚拟机之间共享,或者可以将多个GPU分配给一个虚拟机,可提升任意工作负载的性能。3.2 MPS(Multi-Process Service)
Nvidia官方多进程context融合方案,支持将多个进程上的kernel发送到MPS server或者直接发送到GPU上计算,避免了多进程在GPU上context的频繁切换。缺点是故障率较高,特别是故障在进程间扩散一般是不能容忍的。![](https://picx.zhimg.com/80/v2-3b31c7db9b89fa590797722724f3cf0e_720w.png)
3.3 远程GPU
将GPU Server拉远,实现GPU池化,突破CPU与GPU的配比极限,拓展GPU虚拟化,可以最大限度地利用集群内的GPU碎片,提升GPU的利用率。趋动科技的OrionX方案,目前处于领先地位。![](https://picx.zhimg.com/80/v2-253c24fad1a53db4524eb25428f699d7_720w.png)