Openstack GPU Passthrough

摘要

随着人工智能概念的火热,越来越多的云平台客户开始对Gpu透传表现出浓厚的兴趣(对比之下,最开始研究GPU透传的老外们大多是为了能在自己的服务器上玩游戏)。这里将介绍一下我配置GPU透传的过程。

一、万恶的Nvidia

思来想去,还是把这段话放在最前面,以表示我对Nvidia的痛恨。要是用AMD显卡,这项工作我至少能省两天的工作量。在显卡行业处于垄断地位的Nvidia,不知是出于何种目的,在它的驱动中会禁止显卡在Kvm虚机中工作,所以Gpu Passthrough的很大一项工作就是寻找办法将Nvidia骗过去。顺便套用老外写的一句话,我自己花钱买的显卡,怎么用是我自己的事情,为毛不让我在Kvm虚机中使用?

二、显卡型号

不是所有的显卡都支持GPU透传,截至到2018年,Nvidia官方文档中,支持Gpu透传的显卡如下:

除此之外,还需要考虑服务器能否支持这些类型的显卡。我这边测试使用的是M2000显卡,仅在浪潮NF5280M4和Dell R730上支持。另外还得注意显卡是全高还是半高。M2000是全高显卡,所以只能插在横向PCI扩展槽位上。

三、物理机配置

如果显卡和服务器能匹配上,那么在服务器上通过lspci命令可以直接看到显卡(不需要安装驱动)。如果看不到,恭喜你,那就是服务器主板不支持该显卡。

之后要做的事情:开启iommu,加载vfio内核,解绑nouveau驱动。至于VT-d什么的,都2018年了,服务器应该都默认开启了吧。网上的参考资料很多,我主要参考了这篇帖子OpenStack Pike版本+KVM+Passthrough+NVIDIA显卡1060透传。稍微有点不一样的地方在于,考虑到服务器重启后虚机要自动重新绑定显卡,所以得加上开机启动脚本,将显卡解绑的操作在开机后自动做掉。另外一个区别是我用的docker容器,有一些文件夹得做目录映射。这是一个见招拆招的过程,这里不再详述。

四、Openstack配置

首先尽量使用P版本,我测试时使用的是M版本,有很多配置不支持,得手工从P版本反合M版本。

修改Controller的Nova配置如下:

修改Compute的Nova配置如下:

尽量使用高版本的qemu,我测试时用的2.6.0和2.10.0。Libvirt版本是2.0.0。

Compute安装OVMF 这里有个很傻的地方在于,最新的OVMF包安装之后,引导文件生成于/usr/share/edk2.git/ovmf-x64/目录。而M版本的Nova没有去调用libvirt的配置文件,而是写死了去读取/usr/share/OVMF/目录。所以得手工把文件拷贝到/usr/share/OVMF/目录下。

设置flavor

openstack flavor set m1.large --property "pci_passthrough:alias"="M2000:1"
openstack flavor set m1.large --property "capabilities:boot_mode"="uefi"

镜像打上标签: img_hide_hypervisor_id=true hw_firmware_type=uefi

UEFI镜像制作参考KVM 开启UEFI支持

五、虚机安装驱动

虚机正确的打开方式如图:

然后这个设备就是我们透传进去的显卡

安装驱动后跑分结果

六、虚机安装驱动

展示一下高端的卡,一个月工资都买不起一块,桑心

动态Attach,Detach都是可以的

Win10里的效果(这卡一般不是Windows用的,所以没装驱动)

七、过程中遇到的坑

  • 服务器不支持GPU卡
  • 内核不支持GPU卡
  • Openstack版本低
  • Windows镜像驱动装不上
  • Centos镜像引导不起来

以上