GPU 简介和 NVIDIA P100 KVM虚拟机使用直通模式获取设备
1. 简介:
对于GPU卡的物理机器,我们都知道,必然是几百G的内存,至少20核等超高配置,仅仅提供给一个用户来使用,太浪费资源了。 那么可以将在同一台机器上的GPU分出来提供给多用户使用,类似于CPU一样,可以提供给虚拟机使用,就将物理资源共享给了更多的用户。
2. 为何要使用GPU?为何不使用性能更强大的CPU?
GPU本身是作为显卡来使用,具有图形渲染等能力,但是对于图形图像等的处理,随着3D等技术的出现之后,计算机就特别吃计算资源了。
于是,nvidia 公司率先出了一款具有计算能力的GPU,使用GPU来部分分担CPU的计算能力,性能得到了质的飞越,于是,GPU向计算能力的发展时代就开始了。
随后,人工智能,深度学习等AI领域迅猛发展,例如人脸识别,那么要处理每秒处理成千上万张高清图片,或者数十万图片,极其消耗GPU资源了。打个比方,如果你在用个人电脑玩游戏,FPS,即每秒钟的帧数,能超过100已经是很好的显卡配置了,此时的画质等都还是在保证流畅的情况下得出的,可见,FPS是多么的吃GPU资源啊。
此时,GPU的高性能也在图形图像,并行计算,机器学习,等领域得到用武之地,其实纵观GPU的性能提升的发展方向,这些也是互相作用发展的最终结果。
GPU和CPU的对比结果图如下,
看下面两张图,如果CPU具有多核结构的话,例如最通用的2socket结构,具有了20个物理核心,然而GPU,以P100和V100为例,分别具有4000+个核心和5000+个核心的,我们都知道,在这些核心都能被充分利用的情况下,核心越多计算能力也越强。右图是他们的详细物理设备逻辑结构图,CPU具有控制器和运算器两部分构成,可以对OS上面复杂的任务,除了计算之外,还可以进行资源管理调度等。而GPU,是通过CPU将大量并行任务移交到GPU,GPU对重复任务进行并行执行,来提高了整体的性能。而GPU的数以千计的核,虽具有高性能计算能力,但是仍然离不开CPU这个大脑神经中枢。这就是为什么GPU具有特定的一些优势应用领域的原因。
2.虚拟化的方式
在了解了GPU与CPU的工作原理之后,接下来就是对GPU在VM中的使用,做一些介绍。
对于GPU而言,Linux内核版本,目前还不支持KVM的VGPU,意思就是,不能将GPU完全虚拟化,一块卡提供给多用户共享使用,所以,只能使用passthrough直通模式来提供给VM。但是在VMWARE以及XEN虚拟化中已经实现了VGPU的方式,在这两种虚拟化方式下,GPU是通过分片来提供给多用户使用的。
passthrough模式又是什么呢,passthrough直通,是将PCI插槽上的物理设备绕过OS层,直接提供给了VM。一般情况下PCI设备提供到VM,是需要经过OS层面的设备驱动,经过OS识别到该PCI设备,再将物理设备模拟提供给了VM。
如下图所示,依赖于Linux内核中的IOMMU模块,该功能项需要开启才能使用,IOMMU是IO内存管理单元,是将物理地址直接映射到了VM层面,DMA总线传递。在VM层面看到的该设备,就完全是一块物理卡。
4. passthrough直通模式的具体实现
我的实验环境是centos7.2
1).物理机打开IOMMU功能。编辑配置文件: /etc/default/grub , 在GRUB_CMDLINE_LINUX = “ xxx” 的值中,添加一项iommu=on,之后reboot,使其生效。这个是内核参数,只有重启才会重新加载内核才能生效。
2) 如果物理机没有安装nvidia驱动的话,比较好处理:直接可以使用,
我的实验环境已经存在了一台最基本的VM。
[[email protected] ~]# virsh list
Id Name State
----------------------------------------------------
2 vm-012 running
编辑它的xml文件添加如下内容,下面是我添加好之后查看的,
[[email protected] ~]# virsh dumpxml 2
<devices> …
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<addressdomain='0x0000' bus='0x04'slot='0x00' function='0x0'/>
</source>
</hostdev>
</devices>
重启VM。lspci |grep -i nvidia
可以看到已经具有了一张卡。
如果已经在物理机上面安装了nvidia驱动的话,在上述过程之前,需要首先将设备从物理机解除绑定,才能够直通给VM,所以还需要下面的一些前期工作:
echo "10de 15f8" >/sys/bus/pci/drivers/pci-stub/new_id ###这个号是设备ID,在lspci |grep -i nvidia 的时候,最后一项就是,第一个号码是PCI ID
echo 0000:04:00.0> /sys/bus/pci/devices/0000:04:00.0/driver/unbind ###为PCI的ID number
echo 0000:04:00.0 > /sys/bus/pci/drivers/pci-stub/bind ###为PCI的IDnumber
如果上述均执行成功,恭喜你,已经可以在VM中像在物理机使用GPU一样了。
注:每个字都是版本凭积累然后总结,辛苦打出来的,版权所有。