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 分钟。

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

  1. 向 NVIDIA 申请 90 天 free license,到期后购买 license
  2. 使用 vGPU 伪装,在客户端中安装 Quadro 驱动程序(vGPU-unlock 提供的功能)
  3. 固定时间重启 NVIDIA 驱动程序(vGPU_LicenseBypass)
  4. (新增)使用模拟授权服务器 collinwebdesigns/fastapi-dls

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

方式1:申请 Free License

提交申请后,NVIDIA 中国工作人员打电话要公司名称、用途等信息,我回复说“个人创业测试使用”,工作人员答复说“只针对企业用户”后直接挂断我的电话。

方式2:vGPU 伪装

通过 vGPU-unlock,将 Guest vGPU 的 pci_device_id 与 pci-id 伪装成同代的 Quadro 显卡,Guest 安装 Quadro 驱动。

  1. Host
    • 官方驱动程序 + vGPU-unlock,使用后者进行 vgpu 型号 override,报给虚拟机假 vGPU 型号,模拟成 Quadro
  2. Guest
    • (暂时)只能用在 Windows 虚拟机中;
    • 只能使用 R510 分支的 Quadro 驱动(512、513);
    • 无时间限制;
    • 可运行 3D 游戏;
    • CUDA 无法使用,导致 ffmpeg 硬解不能使用。

方式3:固定时间重启 NVIDIA 驱动程序

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

  1. Host
    • 官方驱动程序,不需要特殊修改。
  2. Guest
    • 完整功能,24 小时高性能,24 小时后计划任务自动重启 vGPU 驱动程序;
    • 只能使用 14.1 vGPU 驱动,不能用 14.2 及以上版本驱动。

方式4:使用模拟授权服务器

  1. Host
    • 官方驱动程序。
  2. Guest
    • 官方驱动程序,完整功能,目前不限驱动版本。
  3. 授权服务器(可搭建在 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 能力。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/9289.html
欢迎加入梓喵出没博客交流群:313732000

发表评论

*

*

评论区

  1. lonley12-16 12:51 回复

    大佬求教为什么我的pci里识别不到p4

  2. fishensl02-06 15:11 回复

    我的用的docker 搞的vgpu License 授权给win10,目前用着正常,但是jellyfin转码用1q 2q 4q 都是60fps左右。。。不知道是哪里限制了头大