快轉到主要內容

FreeBSD安裝Nvidia閉源驅動與CUDA,用GPU加速程式效能

· 民國115年丙午年
·
切換繁體/簡體
分類 資訊科技 BSD系統
標籤 FreeBSD Nvidia CUDA
目錄

測試環境:

  • FreeBSD 15 Release
  • Nvidia閉源驅動版本:580

介紹如何在FreeBSD系統設定Nvidia顯示卡的驅動。

Nvidia除了Linux之外,尚有提供其他Unix-like系統的驅動,包括FreeBSD與Solaris。

FreeBSD沒有開源的Nvidia驅動。Nvidia在Linux有逆向工程出來的「nouveau」開源驅動可用,功能不若Nvidia官方閉源驅動完善,頂多讓電腦開機有畫面。但是FreeBSD這邊由於xf86-video-nouveau已經很久沒人維護了,需要手動編譯,FreeBSD沒有nouveau驅動可用,所以不裝Nividia閉源驅動就是沒法顯示圖形界面。或者即使有辦法輸出畫面,也會是CPU渲染的「llvmpipe」。

除驅動之外,Nvidia推出的閉源技術,例如CUDA,壓根沒有官方FreeBSD版。不過可以用Linuxulator技術跑Linux版的CUDA,這樣部份Python函式庫依賴CUDA的問題也能得到解決。

裝CUDA的用途為何?這不是必要元件,只是有些程式會用到,比如我參考的教學文章的作者是為了在FreeBSD跑Stable Diffusion WebUI的AI生圖才研究怎麼裝CUDA的~!Man of culture的力量好偉大。

但是這樣也代表依賴CUDA的程式得用Linux模擬方式跑啊。比如FreeBSD套件庫的Blender得用特殊指令才能存取CUDA。

1. 安裝Nvidia閉源驅動
#

  1. Nvidia官網只有編譯好的驅動壓縮包,沒有提供FreeBSD專門的套件庫,所以我們直接從FreeBSD套件庫裝驅動就可以了。

  2. Nvidia官網查看顯示卡是否仍受Linux閉源驅動支援,像我的顯示卡為Nvidia GTX1050Ti已經停止支援,最高只能裝到580版本的驅動,因此得從FreeBSD套件庫選取對應版本的nvidia-driver-xxx驅動。若是還有支援的顯示卡就直接選最新版nvidia-drm-kmod驅動。

指定安裝特定版本的Nvidia驅動,這裡的例子是580版本,也就是最後支援GTX1050Ti的驅動版本:

sudo pkg install nvidia-driver-580 nvidia-settings

若是最新Nvidia顯示卡,就直接裝這個drm-kmod:

sudo pkg install nvidia-drm-kmod
  1. 之後,把Nvidia核心模組加入開機自動啟動選項。根據FreeBSD手冊指示,最新版驅動應該以DRM模組方式載入,所以使用nvidia-drm,表示啟用modesetting。舊版的驅動是使用nvidia-modeset
sudo sysrc kld_list+=nvidia-drm

註:如果以上驅動會導致kernel panic,請使用舊版載入Nvidia驅動的方法:

sudo sysrc kld_list+=nvidia
# 或者
sudo sysrc kld_list+=nvidia-modeset
  1. 強制讓驅動啟用modesetting
echo "hw.nvidiadrm.modeset=1" | sudo tee -a /boot/loader.conf
  1. 如果重開機後無法啟動X Server,就強迫Nvidia產生/etc/X11/xorg.conf
sudo nvidia-xconfig

另一種方式是手寫X.org設定檔。用pciconf -lv | grep -B4 VGA指令查看Nvidia顯示卡的BusID。接著編輯/usr/local/etc/X11/xorg.conf.d/20-nvidia.conf,啟用Nvidia DRM驅動:

Section "Device"
    Identifier "Nvidia"
    Driver     "modesetting" # 使用DRM驅動,如果不要用就改回nvidia
    BusID      "PCI:1:0:0"
#    Option     "AccelMethod" "uxa" 如果畫面撕裂取消註解這二行
#    Option     "TearFree"  "true"
EndSection
  1. 重開機,用nvidia-smi指令確認Nvidia驅動版本:

2. 安裝CUDA
#

  1. 需要給FreeBSD啟用Linuxulator支援,但不需要安裝Jail。

  2. 安裝以下套件,這個libc6-shim可讓FreeBSD跑Linux的glibc

sudo pkg install libc6-shim linux-nvidia-libs
  1. 預設情況跑nvidia-smi是不會印出相容的CUDA版本的,故改用nvidia-slurp執行
nv-sglrun nvidia-smi
  1. 這樣會看到該Nvidia GPU相容的CUDA版本:CUDA Version: 12.0

  2. 安裝Linux的編譯器

pkg install linux-rl9-devtools
  1. 使用Linux的cc編譯 uvm_ioctl_override.c.
fetch https://gist.githubusercontent.com/shkhln/40ef290463e78fb2b0000c60f4ad797e/raw/f640983249607e38af405c95c457ce4afc85c608/uvm_ioctl_override.c

/compat/linux/bin/cc --sysroot=/compat/linux -m64 -std=c99 -Wall -ldl -fPIC -shared -o dummy-uvm.so uvm_ioctl_override.c
  1. 然後安裝linux-rl9-libglvnd以取得libGL.so.1
sudo pkg install linux-rl9-libglvnd

3. 執行需要CUDA的程式
#

以Blender為例,從FreeBSD套件庫安裝

sudo pkg install blender

然後用nvidia-slurp執行,Blender的選單就認得到CUDA裝置了

nvidia-slurp blender

ffmpeg、OBS Studio的NVENC加速比照辦理。

註:FreeBSD論壇的用戶ziomario使用FreeBSD 13成功執行CUDA加上Blender,但是FreeBSD 15會出現錯誤exec: No such file or directory,似乎是bug?

根據用戶julien40的回報,將Nvidia驅動降版可以解決該問題。

4. 雙螢幕問題
#

FreeBSD 15對不同顯示卡的雙螢幕支援度不太好的樣子。如果同時使用「Intel CPU內顯 + Nvidia」的場合,i915kmsnvidia-drm只能有一個DRM模組載入,因此只有一個螢幕會有畫面。

解決方法是將螢幕線都插在Nvidia的孔上。

另外一個方案是將Intel顯示卡作為主要顯示卡,Nvidia以nvidia而非nvidia-drm的方式載入模組。這樣開機後雖然只有一個螢幕輸出,但Nvidia命令行仍能使用。

Nvidia PRIME在FreeBSD的使用方法未知。

參考資料
#

相關文章


此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Giscus留言板,需要Github帳號才能留言。支援Markdown語法,若要上傳圖片請善用外部圖床。您的留言會在Github Discussions向所有人公開。

Click here to edit your comments.

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用外部圖床網站。