vgpu_unlock

NVIDIA不允许在消费级GPU上使用vGPU功能,但是实际上硬件是完全支持的。所以开源软件 DualCoder/vgpu_unlock 通过软件方式解锁了消费级NVidia vGPU功能。

NVIDIA Virtual GPU (vGPU) 是一种数据中心针对Tesla和Quadro卡的虚拟化技术,面向 VDI(Virtual Desktop Infrastructure)市场,让用户能够采用远程桌面解决方案进行工作。远程运行的应用包括CAD/CAM软件,游戏,建筑设计以及其他图形加速程序。

NVIDIA Virtual GPU (vGPU) 为虚拟机带来了完全的图形加速,并且数据中心中运行的虚拟机可以轻易迁移并提供给用户。

../../_images/architecture-grid-vgpu-overview.png

NVIDIA vGPU架构

对于在Windows或Linux虚拟机的图形加速, NVIDIA Virtual GPU (vGPU) 是非常适合的技术。

vGPU unlock和license

我最初没有理解 NVIDIA vGPU的licese,以为我购买的二手 Tesla P10 需要使用vGPU unlock才能启用vGPU功能。 通过对比阅读文档,原来 DualCoder/vgpu_unlock 只是为消费级显卡解锁vGPU功能开发的。也就是说,消费级显卡的核心和数据中心的数据卡其实是一样的,但是被锁住了vGPU功能。vGPU unlock仅仅是解锁消费级显卡的vGPU功能。 很不幸,我购买的二手 Tesla P10似乎是一块P40的降级卡,内部关闭了vGPU支持 ,所以我还是尝试通过本文 vGPU unlock 方法来尝试激活vGPU支持。

对于 Tesla 这样的数据中心高端运算卡,通常本身就支持vGPU功能就是具备的,所以一般不需要使用 DualCoder/vgpu_unlock (我购买的 Nvidia Tesla P10 GPU运算卡 可能是特例)。

但是,NVIDIA Tesla 运算卡的vGPU功能依然需要通过NVIDIA licensing Server才能使用,这个licensing需要通过NVIDIA官方申请90天试用,非常麻烦。如果购买license,对于个人来说过于昂贵了。

备注

本文仅做整理记录,由于我使用 Tesla P10 运算卡,不是消费级显卡,所以没有必要 vGPU unlock

安装NVIDIA Virtual GPU Manager 过程中,我惊讶地发现 nvidia-vgpud 服务启动失败,并且提示 GPU not supported by vGPU at PCI Id: 0:82:0:0 DevID: 0x10de / 0x1b39 / 0x10de / 0x1217

这让我非常沮丧,似乎这块隐形卡是阉割了vGPU功能,需要采用 DualCoder/vgpu_unlock 来解锁功能

vgpu_unlock支持的硬件和软件

支持类型

vgpu_unlock支持类型

vGPU Type

OS

Use Case

License

Display

Notes

A-series

Windows, Linux

Virtual Applications

vApps

1280x1024, 1 display

Good for RDSH

B-series

Windows, Linux

Basic PC work

vPC

Up to 5K, 2 displays

45 FPS max

C-series

Linux

Compute server

vCS

Up to 4K, 1 display

CUDA Only

Q-series

Windows, Linux

ProfessionalWorkstation

vDWS

Up to 8K, 4 displays

CUDA, OpenGL

支持硬件

  • CPU和主板:

运行 vGPU/vgpu_unlock 需要硬件支持虚拟化扩展。也就是Intel平台的VT-X或者AMD平台的AMD-V。这样才能获得较好的VM性能。请注意需要在主机BIOS激活虚拟化支持。

在一些系统上要使用vGPU需要激活 IOMMU ,例如 Ampere GPU。

  • 图形卡:

vgpu_unlock支持图形卡

Nvidia vGPU cards

GPU Chip

vGPU unlock supported:

Tesla M10

GM107 x4

Most Maxwell 1.0 cards

Tesla M60

GM204 x2

Most Maxwell 2.0 cards

Tesla P40

GP102

Most Pascal cards

Tesla V100 16GB

GV100

Titan V, Quadro GV100

Quadro RTX 6000

TU102

Most Turing cards

RTX A6000

GA102

No

我在 HPE ProLiant DL360 Gen9服务器 上使用 Nvidia Tesla P10 GPU运算卡 属于 gp102 图形芯片,等同于 Tesla P40这块P10运算法无需解锁就具备vGPU功能Nvidia Tesla P10 GPU运算卡 实际 安装NVIDIA Virtual GPU Manager 时发现不支持vGPU,所以也尝试采用 vgpu_unlock 来实现vGPU功能开启。

