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](../../_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 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。
图形卡:
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 开发的 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驱动 。
(我后来发现我的P10无需unlcok,所以实际都没有做 )卸载 安装NVIDIA Linux驱动 :
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
:
sudo su -
cd /opt
git clone https://github.com/DualCoder/vgpu_unlock
chmod -R +x vgpu_unlock
安装
dkms
等:
apt update && apt upgrade
apt install dkms python3 python3-pip
pip3 install frida
安装
NVIDIA GRID vGPU驱动需要以 动态内核模块支持(DKMS) 模块方式安装(我重新安装了一遍):
./NVIDIA-Linux-x86_64-510.85.03-vgpu-kvm.run --dkms
按照 DualCoder/vgpu_unlock 提供对应文件修改以下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驱动。
参考
vGPU_Unlock Wiki 详细的
vgpu_unlock
使用文档Proxmox 7 vGPU – v2 提供了详细的Proxmox 7配置vGPU步骤,采用 NVIDIA GPU驱动460.73.01在消费级GPU上激活vGPU功能
NVIDIA License System (NLS) – General Availability 解释了NVIDIA的license系统工作方式,实际上客户自己安装的license server是NVIDIA的云license Server的一个转发代理