快轉到主要內容

教你在Arch Linux安裝Nvidia、CUDA、cuDNN、TensorRT專有驅動程式

分類   Linux系統 Linux使用技巧
標籤   Arch Linux Nvidia
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

本文解說如何在Arch Linux安裝Nvidia專有驅動,解決畫面撕裂問題,以及介紹如何安裝相關的CUDA、cuDNN、TensorRT、NVIDIA Container Toolkit套件。

Linux核心內建的Nvidia驅動是為開源的nouveau,由Linux社群逆向工程而來。nouveau讓你至少開機有畫面,但是一跑3D程式就破功了,nouveau的圖形效能只有Nvidia官方專有(閉源)驅動的一半,所以安裝Nvidia專有驅動乃必要之舉。

儘管 Nvidia官方有詳細的驅動安裝說明文件,但壓根沒提到Arch Linux系的發行版。所幸有全球社群的協助,Arch Linux還是可以安裝Nvidia推出的各式技術與產品的。

一般用戶玩遊戲只要裝完Nvidia專有驅動即可。要跑3D渲染、神經網路(Neural Network)、深度學習(Deep Learning)等AI相關程式的用戶才需要裝後面的CUDA、cuDNN、TensorRT套件。

NVIDIA Container Toolkit是為想跑CUDA但又不想裝多重CUDA版本的用戶所設計的容器工具。

1. 安裝Nvidia專有驅動
#

撰文當下的Linux核心版本:6.8.7

Nvidia驅動版本:550

1.1. 桌上型電腦
#

桌上型電腦指的是以Nvidia當主顯示卡的配置。

Arch Linux官方建議使用pacman安裝Nvidia驅動,不要執行Nvidia官網提供的.run程式,這樣裝錯了才方便移除。

  1. 執行指令sudo lspci -k | grep -A 2 -i "NVIDIA"查看現在顯卡是使用哪個驅動。沒安裝專有驅動前,Linux應該會載入nouveau驅動。

  2. Maxwell架構以後的顯示卡,用以下指令安裝最新Nvidia驅動。安裝後nouveau應會被禁止載入(黑名單指令寫在/usr/lib/modprobe.d/nvidia-utils.conf)。

sudo pacman -S nvidia nvidia-utils
  1. 建議安裝純文字工具「nvtop」用於查看顯示卡使用率
sudo pacman -S nvtop
  1. 安裝驅動後重開機。

  2. nvidia-smi指令檢查安裝狀況,如果有顯示驅動版本代表驅動安裝成功。Nvidia驅動應是開箱即用的,無需手動調整X伺服器設定。

  3. 再度執行指令sudo lspci -k | grep -A 2 -i "NVIDIA",查看nouveau是否已經變成nvidia驅動。

  4. 試著開瀏覽器看高畫質影片,再於終端機執行nvtop指令,可從圖表的顯卡使用率確認Nvidia顯示卡有無參與圖形算繪。


進階用法:如果你常常換核心開機(例如linux-zenlinux-lts),那裝DKMS版的Nvidia驅動會更妥當,它會在每次更新核心時自動編譯。

sudo pacman -R nvidia
sudo pacman -S nvidia-dkms nvidia-utils linux-headers

若是需要「特定版本」的Nvidia驅動,那麼可以到 AUR找舊版驅動,以DKMS安裝:

yay -S nvidia-535xx-dkms

1.2. 雙顯卡筆電
#

搭載Nvidia顯卡的Linux筆電的安裝驅動方式跟桌上型電腦一樣。

不過,Intel+Nvidia的雙顯卡筆電,即使裝了Nvidia驅動也可能繼續用Intel顯卡渲染3D,導致3D性能低下。

此時請使用 PRIME指令啟用Nvidia顯示卡渲染;或者用 Envy Control完全切換顯卡渲染工作。

如果Nvidia專有驅動導致進入tty黑螢幕的話,於/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT引數加入nomodeset,再更新GRUB。

2. 解決Nvidia畫面撕裂問題
#

KDE 6在X11的工作階段可能會遇到動畫lag、捲動螢幕出現條紋、遊戲畫面撕裂(tearing)的問題。

  1. 以root執行Nvidia X server Setting
sudo nvidia-settings
  1. 點選Advanced,勾選Force Composition Pipeline

  2. 取消勾選Sync to Blank和Allow Flipping設定,關閉VSync

  3. 電源模式勾選Prefer Maximum Performance

  4. 點選Save to X Configuration File,將設定檔寫入至/etc/X11/xorg.conf

  5. 編輯/etc/environment