支持操作系统

  • 物理主机:

    • Red Hat Enterprise Linux (certified by Nvidia for vGPU, tested kernel 4.18)

    • Proxmox VE (Tested kernel 5.4)

    • There may be more that we don’t explicitly list here.

对于 5.10-5.12 的内核,需要使用 rupansh/vgpu_unlock_5.12 补丁

更新: 对于任何内核版本高于 5.10 都需要使用补丁。但是需要注意内核5.13不能工作,建议不要使用5.13。对于内核版本较高的系统,可以自己使用 DualCoder/vgpu_unlock 提供的 Kernel module hooks: vgpu_unlock_hooks.c 做补丁,这样就能够解锁。( 参考 Was the vfio_mdev module removed from the 5.15 kernel? 已经有人按照 Proxmox 7 vGPU – v2 验证过 kernel 5.15是可行的)

Rust-based vgpu_unlock 提供了一个 Rust Atlas 开发的 vgpu_unlock ,可以和使用 python 开发的解锁互相参看(都是user space工具,核心没有区别)

  • Guest虚拟机:

    • Enterprise Linux distributions (RHEL, CentOS, Fedora)

    • Debian/Ubuntu (20.04 LTS)

    • Windows 10, 8.1, Server 2019 and 2016

备注

不建议在不受支持/未经认证的硬件上使用 vGPU,但是 vgpu_unlock 脚本依然可能会让某些N卡能够运行 vGPU 技术,不过采用开源技术需要自担风险。该 vgpu_unlock 项目是MIT授权,不提供任何保证。

备注

总之,尽可能使用NVIDIA官方提供的最新版本 vGPU 驱动,实在不行再使用 Virtual Machine with vGPU Unlock for single GPU desktop 提供的2021年4月版本驱动 ( vGPU架构 )

准备工作

之前我在服务器上 安装NVIDIA Linux驱动 ,所以物理主机上已经安装了 NVIDIA官方提供的 P40 驱动 。但是,对于vGPU则需要安装 NVIDIA GRID vGPU driver ,所以首先卸载原先 安装NVIDIA Linux驱动

