四季尘封之时

写在最开头的话:

本文主旨是为了将不被nvidia官方驱动支持的P10计算卡调整到正常安装官方驱动,故无法更改被官方所限制的“氪金”项目。

 

 

早在半年甚至更早之前,咱就在b站看到了有关于gpu-pv的介绍。正巧对这种gpu虚拟化的方案有较强的需求,故在一个月前开始筹备各种设备并开始研究和测试。

 

在正式测试之前,咱稍微的踩了一个坑。。。

一开始在研究显卡虚拟化的时候,咱看到了一块很有意思的AMD计算卡“FirePro S7150 x2”。这张卡当时500元左右的价格着实让咱心动了一下,可惜实际测试实在是巨坑。。。

对于这张卡,咱非常的无奈。同时也懊悔没有经过更多的调查就盲目购买。由于该卡标称支持SR-IOV(单根I/O 虚拟化),故咱当时理解为原生支持显卡拆分。实际使用才发现是需要诸如ESXI之类的平台支持,而且刚好不支持Windows平台的Hyper-V。甚至由于该卡可能是比较老了,AMD驱动最高仅支持到Windows Server 2019(咱使用的是2022),故差点连驱动都无法安装。后来使用了某个Win10版本的驱动才能让该卡被正常识别到。可惜那个驱动的WDDM版本只有2.3,所以无法支持GPU-PV了。不过以上这些都还是小问题,至少该卡是拥有两个核心的,并且默认在系统内也是两张计算卡。所以咱通过DDA(DiscreteDeviceAssigner,离散设备分配)将两张卡分配到了两个虚拟机。但是分配成功之后出现的新问题注定了这张卡被淘汰的命运。

首先是严重的发热问题着实令咱头疼不已,居然在服务器暴力风扇的压制下进行3D测试还能达到103℃高温并导致虚拟机强制性关机。接着最绝望的事情来了。在该卡运行了一天左右的时候,不管是VNC还是Parsec都出现了奇怪的白线,并且有时候还会出现闪屏。此时该卡至少还能使用。结果没过一个小时,虚拟机直接黑屏,然后分辨率跳到1024x768且该卡在设备管理器中报代码43。咱直接不知道说什么好了。。。

由于该卡是在某二手平台购买的(咱觉得这就肯定是买到矿卡了),所以只能打碎牙齿往肚子里咽了。。。

直接不相信AMD了(虽然不全是AMD的锅)。

 

咱本次测试使用的是Nvidia的计算卡Tesla P10。P10的能力推测相当于1080ti,而现在的二手价格也比较中规中矩。咱购买这块卡的最大原因是因为它是一张单槽计算卡,对于服务器这种寸土寸金的平台来说实在是非常理想的宽度。结果又是因为驱动的问题让咱折腾了非常久的时间。

咱购买的卡因为是二手的所以并未有附带驱动,一开始咱以为该卡可以在英伟达官网直接找到驱动,结果找了半天就是没找到P10的驱动。后在百度帖吧看到一张图片后豁然开朗。在GCP找到了可以使用的WDDM驱动。查询各种资料之后发现一件事情,这张计算卡如果使用公开的驱动就一定需要修改驱动才可以正常安装。具体修改方法可以去参考网上别人魔改nv_dispwi.inf的方案。

NVIDIA计算卡WDDM驱动链接:https://cloud.google.com/compute/docs/gpus/grid-drivers-table

经历了这些乱七八糟的问题之后,驱动好不容易打上去了。结果就在咱差点以为万事大吉的时候,搞笑的事情这才开始。咱的机器上在以前就安装了一块1070ti,而安装了P10的这个修改驱动后1070ti直接无法正常工作,报驱动配置有问题。当时咱简直哭笑不得,恨不得直接花钱给老黄弄点公司专属驱动来(玩笑话)。