sudo vim /etc/environment
  1. 加入以下環境變數。__GL_SYNC_DISPLAY_DEVICE後面填寫螢幕代號(可以在Nvidia X server settings看),KWIN_X11_REFRESH_RATE填寫螢幕重新整理頻率*1000的數值,例如我是60Hz。
__GL_SYNC_DISPLAY_DEVICE=HDMI-0
VDPAU_NVIDIA_SYNC_DISPLAY_DEVICE=HDMI-0
__GL_SYNC_TO_VBLANK=0

KWIN_X11_REFRESH_RATE=60000
KWIN_X11_NO_SYNC_TO_VBLANK=1
KWIN_X11_FORCE_SOFTWARE_VSYNC=1

重開機試試,畫面應該會改善許多。

如果還是不行,試試在登入畫面切換成KDE Wayland工作階段。KDE 6 (Nvidia驅動版本 > 545) 得啟用DRM才能正常進入Wayland工作階段。

su
mkdir /etc/modprobe.d
echo "options nvidia_drm modeset=1 fbdev=1" >> /etc/modprobe.d/nvidia.conf

或者嘗試降級Nvidia驅動版本、將Linux核心更換成linux-lts

3. 安裝CUDA
#

CUDA (Compute Unified Device Architecture),在做深度學習、Blender渲染時常用到的技術。

本文撰寫時點CUDA最新版本為12.4

  1. 安裝CUDA,重開機:
sudo pacman -S cuda
  1. nvcc --version指令確認CUDA版本。

  2. Arch Linux會將CUDA相關檔案安裝至/opt/cuda,有需要的話可以將CUDA的PATH加到~/.bashrc,此路徑永遠指向最新版CUDA。

export PATH=/opt/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/opt/cuda/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

  1. 欲安裝舊版本CUDA,去 AUR找社群打包的就可以了。

  2. 例如現在最新版是CUDA 12,而你需要CUDA 11.1,就從AUR裝。舊版CUDA會安裝到/opt/cuda-版本號

yay -S cuda-11.1
  1. CUDA可以多版本共存,改一下~/.bashrc裡面的路徑,指向舊版就行了。
export PATH=/opt/cuda-11.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/opt/cuda-11.1/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

4. 安裝cuDNN
#

CUDA Deep Neural Network (cuDNN),用於加速神經網路的函式庫。

撰文當下cuDNN版本為8.9.7.29。

  1. 安裝cuDNN:
sudo pacman -S cudnn
  1. 同CUDA, AUR上也有舊版本cuDNN可以安裝。

5. 安裝TensorRT
#

TensorRT是Nvidia推出的深度學習推理平台。

  1. 因為軟體授權限制,無法直接用yay裝,需要手動複製AUR儲存庫
sudo pacman -S base-devel
git clone https://aur.archlinux.org/tensorrt.git
  1. 然後到 Nvidia官網註冊帳號,下載tar.gz檔(注意版本需跟CUDA一致),放到tensorrt目錄

  2. 安裝python-oonx

yay -S python-onnx python-onnxruntime python-tensorflow-cuda
  1. 同步依賴套件,編譯安裝
cd tensorrt
makepkg --syncdeps
makepkg --install

6. 安裝NVIDIA Container Toolkit套件
#

這是Nvidia設計給Docker/Podman用的工具,讓你只需要在宿主機安裝Nvidia驅動,不需安裝CUDA套件,也能讓容器使用CUDA運算。

  1. 安裝套件
sudo pacman -S nvidia-container-toolkit
  1. 新增設定檔
sudo mkdir /etc/docker
sudo vim /etc/docker/daemon.json
  1. 填入以下內容
{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
  1. 重新啟動Docker
sudo systemctl restart docker
  1. 拉取CUDA 12.1版本的映像檔
sudo docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu20.04 nvidia-smi
  1. 測試能否在容器執行nvidia-smi,印出Nvidia驅動的資訊。

參考資料
#

相關文章

比較Arch Linux核心差異:linux, linux-zen, linux-lts, linux-hardened
分類   Linux系統 Linux使用技巧
標籤   Arch Linux Linux Kernel
fontconfig調整Linux中文預設字體的優先順序,修正字體模糊、Emoji亂碼的問題
分類   Linux系統 Linux使用技巧
標籤   Ubuntu Arch Linux
Linux如何設定開機自動執行應用程式
分類   Linux系統 Linux使用技巧
標籤   Ubuntu Arch Linux

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

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