前往
大廳
主題

使用離散裝置指派於Microsoft Hyper-V虛擬機器和客體作業系統(把GPU分給VM)

[桐生會]永和豆漿 | 2022-10-17 16:51:26 | 巴幣 1100 | 人氣 658

簡單標題:把 GPU 分給 VM

最近在鑽研Steamworks SDK,但研究到Party/Lobby/Matchmaking相關的功能時發現了一個大問題。Steamworks SDK 最多只能抓一個Steam用戶端/用戶,多開/沙盒Steam完全不是解決方法,因為要拿來研究的專案也必須同時要有兩個,太麻煩,而且問題也很多。所以把方向轉為多開系統來解決這個問題。

Unraid 因為 IOMMU 分不開而放棄,KVM 成功率比不可能還低,最後只好使用 Hyper-V 加上 DDA(Discrete Device Assignment) 把 GPU 分給 Hyper-V。

為何"我"需要DDA?
  *關於 DDA 和 增強/加強工作階段*
DDA設定步驟
  1.建立、設定、安裝好準備要使用的Hyper-V虛擬機(包含作業系統)
  2.複製 Host 的顯示卡驅動
  3.將複製好的驅動,貼到 Hyper-V 內
  4.透過 PowerShell 設定 DDA
DAA 保養/顯示卡驅動更新

為何"我"需要DDA?
1. 效能
沒有DDA

有DDA

2.更方便的 RemoteFX vGPU 已被停用 文章連結

*關於 DDA 和 增強/加強工作階段*

在使用增強工作階段時,VM 中會增加 "Microsoft Remote Display Adapter"顯示卡來提供 VM 視窗直接縮放大小的服務(關係到 VM 內 dpi 和解析度)。而使用 DDA 後,RDA 就會失效,畫面全黑

所以要了解到,加強工作階段的功能會半殘,甚至全殘。要想會不會影響到你的工作流程,要不要花時間來用DDA

至於加強工作階段到底要不要關,其實都無所謂。我個人是加強工作階段全關,我只需要用區網分享檔案就可以了。只要記得看到沒動作的黑畫面,改回基本模式就OK

如果你好奇,在沒有DDA的情況下,開啟加強工作階段會不會效能提升?我個人是沒有感覺
下面是 沒有 DDA +有加強工作階段的測試


DDA設定步驟
1.建立、設定、安裝好準備要使用的Hyper-V虛擬機(包含作業系統)
在 VM 設定時要注意,如果你有看上面的"關於DDA和增強/加強工作階段"。想開關加強的工作階段,到上面的 Hyper-V 的設定內調整加強的工作階段設定。
而根據 規劃使用離散裝置指派部署裝置 ,要進到 VM 的設定內,把動態記憶體關閉。

2.複製 Host 的顯示卡驅動
顯示卡驅動可以在 Host 電腦管理內查詢

沒有 Path 的檔案可以在 Windows\System32\DriverStore\FileRepository 裡面找到,這邊要複製整個資料夾
注意:資料夾名稱可能會不一樣,不要照抄我的 "nvmdi.inf"!

註1:建議在更新顯示卡驅動後複製檔案,可以透過更新時間知道其他沒有被關聯的相關資料。另外,NV顯示卡驅動通常會有前綴 nv,在 system32 和 syswow64 內的 nv 前綴都可以複製一份。

複製的驅動可以依照當時的位置,貼在相對應的資料夾內(如System32/SysWOW64,大小寫須注意)
我是複製驅動所有的檔案
另外,資料夾名稱 DriverStore 要改成 HostDriverStore

3.將複製好的驅動,貼到 Hyper-V 內
!這邊要注意!
*再次確認驅動檔案有沒有複製好
**可以先用 CheckPoint 幫 VM 建立還原點
***先複製進 VM 的一般資料夾(如:桌面),再從 VM 內複製到 VM 的 Windows 資料夾!!否則會有權限問題!!
****檔案全部覆蓋,若複製途中有因為程式正在使用,或是權限不夠,一律跳過
複製完成後重開 VM

這邊 Hyper-V 再重開時會可能會出現警告,選擇重試。
若是穩定開啟,但是畫面全黑。試試看重新連接,擴展,或是全螢幕視窗。(加強工作階段問題)

最後關機 VM
關機 VM
關機 VM
不是打叉關視窗就好,要關機!

4.透過 PowerShell 設定 DDA
以管理員身分打開 PowerShell (有沒有ISE都沒差),輸入 Get-VMHostPartitionableGpu ,這裡會顯示你所有可以分配的 GPU 數值

!這邊要注意!
接著根據你 PS 顯示的數值來調整下面的指令,下面是我設定我 "一個" VM 的指定。
我只有"一個" GPU 要分配給 "一個" VM ,為了保守保留 GPU 算力給 Host ,所以數值為以下

[數值] 乘上 [0.9或0.8]  除與  [VM數量]

但是我不怕死,所以我全上
$vm = "你的VM名稱請放在這裡"
Remove-VMGpuPartitionAdapter -VMName $vm
Add-VMGpuPartitionAdapter -VMName $vm
Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionVRAM 1
Set-VMGpuPartitionAdapter -VMName $vm -MaxPartitionVRAM 1000000000
Set-VMGpuPartitionAdapter -VMName $vm -OptimalPartitionVRAM 1000000000
Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionEncode 1
Set-VMGpuPartitionAdapter -VMName $vm -MaxPartitionEncode 18446744073709551615
Set-VMGpuPartitionAdapter -VMName $vm -OptimalPartitionEncode 18446744073709551615
Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionDecode 1
Set-VMGpuPartitionAdapter -VMName $vm -MaxPartitionDecode 1000000000
Set-VMGpuPartitionAdapter -VMName $vm -OptimalPartitionDecode 1000000000
Set-VMGpuPartitionAdapter -VMName $vm -MinPartitionCompute 1
Set-VMGpuPartitionAdapter -VMName $vm -MaxPartitionCompute 1000000000
Set-VMGpuPartitionAdapter -VMName $vm -OptimalPartitionCompute 1000000000
Set-VM -GuestControlledCacheTypes $true -VMName $vm
Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm
Set-VM -HighMemoryMappedIoSpace 16GB -VMName $vm
Start-VM -Name $vm

最後你的 Hyper-V VM 會自動開啟,去電腦管理內確認是否有 Host 的 GPU 出現,有的話恭喜你。
沒有的話再接再厲?

DAA 保養/顯示卡驅動更新
如果遇到驅動更新,VM 內的顯示卡會回報 Code 43 。只要重新再複製新的驅動程式檔案就行了。

重開 VM 後,Hyper-V 有可能會當機,可以強制關閉 VM 再重開即可。至於舊的驅動可以留著不理,或是要刪除來節省空間也可以。

參考
Easy-GPU-PV - on Github
FastGPUP - on Github

送禮物贊助創作者 !
0
留言

創作回應

相關創作

更多創作