megrxu

GPU Enabled PVE Setup

本來打算裝好驅動之後單純分配賬戶給實驗室其他同學使用,但是似乎也不是很方便,同時各個同學的環境也沒辦法隔離,也不能都有 sudo。所以還是想著裝個 PVE 吧。

查了一圈,發現還是隻有 Proxmox 滿足需求。

PCI Passthrough

參照 PVE 的官方文件,主要分為以下幾個步驟:

  • 如果用的是 grub,新增 grub 的核心引數,啟用 IOMMU。(intel_iommu=on 或者 amd_iommu=on)注意完成後需要執行 update-grub 重新生成 grub 配置。
  • 新增開機啟用的核心模組。
    1
    2
    3
    4
    
    vfio
    vfio_iommu_type1
    vfio_pci
    vfio_virqfd
    
  • 找到顯示卡對應的 Device ID,據此修改 vfio 的配置檔案 /etc/modprobe.d/vfio.conf,並且在宿主機上關閉對應的驅動。
  • 修改 qemu 虛擬機器配置為 ovmf ,修改機器型別為 q35。

至此,在虛擬機器內部裝好驅動之後,可以跑 nvidia-smi 了。然而不幸的是同時這臺虛擬機器的虛擬網絡卡也失效了。 查找了原因,有可能是在直通顯示卡的時候,由於只能按 IOMMU 組進行直通,而網絡卡在同一個 IOMMU 組內,導致網絡卡也被迫直通了。 根據 Archlinux Wiki 上的指令碼,測試了一下該機器上的 IOMMU 組。

1
2
3
4
5
6
7
8
#!/bin/bash
shopt -s nullglob
for g in `find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V`; do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

然而好像顯示卡和網絡卡並不在同一個組內。同時,此時意識到其實直通顯示卡對原本設想的使用場景來說並沒有什麼好處(直通了顯示卡之後,別的虛擬機器顯然不能使用直通後的顯示卡了。和直接把宿主機賬戶分配給各個同學無異,反而更麻煩了。),就沒有進行下一步研究了,轉而去探索容器化的解決方案。

LXC 容器使用宿主機顯示卡

較為簡單,只要在宿主機上將顯示卡驅動起來,將對應的裝置掛載到容器內部,然後在容器內部安裝好相同版本的驅動的庫檔案即可。 總體來說,主要參考的是這篇部落格

有幾點需要注意:

  • nvidianvidia_uvm 兩個核心模組在裝好官方驅動之後不會自動啟用。雖然直接在宿主機上使用顯示卡似乎不用很早啟用這倆模組,但是在容器內部使用的時候需要將一些相關裝置掛載,因此這裡要干預一下。
  • LXC 設定的時候,需要同步設定 cgroup 關於掛載裝置的讀寫許可權,否則容器是沒有許可權使用這些裝置的。
  • 在容器內使用 nvidia-smi 指令,無法列舉出當前執行的所有程式。原因是目前 nvidia-smi 還不支援 PID namespace 。

這樣配置好之後,將容器轉化為一個模板,等需要新建的時候直接使用這個模板就能得到一個能直接在裡面使用顯示卡的容器了。相當方便。

兩個容器
兩個容器


可能相關的