Refer

佛西博客 - 在Proxmox VE 7.4 中开启NVIDIA P106显卡虚拟化(vGPU)

非常非常感谢这些好人, 是他们让这篇文章成为可能 (#≧▽≦)人

Warning

这篇文章可能没有多少图, 所以观感可能比较差... (配置虚拟机的时候没想到要写文章 (×﹏×)

本文不一定适用于最新的 PVE 版本。

前言

去年生日的时候, 买了一台 RH2288 V3 服务器放在家里。里面有两张 Tesla V100 的 GPU。一开始只是打算用来跑 AI 推理之类的。

不过最近开发 HugoAura 需要用到 Windows 虚拟机, 如果用 CPU 渲染的话, 基本调试不了任何 UI 动效, 所以打算利用一下 GPU。

直通不行嘛?

我天真地以为, 计算卡只需要作为 PCI 设备直通到虚拟机里, 然后再装上驱动就好。但是这样做了之后, 发现设备管理器里能识别到 NVIDIA Tesla V100 PCIe 16G, 任务管理器里却看不到任何 GPU。显示输出也依然是 Microsoft 基本显示适配器

后来一搜才知道, NVIDIA 的 GPU 有两种工作模式, 分别是 TCC 和 WDDM。简单来讲...

TCC

WDDM

仅计算模式, 没有图形输出

Hybrid 模式, 侧重图形, 依然能计算, 但计算效率可能低于 TCC

据说可以通过 nvidia-smi -dm 0 -i <NVIDIA SMI 显卡 Index> 来切换到 WDDM 模式。但是我执行了一下, 发现 WDDM / TCC 切换好像不适用于纯计算卡:

> nvidia-smi -dm 0 -i 0
Unable to set driver model for GPU XXXXXXXX:XX:00.0: Not Supported
Treating as warning and moving on.
All done.
>

网上搜了一圈, 大多数改注册表强制开启 WDDM 的方法都失败了, 每次尝试的时候, 基本上都卡在了 Windows 的转圈圈第一屏。(花了我好多时间测试 TwT

还是 vGPU 吧

想起来很久远的一个名词: vGPU。上次看到这个词, 还是当时选服务器 GPU 的时候, 问 AI 能不能多个虚拟机用同一个 GPU...

因为 vGPU 是付费功能, 所以那个时候并没有进一步去了解。(但现在不得不了解一下了

好在有众多大佬已经研究过了这方面的知识, 那就开始吧 ~

前期准备

大概需要这些东西:

  • PVE 8.X (只测试过 6.8.X 的内核版本, 其他内核兼容性未知)

  • 至少一张 NVIDIA 的计算卡

  • 别的没了...

Host 驱动

1. 下载 Host 驱动

可以从 佛西大佬的云盘 上下载宿主机的驱动。

我测试的时候只有 v17.X 的 Host 驱动 支持 Guest (虚拟机) 驱动用假的许可证, 但不知道你读到这篇文章的时候怎么样了... 总之看情况吧。

选一个合适的版本, 点进去之后找到名字类似 NVIDIA-Linux-x86_64-XXX.XXX.XX-vgpu-kvm-custom.run 的文件, 右键 - 复制链接, 然后在 PVE 的 Shell 里运行:

$ wget [复制的链接]

--2025-04-20 19:24:50--  https://alist.homelabproject.cc/d/foxipan/vGPU/XX.X/NVIDIA-Linux-x86_64-XXX.XXX.XX-vgpu-kvm-custom.run
Resolving alist.homelabproject.cc (alist.homelabproject.cc)... 172.67.174.43, 104.21.40.14, 2606:4700:3033::6815:280e, ...
Connecting to alist.homelabproject.cc (alist.homelabproject.cc)|172.67.174.43|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 88M [application/octet-stream]
Saving to: ‘NVIDIA-Linux-x86_64-XXX.XXX.XX-vgpu-kvm-custom.run’
2025-04-20 19:25:06 (52.2 MB/s) - ‘NVIDIA-Linux-x86_64-XXX.XXX.XX-vgpu-kvm-custom.run’ saved

2. 安装 Host 驱动

$ chmod +x ./NVIDIA-Linux-x86_64-XXX.XXX.XX-vgpu-kvm-custom.run && sudo ./NVIDIA-Linux-x86_64-XXX.XXX.XX-vgpu-kvm-custom.run

就是这样! 接下来应该会弹出来一个安装 UI, 除了一个 DKMS 选项需要选 "Yes" 以外, 其他的都默认就好 ~

⚠ 注意

照道理来说, 纯计算卡的场景, 不需要安装 vgpu_unlock_rs。那个只是用来欺骗 Guest 驱动侧数据的, 只有消费级显卡跑 vGPU 才会用到。

3. 启动 Host 驱动服务

一般来讲, 装好驱动之后就会自动启动服务, 不过还是以防万一:

$ sudo systemctl restart nvidia-vgpud.service
$ sudo systemctl restart nvidia-vgpu-mgr.service

✨ 应该好啦

Guest 驱动

由于英伟达的 vGPU 许可证鉴权是在 Guest 侧的, 所以客户机配置过程会相对麻烦一些。

0. 开启 RDP

先把 RDP 开起来吧。一会驱动装好之后, VNC 的显示屏会默认变成副屏。那样就很难办了...

1. 下载 Guest 驱动

回到之前的云盘, 在 .run 文件的同目录下找到 NVIDIA-GRID-Linux-KVM 开头的文件夹。点进去之后再进入 Guest_Drivers 文件夹, 找到 EXE 的驱动文件。

2. 安装 Guest 驱动

就和安装正常的 N 卡驱动一样, 一路下一步就好啦...

3. 先看看成果吧

驱动装完之后, 应该不需要重启, 就能识别出 GPU。像这样 ↓

20250420_NVIDIA_vGPU#GPU_Online.png

△ 就是这样!

4. 搭建 FastAPI-DLS

FastAPI-DLS 是一个假的 vGPU 授权服务器。

这边假设各位读者都已经有良好的 Docker 基础了哦...

以及, 个人不太喜欢用 Docker Compose, 所以下面的步骤都用 Docker CLI

下面这些步骤最好不要在宿主机上运行, 我个人还是比较倾向于保持宿主机环境整洁的...

I > 拉取镜像

$ sudo docker pull collinwebdesigns/fastapi-dls

⚠ 注意

可能需要自行解决网络问题

II > 先选择一个数据存储位置吧

我个人比较喜欢 /opt/docker-containers/data/<容器名> 之类的。

$ export WORKING_DIR=/opt/docker-containers/data/FastAPI-DLS
$ sudo mkdir -p $WORKING_DIR

III > 然后自签两份 OpenSSL 公私钥对

⚠ 注意

有个人 PKI 的读者请跳过此步, 优先用 PKI 签发证书

$ cd $WORKING_DIR && sudo mkdir certs && cd ./certs
$ sudo openssl genrsa -out $WORKING_DIR/instance.private.pem 4096
$ sudo openssl rsa -in $WORKING_DIR/instance.private.pem -outform PEM -pubout -out $WORKING_DIR/instance.public.pem
$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout  $WORKING_DIR/webserver.key -out $WORKING_DIR/webserver.crt

IV > 启动容器!

这个就很简单了吧...

$ export TARGET_URL=<这里填运行 Docker 容器的宿主机 IP! (或者如果有本地域名的话, 就用本地域名吧>
$ export EXPOSE_PORT=<这里填 Docker 容器对外开放的端口, 如果宿主机没有其他服务的话, 那就 443 吧>
$ sudo docker run -e DLS_URL=$TARGET_URL -e DLS_PORT=$EXPOSE_PORT -p $EXPOSE_PORT:443 -v $WORKING_DIR/certs:/app/cert --name INF-Custom-FastAPI-DLS collinwebdesigns/fastapi-dls:latest

V > 测试一下访问

看一看 https://${TARGET_URL}:${EXPOSE_PORT}/ 能不能正常访问吧。

应该会看到像下面这样 ▽

20250420_NVIDIA_vGPU#DLS_HomePage.png

△ FastAPI-DLS 的首页 (没用 PKI 签证书, 懒得改了 (((> <))) )

5. 获取 Client Config Token

从客户机那侧, 用浏览器访问 https://<DLS URL>/-/client-token , 就会拿到一个 ClientConfigToken。

进到 C:\Program Files\NVIDIA Corporation\vGPU Licensing\ClientConfigToken 文件夹 (如果不存在就新建一下), 把 Config Token 放进去。

重启客户机, 再次进入桌面的时候, 应该就会:

20250420_NVIDIA_vGPU#License_Done!.png

△ 咱也是有钱人了 (划

结束啦

🎉 好咯, 到这里, 一切都已经完成啦~

后记

不知道是通病还是希沃镜像的问题, 每次启动虚拟机似乎都要 VIDEO_MEMORY_MANAGEMENT_INTERNAL 蓝屏一次。第二次重启才会好。或许是因为希沃镜像里塞了 Intel 的显卡驱动 (?

以及, 最近夏天到了, 服务器进风口温度动不动就 34º+, 所以不是很敢用了 ((>_<)) 还是用 MacBook + Parallels Desktop 吧。

Ad astra per aspera