PVE+Tesla P4 vGPU All IN ONE NAS 折腾小记

买了一块最近挺火的 Tesla P4,在 PVE All IN ONE NAS 上分配 vGPU 给虚拟机硬解使用;经过两天的尝试与摸索,简单总结下常见问题及使用方案。
科普
一些简单术语,点击展开。
NVIDIA 显卡
NVIDIA 的显卡可以简单分为游戏显卡、专业显卡、数据中心显卡。
- 游戏显卡大多数为 GeForce 系列显卡,如 GeForce RTX 3070 等。
- 专业显卡大多数为 Quadro 系列及 NVIDIA RTX 系列显卡,如 Quadro RTX4000 等。
- 数据中心显卡比较混乱,既有老 K2、Tesla,也有新的 AXX 系列。
一般情况下,硬件上同代的三种显卡都是同一种 GPU 架构。
vGPU
数据中心卡一个特点是支持 GPU 虚拟化,即一个 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 分钟,之后将强制限制显卡性能及显示帧数,使得应用程序无法正常运行。
vGPU-unlock
从硬件上来看,同代的数据中心显卡和消费者显卡 GPU 架构是一样的,只是驱动层限制了支持的特性。
vGPU-unlock 通过对数据中心 Host 驱动程序进行 path,通过改 id 等方式绕过了驱动层限制,使得普通消费者显卡也可以支持虚拟化;同时在 vGPU 启动前后进行 hook,绕过特定检查、汇报虚假结果等,使得虚拟机的 vGPU 能正常启动。
硬解
硬解一般针对于视频领域,指的是利用 GPU 等设备进行视频流解码,由于 GPU 有单独的处理单元及优化,因此视频解码速度很快。
N 卡的硬件解码/编码一般称为 NVENC/NVDEC,ffmpeg 调用硬解时,依赖 CUDA 支持。
前言
由于本人的 NAS 使用的是没有核显的 D1581,而我又想尝试下 jellyfin 硬解,因此必须搞一块 GPU 给 PVE 虚拟机用,目前有三种方案:
- 普通显卡 passthrough(PVE GPU 直通)
- 普通显卡 + vGPU-unlock
- 数据中心显卡
某鱼上看到了低价出售的 Tesla P4 显卡(8GB 显存,支持所有 vGPU 特性),卖 400 出头,抱着好玩的态度,搞了一块回来。
显卡外观及尺寸
到手之后,用尺子测量的显卡尺寸,以供参考:
注意该卡用于数据中心机柜,没有主动散热风扇,依赖服务器万转风扇气流散热。
散热改造
机柜卡没有主动散热风扇,不能直接用在普通机箱里。
目前淘宝上有商家在卖微星 1050 显卡散热外壳,20 块钱,尺寸与我们的 Tesla P4 差不多,很多教程会推荐它。
我买了一块该外壳,测试结论是不推荐此散热风扇,原因如下:
- 噪音高,12V + 降速线噪音无法接受,接 5V 噪音依旧不可接受
- 降速或降压情况下风量小
在轻中度使用的场景中,本人推荐双 12CM/9CM 静音风扇 + PCI-E 风扇架的方案,两个风扇对散热片直吹。本人用两把利民 12CM 风扇接大 D 口 5V(降压)直吹,vGPU ffmpeg 解码时温度不超过 60 度。
在重度使用的场景中,本人推荐购买 3d 打印的涡轮框架 + 高性能涡轮扇。
典型的安装流程
Tesla P4 是血统纯正的数据中心显卡,原则上不需要 vGPU unlock 即可使用 vGPU 功能。
简单描述下典型的安装流程:
该流程不含 vGPU-unlock,vGPU-unlock 往下翻。
步骤0:屏蔽开源驱动并安装依赖软件包
把下面几行追加到/etc/modules
里,用于加载所需的内核模块:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
屏蔽开源驱动:
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
开启IOMMU:略。
安装依赖包:
apt install build-essential dkms pve-headers mdevctl
如果有的软件包找不到/拉不下,请添加清华大学的 pve 源。
如果后续 NVIDIA 驱动安装时报错找不到对应版本的 pve-headers/Linux-headers,使用如下命令安装匹配的版本:
apt install pve-headers-$(uname -r)
重启机器。
步骤1:Host 服务端驱动程序
在 PVE 主机中安装 NVIDIA 官方的 Host 驱动程序:
NVIDIA 官网的驱动是非公开的,你需要注册 NVIDIA 商业账户才可访问;你也可以选择去网上寻找 HOST 驱动包(比如找我)
# 注意:linux 版本和驱动程序有版本依赖关系
# 请选择和主机匹配的驱动程序版本(azimiao 友情提醒)
chmod +x NVIDIA-Linux-x86_64-510.108.03-vgpu-kvm.run
./NVIDIA-Linux-x86_64-510.108.03-vgpu-kvm.run
安装过程中,你可能会遇到一些报错,缺这个包缺那个包的,自己检查步骤 0。
步骤2:划分 PCI-E 设备给虚拟机(Guest)
通过 PVE 图形界面给虚拟机分配 PCI 设备,选择显卡设备后,MDev 类型处选择 vGPU 模式。
该处的 MDev 字段,后面半段的数字为显存容量,字母为 vGPU 类型,由于前文已经介绍过 A、B、C、Q 类型 vGPU 区别,此处不再重复,选 Q 类型即可。
步骤3:Guest 安装客户端驱动程序
NVIDIA 在每个版本的驱动程序压缩包中都提供了客户端驱动程序,直接安装即可。
此时,你的 vGPU 就运行起来了。
带 vGPU-unlock 的安装流程
直接参考 PolloLoco 的NVIDIA vGPU Guide。
注意,Tesla P4 原生支持 vGPU,不用修改 Host 驱动,他的文章中已注明需要跳过的步骤,仔细看。
授权问题
好了,我们的驱动已经装好了,是不是可以开始使用了呢?还不行。
上文谈到过,vGPU 授权是在客户机驱动程序上进行校验的,不授权只能使用 20 分钟。
为了解决授权问题,我们有四种方式:
- 向 NVIDIA 申请 90 天 free license,到期后购买 license
- 使用 vGPU 伪装,在客户端中安装 Quadro 驱动程序(vGPU-unlock 提供的功能)
- 固定时间重启 NVIDIA 驱动程序(vGPU_LicenseBypass)
- (新增)使用模拟授权服务器 collinwebdesigns/fastapi-dls
本人对四种方法及衍生都试了一遍,以下是结果。
方式1:申请 Free License
提交申请后,NVIDIA 中国工作人员打电话要公司名称、用途等信息,我回复说“个人创业测试使用”,工作人员答复说“只针对企业用户”后直接挂断我的电话。
方式2:vGPU 伪装
通过 vGPU-unlock,将 Guest vGPU 的 pci_device_id 与 pci-id 伪装成同代的 Quadro 显卡,Guest 安装 Quadro 驱动。
- Host
- 官方驱动程序 + vGPU-unlock,使用后者进行 vgpu 型号 override,报给虚拟机假 vGPU 型号,模拟成 Quadro
- Guest
- (暂时)只能用在 Windows 虚拟机中;
- 只能使用 R510 分支的 Quadro 驱动(512、513);
- 无时间限制;
- 可运行 3D 游戏;
- CUDA 无法使用,导致 ffmpeg 硬解不能使用。
方式3:固定时间重启 NVIDIA 驱动程序
客户端通过安装 vGPU_LicenseBypass 一段时间后自动重启 NVIDIA 驱动程序。
- Host
- 官方驱动程序,不需要特殊修改。
- Guest
- 完整功能,24 小时高性能,24 小时后计划任务自动重启 vGPU 驱动程序;
- 只能使用 14.1 vGPU 驱动,不能用 14.2 及以上版本驱动。
方式4:使用模拟授权服务器
- Host
- 官方驱动程序。
- Guest
- 官方驱动程序,完整功能,目前不限驱动版本。
- 授权服务器(可搭建在 Host 或任意 VM 中)
DockerHub:collinwebdesigns/fastapi-dls
。
通过 Docker 镜像建立一个模拟授权服务器,该镜像中封装了授权验证功能,其他 vGPU 虚拟机可访问该授权服务器获取凭证。
经过实际验证,该模拟验证可支持到最新的 15.1 驱动,方案接近完美。当然,该方案还有一点点瑕疵,就不细说了。
具体使用问题参考原作者 DockerHub 链接,也欢迎加群讨论。
由于 CUDA 的强需求,我只能选择方式 3 或 4。
体验
与显卡直通相比,vGPU 的体验要高了一个档次,如果你愿意,可以给 8 个虚拟机都分配一个 1G 显存的显卡。
但话说回来,vGPU 不仅收你的硬件费用,还要按照虚拟机数量收软件费用,且购买不针对个人开放,也挺令人烦心。
由于 NVIDIA 中国不向个人消费者提供授权购买,我只能通过 vGPU_LicenseBypass 重复试用 Guest 驱动程序,也算是一种无奈之举。
隔壁 AMD 只收硬件费用,不收软件费用,听起来不错,但 AMD 只有老卡便宜,老卡不仅功耗高,并且也不具备现代 GPU 能力。
大佬求教为什么我的pci里识别不到p4
我的用的docker 搞的vgpu License 授权给win10,目前用着正常,但是jellyfin转码用1q 2q 4q 都是60fps左右。。。不知道是哪里限制了头大