基于libvirt创建vGPU实例

2023-05-16

目录

一、什么是vGPU?

二、为什么需要vGPU?

三、架构及原理

四、Libvirt创建vGPU虚机

1、物理环境准备,服务器接入pGPU物理卡

2、升级最新kernel、libvirt、qemu

3、服务器部署vgpu-kvm驱动

4、mdev设备的创建

5、mdev设备删除

6、libvirt vGPU实例创建

7、搭建NVIDIA License Server(linux)


一、什么是vGPU?

vGPU,即虚拟GPU,是基于GPU的虚拟化技术,提供了在云服务器上搭载虚拟GPU的能力。

通过GPU虚拟化,多个虚机可以共享使用同一个物理GPU,可以降低成本、提升可扩展性。

 

二、为什么需要vGPU?

1、价格低

对用户来说,物理GPU价格偏高,针对GPU使用率不高的应用场景,选择vGPU更合适。

2、提高利用率

在云计算应用场景下,虚拟机需要使用vGPU实现VDI、循环计算等应用,出于成本考虑,一般不会让每个虚机都分配一个GPU硬件,此时就需要对GPU卡进行分片,即vGPU在hypervisor层实现GPU的虚拟化

3、应用场景灵活

vGPU可以针对不同类型的物理GPU卡,划分不同类型的粒度切割,根据应用场景选择不同类型不同粒度的vGPU卡,例如Tesla-T4、Tesla-V100分别适用于不同的场景。

 

三、架构及原理

 

四、Libvirt创建vGPU虚机

1、物理环境准备,服务器接入pGPU物理卡

BIOS开启vt-d(Internel I/O虚拟化技术);

配置raid,部署计算节点iso(基于CentOS7)

2、升级最新kernel、libvirt、qemu

1)systemd禁用ksm、ksmtuned

KSM(Kernel Samepage Merging)内核中的一种内存共享机制,2.6.32引入,允许系统通过合并相同内存页面,减少冗余。

2)kernel开启iommu

修改 /etc/default/grub, 在"GRUB_CMDLINE_LINUX ”选项中添加"intel_iommu=on iommu=pt"

重启服务器后,/sys/kernel/iommu_groups/目录不为空

3)reload driver

修改 /etc/default/grub  , 在"GRUB_CMDLINE_LINUX ”选项的末尾添加“rdloaddriver=mlx5_core rdloaddriver=i40e rdloaddriver=ixgbe”

4)重新生成grub.cfg

grub2-mkconfig -o /boot/grub2/grub.cfg

5)设置内存大页

6)vfio相关驱动加载

在/etc/rc.local中初始化加载相关模块,或者直接执行以下命令生效:

modprobe vfio_pci

modprobe vfio_mdev

扩展:

mdev.ko是mdev core模块,包括了mdev的绝大多数核心功能。该模块在Device Model中定义了一种新的Bus即mdev总线,而vfio_mdev.ko则是定义了mdev总线上的一种Driver,用来实现和VFIO的对接,换句话说就是起到和vfio-pci驱动相同的作用。

7)重启使内核生效

验证是否生效的方法(现象顺序依赖):
物理机识别NVIDIA设备;
vifo设备正常加载;
iommu_groups目录不为空;
virsh命令可看到mdev设备

[root@compute-gpu vgpufile]# lspci | grep 3D 
3d:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
3e:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
40:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
41:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
b1:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
b2:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
b4:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
b5:00.0 3D controller: NVIDIA Corporation Device 1eb8 (rev a1)
[root@compute-gpu ~]# ll /dev/vfio/vfio
crw-rw-rw- 1 root root 10, 196 Apr  2 15:07 /dev/vfio/vfio
[root@compute-gpu ~]# ls /sys/kernel/iommu_groups/
0  10  12  14  16  18  2   21  23  25  27  29  30  32  34  36  38  4   41  43  45  47  49  50  52  54  56  58  6   61  63  65  67  69  70  72  74  76  78  8   81  83  85  87  89  90  92  94  96
1  11  13  15  17  19  20  22  24  26  28  3   31  33  35  37  39  40  42  44  46  48  5   51  53  55  57  59  60  62  64  66  68  7   71  73  75  77  79  80  82  84  86  88  9   91  93  95  97
[root@compute-gpu ~]# virsh nodedev-list | grep mdev
mdev_889d09aa_b35b_4aba_bec6_ad581bc77401
mdev_cddff9f1_3ffb_4fb1_a1fd_24b3a2c5f8d0
mdev_f772d728_bf12_4d88_bf7d_990b802cd185
[root@compute-gpu ~]# virsh nodedev-dumpxml mdev_889d09aa_b35b_4aba_bec6_ad581bc77401
<device>
  <name>mdev_889d09aa_b35b_4aba_bec6_ad581bc77401</name>
  <path>/sys/devices/pci0000:3a/0000:3a:00.0/0000:3b:00.0/0000:3c:00.0/0000:3d:00.0/889d09aa-b35b-4aba-bec6-ad581bc77401</path>
  <parent>pci_0000_3d_00_0</parent>
  <driver>
    <name>vfio_mdev</name>
  </driver>
  <capability type='mdev'>
    <type id='nvidia-319'/>
    <iommuGroup number='95'/>
  </capability>
