Proxmox Nvidia Telsa P4 显卡 vGPU 方案

转载声明
本文重度参考了 梓喵 的 “PVE+Tesla P4 vGPU All IN ONE NAS 折腾小记”,
遵照 CC BY-NC-SA 3.0 CN 协议转载, 在原文基础上有改动.
红色的内容, 除非特殊注明, 皆为我原创, 在 CC BY-NC-SA 3.0 协议下发布.

前言

最近弄了一张 Tesla P4 (小黄鱼 400 块钱出头) 的 GPU 装到服务器上, 一方面是它的性价比很高, (可能只有我认为), 第二个是这款 GPU 是单槽、半高卡, 而且无需外接供电线, 对 2U 的服务器特别友好.

下文的虚拟机默认为 Proxmox 7.3-4 +.

科普

Nvidia 显卡

NVIDIA 的显卡可以简单分为游戏显卡、专业显卡、数据中心显卡。

  • 游戏显卡大多数为 GeForce 系列显卡,如 GeForce RTX 3070 等。
  • 专业显卡大多数为 Quadro 系列及 NVIDIA RTX 系列显卡,如 Quadro RTX4000 等。
  • 数据中心显卡比较混乱,既有老 K2、Tesla,也有新的 AXX 系列。

一般情况下,硬件上同代的三种显卡都是同一种 GPU 架构。

TCC 和 WDDM

TCC 和 WDDM 是 NVIDIA 计算卡的两种模式, 运行 nvidia-smi 可以看到:

图片来源: https://help.didiyun.com/hc/kb/article/1410366/
  • TCC 模式: GPU 用于计算, 无法显示图形, 无需安装 vGPU 驱动, (需要安装 CUDA)
  • WDDM 模式: GPU 用于计算和显示, 需要安装 vGPU 驱动
图片来源: https://help.didiyun.com/hc/kb/article/1410366/

vGPU

数据中心卡一个特点是支持 GPU 虚拟化,即一个 GPU 划分多个 vGPU 分配给虚拟机使用,让每个虚拟机都有一个“独显”使用。

vGPU 虚拟的数量上限取决于物理 GPU 的显存, 比方说 8G 的显卡最多只能虚拟 8 个 1G 显存的 GPU 或者 4 个 2G 显存的 GPU.

不使用 vGPU 的话还可以直接直通整张显卡, 直接直通显卡不需要授权, 下文会讲.

vGPU 授权与校验

N 卡的 vGPU 采用硬件与 Guest 端授权分别销售的方式,且 Guest 端授权根据价位分成了几种不同的授权。

举个例子,你买了 1 张支持 vGPU 的显卡分配给四台 Guest 使用,四台 Guest 需要购买授权才能正常工作,授权验证针对每一台虚拟机 Guest。

Guest 授权分成了几种价位,对应着 A、B、C、Q 型 vGPU,几种 vGPU 支持的功能有差异,差异体现在 cuda 与图形接口支持、分辨率等方面。

在几种 vGPU 类型中,覆盖应用场景最广的 (性能最好的) 是 Q 型 vGPU,授权为 vWS。

在 Guest 安装的驱动程序软件中,需要填写合法的授权校验验证,否则 Guest 中的驱动程序只能工作 20 分钟,之后将强制限制显卡性能及显示帧数,使得应用程序无法正常运行。

根据 Nvidia 的文档, 20 分钟后会限制成 15 帧, CUDA 性能降低; 24 小时后会限制为三帧, CUDA 完全停止工作.

NVIDIA 默认采用的认证方案是 DLS, 需要你在本地部署一台 “认证服务器”. 在 2023 年 6 月后 NVIDIA 改成 CLS, 将本地的服务器改到了云端.

Spoofing

Spoofing 是通过改 pci_device_id 来实现将直通的设备伪装成另一个设备, 比方说将 GRID vGPU (驱动需要授权) 伪装成 Quadro vGPU (驱动不需要授权) , 直接安装 Quadro 的驱动. 但是 Spoofing 只支持 Windows 且不支持 CUDA.

vGPU-unlock