卸载之前已经安装的NVIDIA Linux驱动,准备安装NVIDIA GRID vGPU驱动
sudo apt remove cuda-drivers
sudo apt autoremove
  • 从NVIDIA官方 NVIDIA vGPU Software (Quadro vDWS, GRID vPC, GRID vApps) 页面提供注册入口,可以注册一个试用账号获得90天试用licence(需要使用企业邮箱,注册以后大约24小时~48小时会收到登陆NVIDIA Licensing Portal的账号,这样就可以找到针对系统的驱动、license服务器安装程序以及用于激活的licenses

在NVIDIA的licensing portal网站,下载最新的Linux KVM vGPU驱动,这个驱动需要在物理主机和虚拟机上都要安装。

警告

我仔细阅读了网上文档,并且我自己尝试注册申请。但是,很不幸,NVIDIA对于企业级运算卡提供vGPU license是需要对接销售的。也就是你必须留下真实的联系方式,由NVIDIA销售联系你审核通过之后才会发送试用90天的license。这对于个人来说非常麻烦,我最终放弃了这个方式。

  • 下载 vgpu_unlock :

下载 vgpu_unlock
sudo su -
cd /opt
git clone https://github.com/DualCoder/vgpu_unlock
chmod -R +x vgpu_unlock
  • 安装 dkms 等:

安装dkms python3 python3-pip
apt update && apt upgrade
apt install dkms python3 python3-pip 
pip3 install frida

安装

使用DKMS方式安装NVIDIA vGPU驱动
./NVIDIA-Linux-x86_64-510.85.03-vgpu-kvm.run --dkms
修订4个NVIDIA文件
/lib/systemd/system/nvidia-vgpud.service
/lib/systemd/system/nvidia-vgpu-mgr.service
/usr/src/nvidia-<version>/nvidia/os-interface.c
/usr/src/nvidia-<version>/nvidia/nvidia.Kbuild

这里修订的4个文件按照 DualCoder/vgpu_unlock 提供的说明进行:

  • 修改 /lib/systemd/system/nvidia-vgpud.service ,将:

    ExecStart=/usr/bin/nvidia-vgpud
    

修改为:

#ExecStart=/usr/bin/nvidia-vgpud
ExecStart=/opt/vgpu_unlock/vgpu_unlock /usr/bin/nvidia-vgpud
  • 修改 /lib/systemd/system/nvidia-vgpu-mgr.service ,将:

    ExecStart=/usr/bin/nvidia-vgpu-mgr
    

修改成:

#ExecStart=/usr/bin/nvidia-vgpu-mgr
ExecStart=/opt/vgpu_unlock/vgpu_unlock /usr/bin/nvidia-vgpu-mgr
  • 然后重新加载:

    systemctl daemon-reload
    
  • 修改 /usr/src/nvidia-<version>/nvidia/os-interface.c ,将以下行添加到文件开头的 #include 行下面:

    #include "/opt/vgpu_unlock/vgpu_unlock_hooks.c"
    
  • 修改 /usr/src/nvidia-<version>/nvidia/nvidia.Kbuild 在文件最后添加以下行:

    ldflags-y += -T /opt/vgpu_unlock/kern.ld
    
  • 移除nvidia内核模块:

    dkms remove -m nvidia -v <version> --all
    
  • 使用dkms重新build nvidia内核模块:

    dkms install -m nvidia -v <version>
    
  • 重启系统

  • 果然,在采用了 vgpu_unlock 之后,再次检查 nvidia-vgpud.service 就可以看到正常运行的状态:

采用 vgpu_unlock 之后 nvidia-vgpud.service 能够正常运行显示状态
○ nvidia-vgpud.service - NVIDIA vGPU Daemon
     Loaded: loaded (/lib/systemd/system/nvidia-vgpud.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Sat 2023-06-10 00:14:29 CST; 1s ago
    Process: 3815 ExecStart=/opt/vgpu_unlock/vgpu_unlock /usr/bin/nvidia-vgpud (code=exited, status=0/SUCCESS)
    Process: 3855 ExecStopPost=/bin/rm -rf /var/run/nvidia-vgpud (code=exited, status=0/SUCCESS)
   Main PID: 3819 (code=exited, status=0/SUCCESS)
        CPU: 449ms

Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: BAR1 Length: 0x4000
Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: Frame Rate Limiter enabled: 0x1
Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: Number of Displays: 1
Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: Max pixels: 8847360
Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: Display: width 4096, height 2160
Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: License: NVIDIA-vComputeServer,9.0;Quadro-Virtual-DWS,5.0
Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: PID file unlocked.
Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: PID file closed.
Jun 10 00:14:29 zcloud.staging.huatai.me nvidia-vgpud[3839]: Shutdown (3839)
Jun 10 00:14:29 zcloud.staging.huatai.me systemd[1]: nvidia-vgpud.service: Deactivated successfully.

安装license服务器

如上文所述,NVIDIA销售联系并通过你的申请,你获得licensing Portal账号就可以下载90天试用license,以及license server下载。此时你可以参考 NVIDIA vGPU License服务器安装过程 自己部署一个licensing server,这样就能够试用vGPU功能。

详细安装license服务器见: 安装NVIDIA license服务器

物理服务器和虚拟都需要安装GRID驱动(也就是vGPU驱动),这个安装过程可以参考阿里云的 在GPU虚拟化型实例中安装GRID驱动(Linux) ,其中配置 /etc/nvidia/gridd.conf 添加license服务器访问配置,就可以激活vGPU。(注意,这个 gridd.conf 是Guest虚拟机内部配置,用于访问License Server才能激活虚拟机内部的vGPU功能)

备注

NVIDIA真是商业化非常强的公司,实际上消费级显卡和数据中心运算卡的GPU核心都是相同的,所谓GRID驱动其实应该就是CUDA驱动的”包装”,强制加上了vGPU检测。从网上文档来看,如果在虚拟机内部能够欺骗vGPU实例,就可以安装普通的GPU驱动。不过,确实非常折腾,仅仅为了获取一个企业级功能。

这个vGPU的license其实是一种商业策略,从技术上并没有为用户增加价值。其实在早期Vmware esxi 6.7系统,直接就可以试用Grid K1/K2的vGPU功能而无需license。但是现在NVIDIA应该是要求购买license才能试用GRID功能。

参考 Cheapest vsphere grid gpu without licensing costs from Nvidia 可以看到 K1/K2 不需要license就可以试用vGPU功能。

KrutavShah/vGPU_LicenseBypass 介绍了在Windows虚拟机中绕过vGPU license的方法,但是vGPU版本必须是14.1以及只能用于Windows虚拟机,原理是通过修订注册表实现将unlincesed时间从20分钟调整到1440分钟(1天),并且关闭了Nvidia驱动的license获得通知功能,并且每天凌晨3点重启一次Nvidia驱动。

参考