虚拟化相关面试题集锦(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资源。

官方文档:

  • 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特性。

# 安装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硬件。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图论练习5

Going Home Here 解题思路 模板 二分图最优匹配&#xff0c;前提是有完美匹配&#xff08;即存在一一配对&#xff09;左右集合分别有顶标&#xff0c;当时&#xff0c;为有效边&#xff0c;即选中初始对于左集合每个点&#xff0c;选择其连边中最优的&#xff0c;然后对于每…

Sqli-labs靶场第18关详解[Sqli-labs-less-18]自动化注入-SQLmap工具注入

Sqli-labs-Less-18 通过测试发现&#xff0c;在登录界面没有注入点&#xff0c;通过已知账号密码admin&#xff0c;admin进行登录发现&#xff1a; 返回了User Agent&#xff0c;设想如果在User Agent尝试加上注入语句&#xff08;报错注入&#xff09;&#xff0c;测试是否会…

react hooks useReducer使用

在React中&#xff0c;useReducer是一个用于管理组件状态的Hook&#xff0c;它特别适用于处理复杂的状态逻辑和多个相关状态。这个Hook接收一个reducer函数&#xff08;与Redux中的reducer概念类似&#xff09;和一个初始状态作为参数&#xff0c;并返回一个新的state值以及一个…

Unity中关于继承ScriptableObject的类

在游戏中我们会经常看到一些.asset的配置文件&#xff0c;而这些文件就是用一个自定义的类去继承ScriptableObject来生成的。比如当前有一些零散特效需要预加载&#xff0c;这个时候我们可以声明一个类去保存这些零散特效对象的信息&#xff0c;然后统一读取加载。 代码&#…

JavaScript极速入门(1)

初识JavaScript JavaScript是什么 JavaScript(简称JS),是一个脚本语言,解释型或者即时编译型语言.虽然它是作为开发Web页面的脚本语言而著名,但是也应用到了很多非浏览器的环境中. 看似这门语言叫JavaScript,其实在最初发明之初,这门语言的名字其实是在蹭Java的热度,实际上和…

.jsonl 格式文件的解释

根据 CHATGPT .jsonl 文件格式是一种文本文件格式&#xff0c;通常用于存储每行一个JSON对象的数据。.jsonl 文件的每一行都是一个独立的JSON对象&#xff0c;这些对象之间没有任何分隔符。 以下是一个示例.jsonl文件的内容&#xff1a; {"name": "John"…

【LeetCode】876_链表的中间结点_C

题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 示例 提示&#xff1a; 链表的结点数范围是 [1, 100]1 <…

Subversion svn 开源的版本控制系统入门介绍 VCS

拓展阅读 Subversion 开源的版本控制系统入门介绍 VCS Git 开源的版本控制系统-01-入门使用介绍 Git 开源的版本控制系统-02-base usage 基本用法 Git 开源的版本控制系统-03-时间数据回溯 Git 开源的版本控制系统-04-branch manage 分支管理 Git 开源的版本控制系统-05-…

SpringBoot使用Jackson 序列化小妙招

前言 SpringBoot默认使用Jackson进行json数据的序列化&#xff0c;在这个过程中总会有些奇奇怪怪的需求&#xff0c;对于这些小需求要么增加一堆配置类&#xff0c;要么重写方法&#xff0c;其实都有点杀鸡用牛刀了&#xff0c;那么我来列举下日常开发中这些小需求如何通过配置…

UE5数字孪生系列笔记(一)

智慧城市数字孪生系统 虚幻引擎连接数据库 将自己的mysql版本的libmysql.dll替换掉插件里面的libmysql.dll 然后将这个插件目录复制到虚幻项目目录下 然后添加这个插件即可 新建一个UMG&#xff0c;添加一个按钮试试&#xff0c;数据库是否连接 将UI添加到视口 打印是否连接…

力扣爆刷第87天之hot100五连刷21-25

力扣爆刷第87天之hot100五连刷21-25 文章目录 力扣爆刷第87天之hot100五连刷21-25一、240. 搜索二维矩阵 II二、160. 相交链表三、206. 反转链表四、234. 回文链表五、141. 环形链表 一、240. 搜索二维矩阵 II 题目链接&#xff1a;https://leetcode.cn/problems/search-a-2d-…

前端每日一练 :相邻元素、嵌套元素Margin 塌陷、合并问题如何额解决?

相邻元素外边距塌陷合并 表现示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</t…

Python与FPGA——sobel边缘检测

文章目录 前言一、sobel边缘检测二、Python sobel边缘检测三、FPGA sobel边缘检测总结 前言 边缘存在于目标、背景区域之间&#xff0c;它是图像分割所依赖的较重要的依据&#xff0c;也是图像匹配的重要特征。边缘检测在图像处理和计算机视觉中&#xff0c;尤其在图像的特征提…

LVS----DR模式

一、LVS-DR工作原理 1、LVS-DR数据包流向分析 客户端发送请求到Director Server (负载均衡器)&#xff0c;请求的数据报文&#xff08;源IP是CIP&#xff0c;目标IP是VIP&#xff09;到达内核空间。Director Server 和Real Server 在同一个网络中&#xff0c;数据通过二层数据…

turtle海龟画图

10. 画笔设置 1. 画笔设置 海龟库绘制时的线条是可以设置的&#xff0c;例如画笔的颜色&#xff0c;方法名如下&#xff1a; 方法名方法说明.pencolor(‘red’)设置画笔颜色&#xff0c;例如红色 import turtle #导入海龟图库 turtle.shape(turtle) #召唤海龟 turtle.pencolo…

【vue3之组合式API及其新特性】

组合式API及其新特性 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1.侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、…

Java开发从入门到精通(一):Java的基础语法进阶

Java大数据开发和安全开发 &#xff08;一&#xff09;Java注释符1.1 单行注释 //1.2 多行注释 /* */1.3 文档注释 /** */1.4 各种注释区别1.5 注释的特点1.5 注释的快捷键 &#xff08;二&#xff09;Java的字面量&#xff08;三&#xff09;Java的变量3.1 认识变量3.2 为什么…

(亲测可用)Adobe Photoshop 2024下载与安装

背景介绍&#xff1a;Adobe Photoshop 2024 是全球最受欢迎的图像编辑软件之一&#xff0c;2024年的版本带来了一系列令人印象深刻的功能&#xff1a; AI增强的自动选择和蒙版工具&#xff1a;现在&#xff0c;用户可以更轻松地选择和处理复杂的图像元素。更多的3D渲染功能&…

vue-treeselect的下拉列表中的字体样式修改

vue-treeselect的文件为&#xff1a;riophae/vue-treeselect/dist/vue-treeselect.css 打开这个文件&#xff0c;找到css的类.vue-treeselect__menu&#xff0c;默认值为&#xff1a; .vue-treeselect__menu { cursor: default; padding-top: 5px; padding-bottom: 5px; displ…

1、let、const、var区别、解构赋值、新增字符串语法、数组方法、网址组成

一、let、const、var的区别* 1、let和var的区别 相同点&#xff1a; 在全局声明的就是全局变量&#xff0c;在局部声明的变量是局部变量不同点&#xff08;4条&#xff09;&#xff1a; let声明的变量不能提升let声明的变量名不能重复声明let声明的变量只在当前的块作用域中有…