虚拟化相关面试题集锦(1)—— 如何在QEMU/KVM中跑通AI相关训练

接前一篇文章:虚拟化相关面试题集锦(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 GPUAMD的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资源。

官方文档:

(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虚拟化通常需要精细的权限管理和资源调度策略,确保各虚拟机间的隔离性和公平性。

相关推荐
聪明的笨猪猪1 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
聪明的笨猪猪2 小时前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
苏打水com2 小时前
JavaScript 面试题标准答案模板(对应前文核心考点)
javascript·面试
南北是北北6 小时前
JetPack WorkManager
面试
uhakadotcom7 小时前
在chrome浏览器插件之中,options.html和options.js常用来做什么事情
前端·javascript·面试
想想就想想7 小时前
线程池执行流程详解
面试
程序员清风8 小时前
Dubbo RPCContext存储一些通用数据,这个用手动清除吗?
java·后端·面试
南北是北北9 小时前
JetPack ViewBinding
面试
南北是北北9 小时前
jetpack ViewModel
面试
渣哥9 小时前
Lazy能否有效解决循环依赖?答案比你想的复杂
javascript·后端·面试