接前一篇文章:虚拟化相关面试题集锦(0)------ 引言
问题1
问:如何在QEMU/KVM虚拟机上跑通AI相关模型的训练和测试,并对虚拟机的GPU资源的分配进行配置和优化?
备注:此问题是笔者年上周参加中科时代(一家有中科院背景的小公司)面试时遇到的一个问题。此问题是当时其CTO提出的。说实话,这个问题比较"冷门"。一般用QEMU/KVM,都是使用CPU,而主要的精力也是放在对CPU、内存、virtIO的研究上就可以了,如果能够研究到图形(DRM)相关的虚拟化,就已经算是比较精深了。而中科时代的这个诉求是对于GPU进行虚拟化以及在虚拟机中进行资源配置,笔者还是第一次遇到这一类诉求和问题。当时笔者也是根据自己所知道的AI相关的知识、Linux内核相关的知识,触类旁通地进行了回答,当然,肯定比较空泛。我当时大概是这样说的:就我目前的认识,首先前提是必须有一台带有GPU的物理机,在其上进行实现;然后要移植N卡(Nvidia)、A卡(AMD)或其它公司显卡对应的包,这一般是由厂家提供,移植过来就好。一切正常后,会生成相应的设备结点(如/dev/dri/card0);之后就可以安装AI相关的集成开发环境、以及相关的数据和模型进行训练了;关于如何配置虚拟GPU的资源,可以通过QEMU的命令行参数、或者通过VirtManager利用图形界面进行分配和配置。就是当时面试的情况和状态,面试结束回来后,通过在CSDN"问答"中提问,网友给出了一些相关的回复,虽然这些回复基本上都是通过类chatGPT的工具给出的,但笔者觉得也还是挺有用的。以下就将这些回复整理结合后写在回答中。
答:
1. 解决方案
在QEMU/KVM中虚拟化GPU并运行AI训练,可以有以下解决方案:
(1)使用GPU直通(pass-through)技术
通过将物理GPU直接分配给虚拟机,可以实现Hypervisor级别的GPU虚拟化。这样,虚拟机可以完全访问GPU硬件并进行AI训练。这种方法需要确保物理机具有支持VT-d (Intel) 或 IOMMU (AMD) 技术的CPU和主板,并且需要适当的GPU驱动支持。配置方法如下:
1)配置主机的IOMMU功能并确保启用GPU直通支持;
2)在QEMU虚拟机中配置PCI Pass-through,将GPU设备分配给虚拟机;
3)在虚拟机中安装适当的GPU驱动程序。
(2)使用virtio-gpu
virtio-gpu是一种基于Para-virtualization的虚拟图形卡设备。它提供了虚拟机和宿主机之间的通信接口,允许虚拟机访问GPU功能。但由于它是基于软件实现的,并没有直接访问物理GPU硬件,所以性能可能会受到一些影响。配置方法如下:
(1)在QEMU虚拟机中启用virtio-gpu设备;
(2)在虚拟机中安装virtio-gpu驱动程序;
(3)在虚拟机中安装相应的GPU计算库和工具,如CUDA、cuDNN等。
(3)使用GPU虚拟化中间件
除了直通和软件实现的虚拟图形卡设备外,还有一些第三方的GPU虚拟化中间件 可供选择,如NVIDIA的GRID Virtual GPU 和AMD的MxGPU 。这些中间件可以提供硬件加速的虚拟化性能,并允许多个虚拟机共享同一个物理GPU 。配置方法类似于直通技术,但需要安装相应的虚拟化中间件并进行适当的配置。
注意:在实现基于GPU的虚拟化之前,需要确保你的硬件和软件环境都支持所选择的虚拟化方法。
2. 解决思路与步骤
以上面第三种解决方案为例,解决思路和对应的步骤如下:
(1)选择合适的QEMU版本和GPU模拟支持
确保选择的QEMU版本支持GPU虚拟化,并且GPU模拟支持良好。通常情况下,较新版本的QEMU会有更好的GPU虚拟化支持。
可以查看QEMU的官方文档或者社区论坛,了解最新版本的QEMU是否支持你所需要的GPU虚拟化功能。
(2)准备GPU虚拟化所需的软件和驱动
需要准备好支持GPU虚拟化的软件和驱动。这可能包括NVIDIA的GRID 虚拟GPU软件、或者AMD的MxGPU软件等。
根据所选择的GPU类型,获取并安装相应的GPU虚拟化软件。例如,如果要虚拟化NVIDIA GPU,需要安装NVIDIA的GRID虚拟GPU软件。这些软件通常由GPU厂商提供,你可以从他们的官方网站上获取。
(3)配置QEMU虚拟机
配置QEMU虚拟机以支持GPU虚拟化。这可能包括修改QEMU的启动参数,指定虚拟GPU的类型和数量,以及分配足够的资源给虚拟机。
在启动QEMU虚拟机时,通过命令行参数或者配置文件来指定GPU虚拟化相关的参数 。这些参数通常包括虚拟GPU的类型 、数量 ,以及分配给虚拟机的显存大小等。
(4)安装操作系统和相关软件
在虚拟机中安装操作系统和相关软件,确保所选的操作系统版本支持GPU虚拟化,并且能够正常识别和使用虚拟GPU进行AI相关的训练任务。
安装并配置所需的AI训练框架和库,例如TensorFlow、PyTorch等。
(5)测试和优化
在完成上述步骤后,测试虚拟机是否能够正常使用GPU进行AI相关的训练任务。根据测试结果进行优化和调整,以提高虚拟机的性能和稳定性。
3. 关键步骤细节
(1)支持硬件辅助虚拟化的GPU
硬件厂商如NVIDIA和AMD提供了针对其GPU的硬件虚拟化技术 ,如NVIDIA的vGPU(Virtual GPU)和AMD的MxGPU。这些技术使得宿主机上的物理GPU可以被多个虚拟机共享,每个虚拟机都能得到一部分GPU资源。
官方文档:
-
NVIDIA vGPU: NVIDIA vGPU Documentation
-
AMD GPU Passthrough: AMD SR-IOV Documentation
(2)安装和配置设备驱动及工具
- NVIDIA GPU
对于NVIDIA GPU ,使用nvidia-docker 或者NVIDIA的vGPU解决方案(例如GRID或Tesla M60系列支持的vGPU技术)。在宿主机上安装NVIDIA驱动、CUDA Toolkit,并配置libvirt以启用vGPU特性。
bash
# 安装NVIDIA驱动和相关软件包
sudo apt-get install nvidia-driver-XXX cuda-toolkit-XXX qemu-guest-agent libvirt-daemon-driver-nvram
# 配置QEMU虚拟机启动选项以使用vGPU
<video>
<model type='nvidia-vgpu' vgpu_type='...' />
</video>
- AMD GPU
对于AMD GPU,利用**SR-IOV(Single Root I/O Virtualization)**技术,确保BIOS开启该功能,然后配置虚拟机来直接映射GPU硬件。
bash
<!-- 在libvirt的XML配置中添加AMD GPU直通 -->
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0xXX' slot='0xYY' function='0xZZ'/>
</source>
<address type='pci' domain='0x0000' bus='0x0A' slot='0x00' function='0x0'/>
</hostdev>
(3)在虚拟机内部配置GPU驱动
对于Linux虚拟机,需要在客户机内核中启用相应的驱动模块,并安装相应显卡驱动程序,以便识别和使用分配给它的GPU资源。
(4)运行AI相关的训练任务
一旦虚拟机正确识别了GPU,就可以像在物理机上一样,在虚拟机内部安装深度学习框架(如TensorFlow、PyTorch),并配置训练脚本指向虚拟GPU进行计算加速。
此外,由于安全性和性能考量,GPU虚拟化通常需要精细的权限管理和资源调度策略,确保各虚拟机间的隔离性和公平性。