Proxmox VE是一套頗受好評的開源虛擬機管理器(VM Hypervisor),具備多樣化的虛擬、備份、儲存特色,再加上可以組成叢集、HA(高可用性)等備援功能,滿足企業營運所需。OSSLab也有推出各式客製化的伺服器,
提供使用者更好的組裝伺服器管道,搭配各式作業系統來滿足各種需求。
然而在當今走向視覺運算以及AI應用的趨勢,包括AI運算、深度學習、機器學習、智慧助理、工程繪圖、科學研究等應用,都需要搭配獨立的GPU做加速運算,讓複雜的工作可以提早完成。因此伺服器加裝GPU、Accelerator (加速卡)的需求也與日遽增。一般來說,要加裝高階GPU,建議還是使用塔式(Tower)的工作站伺服器比較好,畢竟其擁有較大的空間與散熱設計,來符合圖形工作站的需求。當然若要裝在一些機架式(Rack)的伺服器,也是可以的。只是最好要先得知該伺服器,是否可以安裝得下您顯示卡/繪圖卡/加速卡,再來決定是否以Rack Server來安裝GPU。
以Dell PowerEdge R740/R740xd這類2U的伺服器而言,由於PCI插槽預留的空間,還足夠安裝標準的GPU,建議可以去官方網站查看R740的Spec Sheet ,以及dell.com/GPU,來檢視是否支援您的GPU。
以R740為例,在Accelerator options裡面,就表示可以支援3張300W或是6張150W的GPU (或是4張FPGA卡)。列表如下:
NVIDIA Tesla P100, K80, K40, Grid M60, M10, P4
NVIDIA Quadro P4000
NVIDIA V100
Intel Arria 10GX FPGA
(在Nvidia授權下,官方不會建議你裝普通顯卡在Server內)
上述表示Quadro P4000 (GP104)是可以支援,而這次我們要選的是Quadro RTX 4000 (TU104),基本上是可以相容的。若擔心的話,可以先去GPU-Z的官網去查看Quadro P4000的規格,跟Quadro RTX 4000的外型大小一樣都是長x寬=24.1cm x 11.1cm,因此安裝上不會有問題。至於TDP部份,前者是105W,而後者則要160W。雖然比前代高出一些功耗,但R740系統表示可以支援到3張300W的GPU,還有我們並沒有要裝到3張,因此R740/R740xd是可以支援Quadro RTX 4000的。
Proxmox VE上的PCI Passthrough設定
確定Quadro RTX 4000可以安裝在R740伺服器之後,接下來就是進入Proxmox VE來進行一連串的PCI Passthrough (PCI透通)設定。以下就是設定的步驟:
1. 修改 /ETC/DEFAULT/GRUB
登入PVE的CLI模式,然後輸入以下指令 (這裡以 nano 文字編輯器為例,您可以使用其他編輯器):
nano /etc/default/grub
找到以下的字串:
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
然後改成以下的字串:
a. 若是Intel CPU則修改如下:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
b. 若是 AMD CPU則修改如下:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"
此外,還有注意有些Xeon處理器,在搭配GPU時,還要增加以下修改,才能完整讓PCIe GPU的透通性打開。
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction nofb nomodeset video=vesafb:off,efifb:off"
上面的video=vesafb:off,efifb:off 代表將顯示卡的Frame Buffer關閉。
上面的pcie_acs_override=downstream,multifunction 代表使用 ACS Override的方式來控制IOMMU族群
上述的地方都改好之後,記得將修改後的 /etc/default/grub 檔案寫回,並執行下列命令來更新 grub 的開機參數:
update-grub
2. 修改 /ETC/MODULES
接下來,然後輸入以下指令:
nano /etc/modules
然後輸入以下的字串:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
修改好了之後,記得儲存起來。這個動作主要是開啟VFIO模組,讓各裝置的I/O、岔斷、DMA等資訊安全地暴露至使用者空間(userspace),讓PVE虛擬機下的驅動程式,能夠正確無誤地取得GPU的資源。
3. 修改IOMMU岔斷之重新映射表
除了上述的修改,記得輸入以下的字串,讓IOMMU與VFIO運作正常。
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
echo "options kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf
4. 將不必要的驅動程式設成給黑名單
由於我們不希望Proxmox主系統去使用到GPU的任何資源,因此要將那些會初始化或動用到GPU的各項驅動程式給”黑名單”化,讓他們不要被載入系統。請輸入以下的指令來禁用這些GPU驅動程式:
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
5. 將GPU指派給VFIO
這個步驟可說是最重要的步驟之一,必須將GPU的PCI ID指派給VM來使用。請輸入以下指令:
lspci -v
接下來你應該可以看到許多PCI裝置列表,其中有幾行是跟你GPU有關的,仔細看一下,畫面會像以下這樣:
01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070] (rev a1) (prog-if 00 [VGA controller])
01:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
以上為 NVIDIA GeForce GTX 1070為例,像Quadro RTX 4000還有多了USB Controller和Serial Controller等裝置,以我們這次測試時的列表如下:
3b:00.0 VGA compatible controller: NVIDIA Corporation TU104 [Quadro RTX 4000] (rev a1)
3b:00.1 Audio device: NVIDIA Corporation TU104 High Definition Audio Controller (rev a1)
3b:00.2 USB controller ……
3b:00.3 Serial controller ……
一般只要注意VGA compatible controller和Audio device即可,而USB Controller和Serial Controller等裝置,這些都用不到,所以請記下您Video裝置的PCI ID (3b:00.0)和Audio裝置的PCI ID (3b:00.1)。如果您有換插別的PCI插槽,這些值也可能會變化,請記得要重新查一次。
記住上面的值之後,我們就要來查出GPU和Audio的Vendor ID和Device ID),可以執行以下的指令:
lspci -n -s 3b:00
接著畫面會出現類似以下的訊息:
3b:00.0 0300: 10de:1eb1 (rev a1) <— Video controller
3b:00.1 0403: 10de:10f8 (rev a1) <— Audio controller
3b:00.2 0c03: 10de:1ad8 (rev a1) <— USB controller
3b:00.3 0c80: 10de:1ad9 (rev a1) <— Serial controller
看到了沒,3b:00.0對應的就是VID/PID就是 10de:1eb1,而3b:00.1對應的則是10de:10f8,這兩個請記得寫下來(請根據您GPU的VID/PID來做對應的修改)。接著就是要將這些資訊對應到VFIO裡面,因此請輸入以下指令:
echo "options vfio-pci ids=10de:1eb1,10de:10f8 disable_vga=1"> /etc/modprobe.d/vfio.conf
以上的指令就是告訴VFIO去存取上述的Video controller和Audio controller,讓VM環境底下也能猶如Host端那樣,可以直接存取GPU資源,且讓GPU驅動程式安裝順利。對了,最後再記得輸入以下的指令:
update-initramfs -u
然後再輸入 restart 或 reboot 來重新開機,這樣您的Proxmox就順利打通PCI直通GPU的任督二脈!
Proxmox VE上的VM設定
設定好PCI透通GPU之後,接下來就是建立一個Windows VM (或Linux VM),來直接存取Quadro RTX 4000的資源,讓VM下也能進行GPU加速。實際測試中,Windows 10 VM必須改成OVMF (UEFI)模式,而Ubuntu 20.10 則是可用 BIOS或OVMF (UEFI)模式,但建議還是都改用UEFI模式比較保險。
以下就是建立VM的設定步驟:
Step 1: 建立VM
在Proxmox VE的Web主介面上,右上方有個Create VM (建立VM)的按鈕,按下去,接著在”一般”頁籤裡,輸入VM的名稱。”作業系統”頁籤指定你的Windows或Ubuntu的ISO檔。在”系統”頁籤則不變。”硬碟”頁籤則指定匯流排/裝置,自定是IDE,建議可以改用VirtIO Block來加速存取(但記得要再新增一台虛擬光碟並指定VirtIO drivers的ISO,以便讓Windows 10可以抓到該驅動程式),硬碟大小則取決您的需求,至於快取則可選擇Write Back。
接著在”CPU”頁籤, 插槽或核心數就端看您的選擇,建議核心總數8以下就可以了,類別則請選host。再來是”記憶體”頁籤,一般要跑3D運算,建議至少8GB (8192MB)以上。再來是”網路”頁籤,一般不需要去動到,若必要的話,可以將型號設定成 VirtIO 半虛擬化。
最後”確認”頁籤裡面,把”建立完成後開機”選項先關閉,然後按完成。
Step 2: 細部調整 (這步非常重要,請仔細閱讀)
建立好的VM,先別急著開機,還有一些微調要進行。首先是在左方點選新建立好的VM代號與名稱,然後點中間的”硬體”功能,然後點右邊找到BIOS,若是”預設(SeaBIOS)”的話,請按”編輯”,並調成OVMF (UEFI)模式。至於是否新增EFI Disk則看需求,可以不用加入。然後,在機器架構那邊,從改成q35。
接著看一下”選項”裡面的”開機順序”,按”編輯”,記得把cdrom裝置移到最上方,以便開機時即可從光碟開機來安裝系統。
還沒完喔!接下來請進入Proxmox的CLI介面,記住剛剛的VMID (以131為例),然後輸入:
nano /etc/pve/qemu-server/131.conf
(上述的131為剛剛建立VM的虛擬機代號,請根據你的號碼來更改)
然後檢查是否以下的參數:
machine: q35
cpu: host,hidden=1,flags=+pcid
args: -cpu 'host,+kvm_pv_unhalt,+kvm_pv_eoi,hv_vendor_id=NV43FIX,kvm=off'
上述的NV43FIX可以改成你想要的其他代號,例如TU104VM等等。
以上改完之後,接下來回到Proxmox的Web介面。點選該VMID (如131),然後點”硬體”,然後再右邊點”增加” “PCI裝置”,此時列出的裝置中,將NVIDIA的3b:00.0 (Video Device)和3b:00.1 (Audio Device)加進來。記得加入時把右下方的”進階”選項打開。然後確定把”所有功能“、”ROM-Bar“、”PCI-Express“選項都打勾,再按”增加”即可。注意”主要GPU“這個功能先別打開。
Step 3: 安裝作業系統與GPU驅動程式
剛剛建立好的VM,現在終於可以開機並安裝Windows 10 (或Ubuntu)了。一般來說,只要上述的步驟都完成之後,即可順利在VM下安裝GPU驅動程式,並執行各式GPU或是GPGPU的應用程式 (包含Direct3D、OpenGL、Vulkan、OpenCL、CUDA、Optix等API)。
安裝完作業系統之後,Windows 10使用者一般只要安裝好NVIDIA或AMD的顯示卡驅動程式即可。至於Ubuntu的使用者,則可透過額外驅動程式,來換裝NVIDIA或AMD的驅動程式,必要時才去顯示卡官網下載Linux的Driver。
Step 4: 驗收與效能測試
驗收的部份,建議可以透過GPU-Z來檢視GPU驅動程式是否正確安裝並執行中,並透過GPU的控制程式來進行簡易的測試。
▲以GPU-Z檢視Quadro RTX 4000是否能在VM環境下運作正常
以Windows 10使用者來說,最快就是安裝遊戲來驗證是否可以執行。至於Ubuntu的話,也是可以安裝Steam for Linux或是其他OpenGL的應用程式來驗證。若要測試效能,則可安裝各式Benchmark程式。例如Geekbench,或是Blender Benchmark等,建議這些以工作站/伺服器為主的跨平台GPU測試程式來進行效能驗證。
▲以Ubuntu內建的NVIDIA X Server Settings驅動程式,來檢視Quadro RTX 4000是否能在VM環境下運作正常
值得注意的是: 在前面建立VM時,硬體項目中有個顯示卡的選項,一般設定成”預設“即可,或是選擇VirtIO-GPU也是OK的,以一般以工作站繪圖應用、視訊硬體編碼的話,大多求的是繪製品質,而非需要畫面非常流暢。若您的使用環境需要很流暢的畫面(例如玩遊戲),那麼就建議設定成SPICE模式,並搭配在客端電腦上安裝Spice Guest Tools,這樣在檢視VM內容時,就能方便切換解析度,並獲得流暢的畫面。另一種方法就是使用微軟內建的RDP (遠端桌面)連線方式,在VM開啟RDP功能,然後客端電腦使用RDP的方式,來操作該VM。
效能測試與燒機
確定好上述都完成之後,接下來就可以進行一連串的測試了。除了安裝GPU-Z之外,為確保您的GPU不會讓Server過熱,Windows 10平台下建議可以安裝FurMark來進行燒機測試,以測試GPU溫度是否會過熱。
▲Windows 10下,可透過FurMark來對Quadro RTX 4000進行燒機測試,最高溫度80度C,表示長時間運作下都能保持散熱順暢,並穩定運作!
接下來就是針對效能測試部份,是否會與實體機相差太多,一般來說,GPU經過PCI Passthrough之後,效能大致會降低個5~10%。我們先來測試GPU的效能,由於Quadro RTX 4000主要用途是拿來做工作站繪圖,亦可拿來做深度學習等加速運算。因此比較不建議拿這樣的卡來安裝到Server上用VM玩遊戲。
接下來的部份,我們先以Blender Benchmark,來測試CUDA與Optix (光追)的效能。以下便是在Ubuntu 20.10的環境下所進行的測試。
▲Ubuntu 20.10環境下,以Blender Benchmark來測試6種場景的render圖時間! 以bmw27場景來說,只要不到55sec即可搞定
從上述可以看到,以CUDA API來進行Ren圖,跟Blender官方的效能開放數據資料庫相比,可以發現以下的效能比較差距。
▼以Blender Benchmark,透過CUDA介面來測試實體機與虛擬機的Quadro RTX 4000效能
Blender Benchmark (CUDA) |
Physical Machine |
VM |
Performance hit |
bmw27 |
54.509 |
55 |
-0.01 |
classroom |
209.931 |
215 |
-0.02 |
fishy_cat |
136.364 |
114 |
+0.2 |
koro |
207.028 |
186 |
+0.11 |
pavillon_barcelona |
347.616 |
339 |
+0.03 |
victor |
721.606 |
498 |
+0.45 |
若是改以Optix API (針對Raytracing優化的API)來進行Ren圖,跟Blender官方的效能開放數據資料庫相比,可以發現以下的效能比較差距。
▼以Blender Benchmark,透過Optix介面來測試實體機與虛擬機的Quadro RTX 4000效能
Blender Benchmark (Optix) |
Physical Machine |
VM |
Performance hit |
bmw27 |
30.8064 |
27 |
+0.14 |
classroom |
127.318 |
123 |
+0.04 |
fishy_cat |
57.1906 |
59 |
-0.03 |
koro |
109.163 |
209 |
-0.48 |
pavillon_barcelona |
157.784 |
148 |
+0.07 |
victor |
349.744 |
250 |
+0.40 |
上述可以發現,這邊VM環境下,效能有超過實體機(Physical Machine)的表現(有可能是誤差值)。但可知,我們在VM下的PCI-E Direct GPU,也是幾乎能發揮出實體機環境下應有的水準。至於上述那個-0.48,主要是因為GPU被安裝在PCIe 3.0 x8的插槽(參考上述GPU-Z截圖),這部份倒是可以改安裝到PCIe 3.0 x16的插槽,就能再發揮全速。
至於Windows 10的環境下,我們改以Geekbench 5來進行測試。以下就是在虛擬機下的虛擬硬體配備與測試成績:
▲Windows 10環境下,以Geekbench 5來測試VM的Vulkan分數 (官方實體機測試數據為64904分)
▲Windows 10環境下,以Geekbench 5來測試VM的OpenCL分數 (官方實體機測試數據為78546分)
▲Windows 10環境下,以Geekbench 5來測試VM的CUDA分數 (官方實體機測試數據為95091分)
從上述可以看到,不同API的分數,VM和實體機的表現都有一些差距,比較如下:
▼以Geekbench 5,透過各種介面來測試實體機與虛擬機的Quadro RTX 4000效能
Geekbench 5 |
Physical Machine |
VM |
Performance hit |
Vulkan Score |
64904 |
52968 |
-0.23 |
OpenCL Score |
78546 |
85742 |
+0.08 |
CUDA Score |
95091 |
93822 |
-0.01 |
從上面可以看到虛擬機的效能上,除了Vulkan Score之外,其他都與實體機相差無異。
虛擬機也是能發揮出等同實體機的效能
以上的測試可以發現,在Proxmox VE下打開PCI Passthrough模式,讓VM直通GPU,相容性與效能上都能等同實體機的表現。因此,在組裝伺服器時,若有GPU運算的需求,就可以考慮加裝一張GPU,來達到GPU加速運算的效果。上述的數據,僅供給大家參考。