四季尘封之时

写在最开头的话:

本文主旨是为了将不被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,而现在的二手价格也比较中规中矩。咱购买这块卡的最大原因是因为它是一张单槽计算卡,对于服务器这种寸土寸金的平台来说实在是非常理想的宽度(现在可以用gpu扩展柜了,单槽没意义了。。。)。结果又是因为驱动的问题让咱折腾了非常久的时间。

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

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

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

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

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

在此时,这张卡还没有完全设置完成。如果需要使用显卡虚拟化并通过Parsec之类使用GPU编码的软件远程的话,就必须要接入一个物理(或虚拟)的显示器。在grid驱动安装好之后,P10会连接上一个虚拟的NVIDIA VGX显示器。该显示器最大分辨率为1366x768并且无法在NVIDIA控制面板中的更改分辨率内使用自定义分辨率。而SD驱动按照上文中B站链接内的方法修改注册表后是不会有这个虚拟显示器的。故咱使用grid驱动的注册表和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 视频。或者如果需要更高的分辨率和刷新率,可以考虑第三方的虚拟显示器。

 

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

 

 

 

2023.9.25更新:
稍早前,咱进行了一次驱动升级,故新增以下的内容

 

经过测试后发现如果想要开启p10的显示可以不进行注册表修改,直接安装grid驱动即可
而1070ti类显卡无法被grid驱动识别的问题可以参考grd或sd驱动内nv_dispsig.inf内需要的显卡参数并修改grid驱动内的nvgridsw.inf文件解决(详见下文参考)

 

若nv_dispsig.inf中的Section编号在nvgridsw.inf中并不存在的话,不建议使用此种方法进行驱动安装
或可以尝试强行添加nv_dispsig.inf中的Section进入nvgridsw.inf,但无法保证稳定性
出现上述情况建议还是修改注册表比较稳妥(注册表修改其实就是比对grid驱动和sd驱动不同的地方,然后将grd或sd驱动注册表中除grid驱动本身描述以外的参数插入或修改为与grid驱动注册表一致即可)

 

(参考)如果需要增加grid对1070ti的识别,nvgridsw.inf内修改的内容有:
在 NVIDIA_DEV.27B8.174D.10DE = "NVIDIA L4-24C" 行下新增 NVIDIA_DEV.1B82 = "NVIDIA GeForce GTX 1070 Ti"
在 %NVIDIA_DEV.27B8.174D.10DE% = Section088, PCI\VEN_10DE&DEV_27B8&SUBSYS_174D10DE 行下新增 %NVIDIA_DEV.1B82% = Section010, PCI\VEN_10DE&DEV_1B82

 

如此即可让grid驱动识别本无法识别的显卡
而且实测使用grid驱动后会比grd或sd驱动要稳定一些

 

(重要1)本文章仅作技术交流,使用文内方案可能会出现的诸如系统崩溃、保修失效、硬件损坏或其他不可预知的情况咱无法对此负责。。。
(重要2)经过稍长时间测试,截至目前1070ti与p10共存未出现严重问题,而修改过的grid驱动如果在30系或40系上使用可能会造成无法预知的死机(蓝屏都不弹)
(重要3)使用本文提到的方法开启计算卡虚拟显示后可能会由于pcie顺序而造成虚拟显示器未启动,如果出现此类情况可以调整pcie插槽或手动在设备管理器中禁用所有nvidia显卡(计算卡)后按照 计算卡>专业卡>家用卡 的顺序启用设备
(重要4)由于之前有人问咱如何在物理机上设置更高的虚拟显示器分辨率,咱在这里详细进行一下解答(仅是咱推测的内容,可能与实际有所出入)
通过这个链接,可以看到nvidia官方文档里已经说明了虚拟显示器分辨率的限制,这可能是从软件上限制了计算卡可以使用的虚拟显示器数量以及分辨率大小(2023.11.17由“841973620”大佬指正)
并且这个功能是需要购买许可证解锁的,故如果想在物理机上使用虚拟显示器较高的分辨率是需要特定的计算卡型号(得加钱)
在文档中还看到一段信息,大概意思就是默认情况下会开启幀速率限制器,B系列的vGPU最大仅支持到45fps,而Q和A系列的vGPU可以支持到60fps(猜测grid驱动最高刷新率也是由此限制)

 

 

 

 

 

2023.2.21更新:指向B站专栏的文章已经失效,故修改了该链接的引用文字

2023.8.11更新:由于现在没有环境测试注册表,故删除了文章内获取注册表的方式

 

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

  1. 我折腾出了3080ti显卡 + tesla p4计算卡(M.2转PCIE4x16)的搭配,装Grid驱动确实会把GeForce驱动停用,然后装GeForce驱动会把Grid驱动停用,最后唯一的办法还是装Tesla Desktop驱动才能和GeForce共存,Nvidia-smi,WMI,GPU-Z都能检测出来,但任务管理器看不到,GPU-Z看不到显存和核心占用计数;所以只是知道在PR/AE里有加速,但加了多少不知道…

    iiAvoe

    2023/11/10

    @Ta
    #1
    • @

      iiAvoe

      其实若只是想日常使用的话装哪个版本的驱动影响都不大,如果想在任务管理器内看到计算卡就需要安装wddm驱动或修改注册表让计算卡运行在WDDM模式下
      修改注册表的方法应该是:
      注册表路径:\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\
      找到需要修改运行模式的计算卡,比如0002(可以在DriverDesc内找到名字)
      修改DWORD(32) AdapterType值1
      创建DWORD(32) GridlicensedFeatures值7
      该方法是修改自https://www.bilibili.com/read/cv19492373/

      zqds 小四季

      2023/11/17

      @Ta
  2. 你好,可以修改VGX分辨率的注册表参数可以发我吗?折腾很久了,一直无果。感谢啊!

    cair

    2023/2/25

    @Ta
    #2
    • @

      cair

      抱歉,物理主机注册表是无法修改分辨率的,咱可能在文章内没有写清楚。。。
      如果需要自定义分辨率需要用windows开启hyper-v虚拟机设置GPU-pv后安装虚拟显卡驱动就可以自定义分辨率了,具体可以参考这篇文章:https://www.bilibili.com/read/cv15539810/

      zqds 小四季

      2023/8/11

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

    Srml Ruo

    2023/2/4

    @Ta
    #3
    • @

      Srml Ruo

      这个只能说一声抱歉了,由于咱现在没有空闲的设备可以测试这个注册表修改的方法,所以没办法帮助你了。。。

      zqds 小四季

      2023/8/11

      @Ta
    • @

      Srml Ruo

      咱刚才对文章的更新解决了你的这个问题,现在并不需要修改注册表即可开启虚拟显示器了~

      zqds 小四季

      2023/9/25

      @Ta
  4. 好,支持 :roll:

    dadan

    2022/12/10

    @Ta
    #4

发表评论