</device>

3、服务器部署vgpu-kvm驱动

1)上传驱动到物理服务器,并安装

# ./NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run

2)配置DISABLED Toggle ECC support

# nvidia-smi -e 0

3)配置Set persistence mode ENABLED

# nvidia-smi -pm 1

执行过程:

[root@compute-gpu vgpufile]# file NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run 
NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run: data
[root@compute-gpu vgpufile]# chmod +x NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run 
[root@compute-gpu vgpufile]# ./NVIDIA-Linux-x86_64-430.67-vgpu-kvm.run -s
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 430.67...........................................................................................................................................................................................................
[root@compute-gpu vgpufile]# nvidia-smi -e 0
Disabled ECC support for GPU 00000000:3D:00.0.
Disabled ECC support for GPU 00000000:3E:00.0.
Disabled ECC support for GPU 00000000:40:00.0.
Disabled ECC support for GPU 00000000:41:00.0.
Disabled ECC support for GPU 00000000:B1:00.0.
Disabled ECC support for GPU 00000000:B2:00.0.
Disabled ECC support for GPU 00000000:B4:00.0.
Disabled ECC support for GPU 00000000:B5:00.0.
All done.
Reboot required.
[root@compute-gpu vgpufile]# nvidia-smi -pm 1
Enabled persistence mode for GPU 00000000:3D:00.0.
Enabled persistence mode for GPU 00000000:3E:00.0.
Enabled persistence mode for GPU 00000000:40:00.0.
Enabled persistence mode for GPU 00000000:41:00.0.
Enabled persistence mode for GPU 00000000:B1:00.0.
Enabled persistence mode for GPU 00000000:B2:00.0.
Enabled persistence mode for GPU 00000000:B4:00.0.
Enabled persistence mode for GPU 00000000:B5:00.0.
All done.
[root@compute-gpu vgpufile]# 

4、mdev设备的创建

选定物理GPU初始化的vGPU类型,并写入对应的mdev设备中

1)查看服务器上所有的GPU设备,可以用脚本遍历获取所有物理GPU设备列表

lspci命令过滤,获取所有GPU物理设备的pci设备识别号,例如:3d:00.0、3e:00.0 .....

2)获取每个物理GPU对应vGPU支持的所有类型vgpu_types,例如:nvidia-222、nvidia-223 .....

3)mdev设备的创建方法

通过向/sys/devices/<device path>/mdev_supported_types/<type id>/create输入一个UUID,就可以创建一个<type id>类型的Mediated Device。

例如:向/sys/bus/pci/devices/0000:3d:00.0/mdev_supported_types/nvidia-319/create中注入一个UUID:889d09aa-b35b-4aba-bec6-ad581bc77401,则表示创建一个类型为nvidia-319的mdev设备,设备uuid为:889d09aa-b35b-4aba-bec6-ad581bc77401,设备name为:T4-4C。

4)随机生成的uuid,写入选中的vgpu type目录下的create文件中,uuid写入方式有以下两种:

a,自定义shell脚本实现 ;

b,openstack实现,nova读取配置文件中的nvidia类型,生成uuid写入对应create

    例如:配置管理员准备给第一个物理GPU设备,配置vgpu类型为"nvidia-319",对应name为"T4-4C"的vGPU,那么,把随机生成的uuid: 889d09aa-b35b-4aba-bec6-ad581bc77401,写入/sys/bus/pci/devices/0000:3d:00.0/mdev_supported_types/nvidia-319/create文件中。

    创建虚机时,xml中mdev标签地址指定此uuid,则创建的虚机就可以直接识别到此vGPU设备。

5、mdev设备删除

销毁mdev设备,只需要向设备对应路径的remove文件中写入1即可,格式如下:

# echo 1 > /sys/bus/mdev/devices/$mdev_UUID/remove
# echo 1 > /sys/bus/mdev/devices/83b8f4f2-509f-382f-3c1e-e6bfe0fa1001/remove

