QEMU/KVM虛擬機GPU直通,Linux Host對Linux Guest

將Host的GPU直通給虛擬機(VM),使其可以使用GPU硬體加速、跑機器學習計算等工作。

其實虛擬機要GPU硬體加速也可以用Virtio顯示卡搭配Virglrenderer。不過該技術僅適用Intel/AMD GPU,且Ubuntu的Virglrenderer效能不若Android-x86那樣好,所以我還是用GPU直通。

Host OS將Nvidia GTX1050Ti直通給虛擬機後,即改用Intel CPU的內顯輸出螢幕訊號,而虛擬機不外接實體螢幕也能調用GPU執行應用程式。

1. 環境

  • Host OS:Arch Linux 6.2.1,GPU 1 Intel HD630,GPU2 Nvidia GTX1050Ti
  • Guest OS:Ubuntu 22.04 LTS,虛擬顯示卡QXL
  • 虛擬機軟體為Virt Manager + QEMU/KVM 7.1.0

2. 直通GPU

參考Arch Linux如何將GPU直通給Windows QEMU/KVM虛擬機

那篇雖是給Windows的,但是大方向一樣:禁止Nvidia顯示卡開機載入,啟用VFIO核心模組,並將PCI裝置掛載至Ubuntu虛擬機。

要取消直通也很簡單,從虛擬機硬體列表刪除PCI裝置,GRUB設定檔還原至修改前的樣子,重開機即可。

3. 虛擬機安裝Nvidia驅動與CUDA

參考Ubuntu 22.04安裝Nvidia驅動

據說Nvidia舊版本驅動會偵測是否為虛擬機,所以得hide kvm,但現在看來不需要了。

nvidia-smi測試輸出驅動版本為530

nvcc -v輸出版本為CUDA 11.8。

Blender確認能夠使用CUDA渲染

4. 使用Nvidia PRIME切換GPU

即使虛擬機可以使用CUDA了,執行3D應用程式還是可能只用軟體解碼渲染,導致性能低下

prime-select指令行不通,因為沒有內顯。這時可以用PRIME環境變數使用Nvidia GPU執行應用程式。

1
 __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __VK_LAYER_NV_optimus=NVIDIA_only VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json firefox-esr

詭異的是Snap版Firefox可以跑滿60FPS,但隨即桌面環境整個崩潰。而Firefox ESR雖不會崩潰,但是FPS無法跑滿。 🤷 這就是為什麼我不用Snap的原因(小聲)

如果本網站文章對您有幫助,歡迎贊助我。