从硬件上来看,同代的数据中心显卡和消费者显卡 GPU 架构是一样的,只是驱动层限制了支持的特性。

vGPU-unlock 通过对数据中心 Host 驱动程序进行 path,通过改 id 等方式绕过了驱动层限制,使得普通消费者显卡也可以支持虚拟化;同时在 vGPU 启动前后进行 hook,绕过特定检查、汇报虚假结果等,使得虚拟机的 vGPU 能正常启动。

在数据中心卡上, vGPU 是默认解锁的, 因此 vGPU-unlock 没啥用, 特别在是 proxmox 内置了改 pci_device_id 的功能后.

vGPU License Bypass

vGPU License Bypass 是网上大神开发出来的方案, 原理是将原本只有 20 分钟的 GPU 试用通过修改注册表 / Linux 修改驱动的方法提高到 24 小时, 然后在 24 小时后重启驱动重新开始试用.

硬解

硬解一般针对于视频领域,指的是利用 GPU 等设备进行视频流解码,由于 GPU 有单独的处理单元及优化,因此视频解码速度很快。

N 卡的硬件解码/编码一般称为 NVENC/NVDEC,ffmpeg 调用硬解时,依赖 CUDA 支持。

总结

要让虚拟机能使用的起来显卡, 有下面几种方法:

方法名称优点缺点
直通整张显卡– 无需任何多余设置, 开箱即用
– 没有性能限制, 没有附加费用
– 只能在一个虚拟机上使用
申请 Free License– 官方支持, 无需折腾
– 可以使用最多 128 台 vWS 类型 vGPU 和 128 台 vAPP 类型 vGPU
– 试用 90 天后开始收费
– 无法使用个人邮箱注册
Spoofing– 没有性能限制, 没有附加费用– 只支持 Windows
– CUDA 无法使用
License Bypass– 没有性能限制, 没有附加费用
– Linux 和 Windows 同时可用
– 每 24 小时就要重启驱动

散热改造

直通该卡测试时我很快发现了问题, Tesla 显卡都是通过服务器内部的气流被动散热的, 问题是我为了减小噪音风扇都是开到最小, 而且也不存在一般机房的恒温环境, 所以一开游戏或者在转码视频的时候, 温度很容易就飙到了 60-70 度.

我在闲鱼上买了一个 Tesla P4 的涡轮扇外加 3D 打印的一个托盘. 其实在淘宝上打印一个也很简单, 但是我懒得烦了, 40 块钱包邮.

台达无刷涡轮扇 BFB0512HHA
DC 12V 0.24A

服务器主板上自然不可能有 3Pin 供电. 我尝试从板子上的迷你 4Pin (就是第一张图右上角的的黑色接口), 但是失败了. 去论坛上问了一圈并对照手册才发现 R720 是预留了磁带机和光驱的位置的, 这个接口是给磁带机供电的. 而 R720xd 上没有磁带机的位置, 因此这个接口也没有电.

升压模组, 用于控制升压的旋钮被线挡住了

于是我就去淘宝上买了一个 USB 可调升压模组, 手动把 5V 0.5 A 的 USB 2.0 升压到了 12V, 稍微有点超载, 但是服务器内部很凉快我相信它不会有事的 🙂

杜邦线买的是公对公的, 所以我就直接把两个公头焊在一起了

再次打开游戏跑分, 这次温度全程稳定在 50 度左右, 大成功.

vGPU 驱动下载

NVIDIA GRID (vGPU) 的驱动是不对外公开的, 需要注册并登陆一个 Portal 才能下载 (如何注册我会在下文提到). 下载一下本身是一件很容易的事情, 但是我非常吃惊的看到闲鱼上居然有人以此盈利. 用信息不对等盈利本身就不是一件光彩的事, 何况方法其实很简单.

所以我花了点时间将驱动上传到了 Github 上面, 下文提到的所有驱动, 都可以在这个 Repo 下载. (截至编写这段时, 该 Repo 已经包含了 12.0 后的所有平台的所有驱动, 如果你不是 Proxmox, 也可以在这个 Repo 找到你的驱动)