remove 文件是只写文件,往其中写”1″会销毁mdev设备。

如果该mdev设备正在使用,且该供应商驱动程序不支持热拔插,那么直接写入remove会调用失败。可以先执行关机再删除。

6、libvirt vGPU实例创建

1)libvirt创建实例的xml中,添加vGPU对应mdev设备信息,注入mdev设备对应的uuid,然后使用virsh create --file命令,指定xml文件创建vGPU实例。

vGPU本质上是mdev设备,因此xml中定义的类型:  type='mdev'

mdev设备的唯一标识符则是uuid,因此 xml中有:  <address uuid='889d09aa-b35b-4aba-bec6-ad581bc77401'/>

......
    <hostdev mode='subsystem' type='mdev' managed='yes' model='vfio-pci' display='off'>
      <source>
        <address uuid='889d09aa-b35b-4aba-bec6-ad581bc77401'/>
      </source>
      <alias name='hostdev0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </hostdev>
......

2)在guest用户镜像中,安装NVIDIA的grid驱动。(若使用已部署好grid的用户镜像,则跳过)

下载驱动包到虚机镜像中;

修改权限: chmod +x NVIDIA-Linux-x86_64-430.30-grid.run

执行安装: ./NVIDIA-Linux-x86_64-430.30-grid.run 

重启生效: reboot

3)guest实例中配置连接licserver(需要提前搭建好本地的licenseServer虚机,并注入购买license,详见第6步)

    a.切换到/etc/nvidia目录:cd /etc/nvidia

    b.创建gridd.conf文件: cp gridd.conf.template gridd.conf

    c.在gridd.conf文件中添加license服务器信息

        i. ServerAddress=License服务器的IP

        ii. ServerPort=License服务器的端口(默认为7070)

        iii. FeatureType

(6)  systemctl restart nvidia-gridd

(7)  systemctl status nvidia-gridd //检查是否成功获取了license,若成功获取,显示:License acquired successfully.

至此,vGPU实例创建成功。

7、搭建NVIDIA License Server(linux)

1)NVIDIA官网申请临时测试License、或购买License【NVIDIA官网访问不稳定,用梯子】

2)若有已安装licenseServer的镜像,则跳过,直接用镜像部署License实例【生成license授权文件需要提供LicenseServer的mac地址】

(a)安装桌面版linux,配置不低于4c16G,有固定的ip和mac

(b)安装java运行时 # yum install java

(c)安装tomcat

# yum install tomcat tomcat-webapps

# systemctl enable tomcat.service && systemctl start tomcat.service

(d)下载license-server文件并安装

下载文件 Nvidia-ls-linux****.zip

# unzip  Nvidia-is-linux****.zip

# chmod +x setup.bin

安装setup.bin (可以图形化安装、可以命令行安装)

3)登录NVIDIA官网,使用申请的license,根据license-server的mac地址,创建licenseServer需要使用的授权文件license_****.bin

4)把license_****.bin文件导入License实例的8080服务页面。

获取的license文件license_****.bin,在http://localhost:8080/licserver页面上传导入。

 

参考:

https://docs.nvidia.com/grid/latest/grid-vgpu-user-guide/index.html#red-hat-el-kvm-install-configure-vgpu

https://www.kernel.org/doc/html/latest/driver-api/vfio-mediated-device.html

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于libvirt创建vGPU实例 的相关文章