就在万念俱灰的时候,一个奇怪的念头拯救了咱希望同时使用双卡的目标。在nv_dispwi.inf这个文件内有着所有支持的显卡id,而GCP给出的WDDM驱动内并未有普通显卡的id。这时候咱就突然想到,普通显卡的驱动里面会不会包含了P40(因为P10就是P40的阉割版,官方公开驱动内默认并没有P10,而P40和P10相差最近,故使用P40的id修改为P10来达到识别显卡的目的。为以防实际调试时候无法理解,以下驱动部分都以P40称呼。),A100乃至H100的id呢?遂使用批量搜索SD驱动文件夹后有了惊人的发现,现时最新版本的驱动内竟然包含了计算卡的id,并且搜索到了P40的id。接着咱按照WDDM驱动的方案修改搜索到的inf文件后,驱动终于安装成功了。

但是很快咱就发现了一个问题,这时候虽然驱动安装成功并且两张卡都被识别了出来,但是P10是运行在计算模式下的,也就是无法被GPU-PV分配。这时候B站的一篇文章(文章链接)拯救了这个问题。在重启系统(或在设备管理器中禁用后启用该卡,推荐重启系统)之后,P40已经几乎正常的工作在了图形+计算模式下,并在NVIDIA控制面板的管理GPU使用率中可以修改使用模式。

在此时,这张卡还没有完全设置完成。如果需要使用显卡虚拟化并通过Parsec之类使用GPU编码的软件远程的话,就必须要接入一个物理(或虚拟)的显示器。在WDDM驱动安装好之后,P10会连接上一个虚拟的NVIDIA VGX显示器。该显示器最大分辨率为1366x768并且无法在NVIDIA控制面板中的更改分辨率内使用自定义分辨率。而SD驱动按照上文中B站链接内的方法修改注册表后是不会有这个虚拟显示器的。故咱使用WDDM驱动的注册表和SD驱动的注册表进行比对后增加并修改了几个参数(如果需要参数可以在下面评论区提出或者直接使用咱的联系方式联系咱,主要是咱也不确定具体是哪个或哪些参数起了效果,现在不想测试了xD),然后这个虚拟显示器在重启系统后就连接到了计算卡上。

P10完全设置完成后,虚拟显示器NVIDIA VGX分辨率刷新率可以随便修改,但是绝对不能关闭,如果关闭后Parsec会无法正常使用计算卡进行串流并出现报错。在Windows Server 2022中,GPU-PV可以指定需要使用的显卡或计算卡。在Powershell中输入Get-VMHostPartitionableGpu可以列出所有支持GPU-PV的显卡或计算卡。如果想要显卡或计算卡可以使用GPU-PV的话,需要WDDM版本至少在2.6(有文章说是WDDM2.4的某个特性)以上就可以。这就是为什么FirePro S7150 x2无法使用这种方案的原因。列出支持的显卡或计算卡后需要复制Name后的信息(大概长这样:\\?\PCI#****省略****\GPUPARAV),然后使用下面的脚本并修改vm和gpu_path。

 

 

$vm = "虚拟机名称"
$gpu_path = "Name后信息"

Remove-VMGpuPartitionAdapter -VMName $vm
Add-VMGpuPartitionAdapter -VMName $vm -InstancePath $gpu_path
Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000
Set-VM -GuestControlledCacheTypes $true -VMName $vm
Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm
Set-VM -HighMemoryMappedIoSpace 32GB –VMName $vm

 

 

其他关于虚拟机驱动的问题可以去搜索引擎查询其他人关于GPU-PV的文章,这里就不再赘述。使用计算卡进行编码的这种方案,虚拟机不会增加新的显示器,所以不需要禁用Microsoft Hyper-V 视频。或者如果需要更高的分辨率和刷新率,可以考虑第三方的虚拟显示器。

 

咱这次的研究就到这里,如果以后有想补充的内容会在下面增加。也期望有大佬前来指点迷津~

这篇文章有2人发言了呢.

  1. 能给我注册表参数吗 :roll: (尝试卖萌)

    Srml Ruo

    2天前

    @Ta
    #1
  2. 好,支持 :roll:

    dadan

    2022/12/10

    @Ta
    #2

发表评论