NVIDIA vGPU 驱动下载
https://github.com/justin-himself/NV-VGPU-Driver-Archive

方法零: 直通整张显卡

这个方法并没有用到 vGPU, 所以不需要对宿主机做任何改动, 只需要在虚拟机上安装对应的驱动即可.

选择你要配置显卡的虚拟机, 点击硬件 – 添加 – PCI 设备.

按照下图所示选择并配置你的显卡.

选择显卡

不要管 MDev 类型 (我还没有安装驱动, 所以框框不可用, 如果可以选择也不要管他), 不要勾选主 GPU (此卡没有输出), 勾选 PCI-Express (需要你的机器类型为 q35, 也许能增加速度). 另外几个框应该没有影响, 反正我是这么勾的.

配置显卡

虚拟机启动之后需要安装驱动. 在上文所述的 repo 里下载最新的 Windows 驱动, 然后安装到虚拟机上.

关于 Windows 驱动
取决于你的版本, 可能 Windows 驱动在 Guest Driver 目录里面. 这种情况下 Windows 驱动不应该作为 Host Driver 吗?
事实上呢, 因为 NVIDIA 偷懒, Windows 驱动的 Host 和 Driver 用的是一套驱动. 如果驱动发现是 Host 就不会有限制.
Linux 驱动我不敢保证, 应该不一样. 反正 NVIDIA 名字一样的驱动内容就是一样的.

安装完毕之后, 驱动会默认切换到 WDDM 模式, 并贴心的虚拟一个显示器 (打开显示设置可以看到). 安装远程桌面之后可以使用该显示器.

远程桌面我推荐 Parsec, Parsec 支持硬编码(Hardware Coding), 延迟、卡顿应该是我见过远程桌面中最低的一个, 特别适合打游戏.

想要云游戏, 但是没有声音?
安装 VB- Audio 虚拟声卡

到这里直通显卡就讲完了, 直通显卡 (作为宿主机) 无需收费, 不会有任何限制, 不过一张显卡只能直通给一个虚拟机. 还有就是如果你在 Proxmox 上也安装了 vGPU 的驱动, 如果显卡直通给某个虚拟机那这个驱动就会失效, 需要在你取消直通并重启驱动 (重启系统) 后 vGPU 功能才会正常运作.

安装 vGPU 驱动

如果你使用方法二、三、四, 那就是用到了 vGPU 功能, 需要在宿主机上安装对应的驱动.

步骤1:屏蔽开源驱动并安装依赖软件包

把下面几行追加到/etc/modules里,用于加载所需的内核模块:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

屏蔽开源驱动:

echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf

开启IOMMU:略 (不懂谷歌, 一般在 BIOS 里改设置)

安装依赖包:

apt install build-essential dkms pve-headers mdevctl

如果有的软件包找不到/拉不下,请添加清华大学的 pve 源。

如果后续 NVIDIA 驱动安装时报错找不到对应版本的 pve-headers/Linux-headers,使用如下命令安装匹配的版本:

apt install pve-headers-$(uname -r)

重启机器。

步骤2:Host 服务端驱动程序

从上面给的 repo 下载驱动程序, 我选择的版本是 14.1. 执行以下命令:

cd /opt
wget https://github.com/justin-himself/NV-VGPU-Driver-Archive/releases/download/14.1/NVIDIA-GRID-Linux-KVM-510.73.06-510.73.08-512.78.7z
7z x NVIDIA-GRID-Linux-KVM-510.73.06-510.73.08-512.78.7z
bash ./NVIDIA-GRID-Windows-510.73.08-512.78/NVIDIA-Linux-x86_64-510.73.06-vgpu-kvm.run

问要不要 register with DKMS, 选 yes, 以后如果更新 pve 也许要用到.
其余的一路按 Enter 就好.

如何卸载驱动
driver_name.run –uninstall
apt purge nvidia-*.

安装完之后执行 nvidia-smi, 如果驱动已经安装可以得到类似下面的输出:

$ nvidia-smi

Mon Jan  9 09:58:26 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.73.08    Driver Version: 510.73.08    CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla P4            On   | 00000000:05:00.0 Off |                    0 |
| N/A   39C    P8     6W /  75W |      0MiB /  7680MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