随机推荐

  • android 解放双手 自动化生成多语言strings内容

    本文主要基于jxl jar 自动解析Excel xls文件内容 xff0c 生成values 文件夹及strings xml文件 资源文件 xff1a 代码及jxl jar下载 只能支持97 2003的Excel xls xff0c 不适配
  • 解决Ajax发送DELETE请求时无法传参数的问题

    相信大家使用spring 时一般都会用ajax发送delete请求 xff0c 但是delete请求无法传参数怎么办呢 xff1f 请看下面链接 http stackoverflow com questions 10766195 sprin
  • 基础SQL教程

    转载自廖雪峰老师的教程 xff1a SQL教程 廖雪峰的官方网站 一 概述 简单地说 xff0c SQL就是访问和处理关系数据库的计算机标准语言 数据据库作为一种专门管理数据的软件 应用程序不需要自己管理数据 xff0c 而是通过数据库软件
  • 初识BoTNet:视觉识别的Bottleneck Transformers

    初识BoTNet xff1a 视觉识别的Bottleneck Transformers 杂谈 最近 xff0c 我的思想有点消极 xff0c 对自己的未来很迷茫 xff0c 不知道要从事什么 xff0c 又在担心行业的内卷严重 xff0c
  • PTA-c语言 求n个数的最大值、最小值、平均值

    从键盘输入n xff08 3 lt 61 n lt 61 20 xff09 个整数 xff0c 求出这n个数的最大值 最小值 平均值 xff08 平均值保留2位小数 xff09 输入格式 在第一行输入一个介于3至20之间的整数n xff0c
  • debian10.9离线安装haproxy(附离线安装包)

    废话不多说 xff0c 上步骤 xff08 文末有惊喜 xff09 1 下载安装包 xff0c 安装包如下 xff1a 2 copy到相关安装目录 xff1a root 64 debian opt haproxy ls l total 13
  • 常见的排序方法—选择排序

    2 选择排序 2 1基本思想 xff1a 每一次从待排序的数据元素中选出最小 xff08 或最大 xff09 的一个元素 xff0c 存放在序列的起始位置 xff0c 直到全部待排序的 数据元素排完 span class token com
  • powersave/performance governor study

    这个governor是最省电模式 xff0c 即cpu中所有的core都处在最低频率运行 如果是存在cpu hotplug driver的话 xff0c 那么还可以更加的省电 xff0c 即只存在一个core是online状态的 xff0c
  • Ubuntu18.04下使用woeusb制作Windows启动盘

    第一步 xff1a 安装woeusb sudo add apt repository ppa nilarimogard webupd8 sudo apt update sudo apt install woeusb 第二步 xff1a 安装
  • Android碎碎念6:位运算总结

    来源菜鸟教程 xff1a https www runoob com w3cnote bit operation html 一 位运算概览 符号描述运算规则 amp 与两个位都为1时 xff0c 结果才为1 或两个位都为0时 xff0c 结果
  • Ubuntu20.04(18.04通用)禁用nouveau,安装NVIDIA显卡驱动

    卸载其它版本NVIDIA驱动 sudo apt get purge remove nvidia sudo apt autoremove 禁掉nouveau 打开文本形式 sudo gedit etc modprobe d blacklist
  • debian 开机启动 运行命令或脚本文件(较详细)

    开机启动 xff1a 本文以leanote的开机启动和随身WiFi切换usb otg并挂在U盘为例 xff0c 内容比较详细 xff0c 带命令内容和操作内容 1 跳转到对应位置 xff08 etc init d xff09 cd etc
  • linux环境配置以及远程登录linux

    x1f416 前言 linux是什么 xff1f linux是一个开源的操作系统 更高效 xff0c 更安全 xff0c 更稳定 xff0c 并且对于我们程序员来说是十分重要的 为什们使用 linux 我们其实可以把这个跟 windows做
  • word公式转化为mathtype及相关报错:Error message: Problem Converting OMML to MathML

    选择转换公式 xff0c 然后 在要转换的类型选1 2 4 xff1b 若出现问题 则 xff1a 首先 xff0c 验证文件是否存在 文件的位置取决于Office版本和Windows版本 xff0c 以及是否是64位的 xff1a Wor
  • kubeadm安装k8s高可用集群

    k8s资源配置清单生成器 https k8syaml com nginx代理配置 代理IP xff1a 192 168 41 10 vim etc nginx nginx conf stream span class token punct
  • CSS元素选择器

    一 标签选择器 xff1a 标签 lt input type 61 39 text 39 class 61 39 input 39 id 61 39 inp 39 gt 举例 xff1a input 所有input标签 二 类选择器 xff
  • 算法题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半

    一 序言 xff1a 今天在逛C站的时候 xff0c 突然发现一篇这样的文章 算法题 xff1a 一球从100米高度自由落下 xff0c 每次落地后反跳回原高度的一半 勾起了我的兴趣 xff08 就像小学生看见了加减法的题目 xff0c 很
  • 如何解决数据科学计数法在数据库中的显示

    实际问题是数据类型转换的问题 xff1a xff1a CAST 准考证号 AS decimal 11 0 转载于 https www cnblogs com Eaglery p 5124828 html
  • vs 2015 update 3各版本下载地址

    微软在06月27日发布了Visual Studio 2015 Update 3 在MSDN中微软也提供下载 xff0c 而且MSDN的Visual Studio 2015 Update 3与官方免费下载的文件是一致的 xff0c 只是文件名
  • 基于libvirt创建vGPU实例

    目录 一 什么是vGPU xff1f 二 为什么需要vGPU xff1f 三 架构及原理 四 Libvirt创建vGPU虚机 1 物理环境准备 xff0c 服务器接入pGPU物理卡 2 升级最新kernel libvirt qemu 3 服