执行 mdevctl 应该得到以下输出. 如果没有输出重启后再试.

$ mdevctl types

0000:05:00.0
  nvidia-157
    Available instances: 4
    Device API: vfio-pci
    Name: GRID P4-2B
    Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=4
  nvidia-214
    Available instances: 4
    Device API: vfio-pci
    Name: GRID P4-2B4
    Description: num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=4
  nvidia-243
    Available instances: 8
    Device API: vfio-pci
    Name: GRID P4-1B4
    Description: num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=8
  nvidia-288
    Available instances: 2
    Device API: vfio-pci
    Name: GRID P4-4C
    Description: num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=4096x2160, max_instance=2

步骤3:划分 PCI-E 设备给虚拟机(Guest)

通过 PVE 图形界面给虚拟机分配 PCI 设备,选择显卡设备后,MDev 类型处选择 vGPU 模式。

该处的 MDev 字段,后面半段的数字为显存容量,字母为 vGPU 类型,由于前文已经介绍过 A、B、C、Q 类型 vGPU 区别,此处不再重复,选 Q 类型即可。

步骤4:Guest 安装客户端驱动程序

apt update && apt install gcc make linux-headers-uname -r

NVIDIA 在每个版本的驱动程序压缩包中都提供了客户端驱动程序,直接安装即可。

此时,你的 vGPU 就运行起来了。

授权问题

好了,我们的驱动已经装好了,是不是可以开始使用了呢?还不行。

上文谈到过,vGPU 授权是在客户机驱动程序上进行校验的,不授权只能使用 20 分钟。

为了解决授权问题,我们有三种方式:

  1. 向 NVIDIA 申请 90 天 free license,到期后购买 license
  2. Spoofing,在客户端中安装 Quadro 驱动程序
  3. 固定时间重启 NVIDIA 驱动程序(vGPU_LicenseBypass)

本人对三种方法及衍生都试了一遍,以下是主要结果。

方法一: 体验 Free License

获得试用

体验 License 需要在 Nvidia 的企业 Portal 注册, 链接在下面👇

NV 企业试用入口
点击进入

我参考的博主 @梓猫 没有注册成功, 大概是因为他的联系地址填的是中国, 被转到 NV 中国了. 接下来我介绍一下我的方法: (需要全程翻墙)

首先你需要一个自己的域名做域名邮箱. Gmail 这种个人邮箱不给过.
没有域名邮箱怎么办? 很简单, 找一个临时邮箱就好啦 🙂

去谷歌地图上, 随便点一个商户.

不好意思啦

然后把借来的资料填进去

点击 register, 完成.

不知道你看到这个博文的时候该方法有没有失效, 反正我不到一分钟就接到了邮件.

读书人的事…

点进去, 设置密码, 登陆. Boom!

这个方法应该是可以重复使用的, 比如 90天换个邮箱后再试用一次…

配置 Licensing Server

点击 CREATE SERVER , 输入名字并钩上 Experss CLS Installation.

添加显卡, 把两个都勾上, 数量打 128.

点击 Create Server, 图略.

Create 完之后会自动跳转, 点击右上角的 Actions – Generate client config token, 下载 token.

配置 Linux 虚拟机

Note
下面的内容源自 NVIDIA 的手册, 你可以在压缩包里找到 grid-licensing-user-guide.pdf 直接阅读原文.

装好 vGPU 驱动之后, 复制 NV 提供的 template 并编辑:

cp /etc/nvidia/gridd.conf.template /etc/nvidia/gridd.conf
vim /etc/nvidia/gridd.conf
  • 找到下面这行, 将 Feature Type 按照你自己 Pass Through 的类型修改, 保存退出
原本是 0, 我改为 2
  • 将之前下载的 token 上传到 /etc/nvidia/ClientConfigToken
    不要光复制文字, 复制整个文件! 复制整个文件! 复制整个文件!
    NV 在你下载的文件里嵌入了不可见字符, 直接复制文字会 verification failed
    .
  • 执行以下命令设定权限.
chmod 744 /etc/nvidia/ClientConfigToken/your_token_name.tok
  • 重启
reboot

配置 Windows 虚拟机

配置 Windows 虚拟机就简单的多了.

将你的 token file 复制到 C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken 然后重启, 就可以了.

测试是否安装成功

打开终端, 运行 nvidia-smi -q, 如果输出中含有

$ nvidia-smi -q

...
vGPU Software Licensed Product
    Product Name                      : NVIDIA RTX Virtual Workstation
    License Status                    : Licensed (Expiry: 2023-1-10 7:36:7 GMT)
...

那就说明成功啦 🙂

当然, 在 Windows 上还有更简单的方法

开机看到这个就说明成功了

方法二: Spoofing, 使用 Quadro 驱动

新版本的 proxmox 已经将 Spoofing 的功能集成进 PCI Passthrough 菜单, 因此 vGPU_Unlock 可以免装了.

唯一不同的是在直通 vGPU 那一步要勾选高级并把下面的四个 ID 填上. (见下图)

Spoofing 的目的是通过改 PCI ID 来欺骗驱动认为被 Passthrough 的这张 vGPU 是另外一个不需要收费的显卡 (一般是 Quadro 系列). 要让驱动正常工作必须要保证物理显卡和欺骗显卡用同一个型号的核心.

如果你也在用 Tesla P4 那就这样填并跳过下面几段, 如果不是请听我解释.

供应商 ID

NVIDIA 的供应商 ID 统一为 0x10DE

设备 ID

NVIDIA PCI ID Database
https://pci-ids.ucw.cz/read/PC/10de

先通过上面的这个网站查到自己物理显卡的核心.

如图所示, 一共有四张显卡共用 GP104GL 的核心, 在两个 Quadro 里面选择一个继续, 我选的是 Quadro P4000, 如果一个不管用你可以换一个试一试.

如图所示, Quadro P4000 的设备 ID 是 0x1BB1.

Sub-Vendor ID

Sub Vendor ID 是在英伟达将卡授权给第三方厂家制造时出现的, 俗称非公版卡. 在这里并没有填 Sub Vendor 的需要, 直接填写 0x0000 默认公版就好.

Sub-Device ID

在上面的那个网站点进去你选择的欺骗卡, 如果 Sub System ID 里没有其他设备, 保持和 Device ID 一致即可. 如果有的话, 随机选择一个填写.

大部分应该都没有

虚拟机安装驱动

确认宿主机上物理显卡驱动的版本. 比方说我的驱动版本是 14.1, 对应的版本号是 R510.73, 那么虚拟机上安装的 Quadro 驱动就不能高于 R510.73, 不然相当可能出问题.

NVIDIA 官网上的驱动下载都给的是最新版本, 但是 NVIDIA 不会删除老的驱动页面, 因此还是能通过搜索引擎访问的到. 在谷歌上搜索 NVIDIA RTX / Quadro Desktop And Notebook Driver Release 510, 点第一个搜索结果, 下载并安装驱动

https://www.nvidia.com/Download/driverResults.aspx/184785/

和 vGPU 的驱动一样, 安装完成后驱动会虚拟一个显示器出来, 可以使用 Parsec 等软件连接上并在显示设置里开启 「仅在 2 上显示」, 至此设置就完成了.

虽然 NVIDIA 驱动知道这张卡不是 Quadro, 但是它一点办法都没有

唯一的不足就是无法使用 CUDA, 但是简单玩个游戏还是可以的.

方法三: License Bypass

License Bypass
https://github.com/KrutavShah/vGPU_LicenseBypass
https://gist.github.com/neggles/2fdd34d80eb649da3c62780d7a669222

客户端通过安装 vGPU_LicenseBypass 一段时间后自动重启 NVIDIA 驱动程序。

我现在还在重复使用方法一, 等方法一无法使用或者我有时间了再补这块吧~

Thumbnail: Phanteks evolve pc case front redesign “gamer version” by Kresimir Jelusic
If using the image violates your rights, or there’s anything related to copyright laws, please contact me at cla[email protected], I will deal with them immediately.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *