這陣子因為工作關係,不定期的就安裝了一次 GPU 驅動程式,雖然不到每天安裝的程度,但每次安裝時都還是會忘記流程,還是需要上網找資料,於是今天就自己記錄一下吧。 這篇文章是我在 Ubuntu 22.04 安裝 GeForce RTX 4070 驅動、CUDA 及 cuDNN 的紀錄,提供大家參考。

禁用 nouveau 驅動

第一步需要先禁用 Ubuntu 內建的 nouveau 驅動,再安裝 NVIDIA 驅動。 這一步似乎不一定要做,有幾次我忘記禁用還是可以安裝驅動,不過早期我在安裝驅動時,是一定要做這個步驟的,可能跟驅動程式有關吧。

            
                # 禁用 nouveau 驅動
                # 在 /etc/modprobe.d/blacklist-nouveau.conf 檔案中加入下方兩行字
                # blacklist nouveau
                # options nouveau modeset=0
                echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf && echo "options nouveau modeset=0" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf

                # 更新 kernel initramfs
                sudo update-initramfs -u

                #  重開機
                reboot

                # 執行後,沒有出現任何訊息,就表示成功禁用 nouveau 驅動
                lsmod | grep nouveau

                # 也可以使用以下指令檢查一下 configuration 是否還有 nouveau 文字
                sudo lshw -numeric -C display
            
        

安裝 NVIDIA 驅動程式

先更新一下作業系統還有安裝一些套件。

            
                # 更新及安裝套件
                sudo apt-get update
                sudo apt-get install libc-dev -y
                sudo apt-get install linux-headers-$(uname -r) -y
                sudo apt-get install ubuntu-drivers-common
            
        

自動偵測支援目前顯卡所需得驅動版本。

            
                # 這個指令會直接輸出建議安裝驅動
                nvidia-detector

                # 這個指令會列出全部支援的驅動
                # 請注意有一行會顯示 recommended
                ubuntu-drivers devices
            
        

我偵測到的驅動是 nvidia-driver-535,所以直接以 nvidia-driver-535 為例進行安裝,實際上請記得置換成符合您顯卡的驅動。

            
                # 您可以選擇手動安裝
                sudo apt-get install nvidia-driver-535 -y

                # 也可以選擇自動安裝 recommended 的驅動
                sudo ubuntu-drivers autoinstall
            
        

確認是否正確安裝。

            
                # 輸入 nvidia-smi 如果看到以下畫面就表示安裝成功了。
                nvidia-smi

                +---------------------------------------------------------------------------------------+
                | NVIDIA-SMI 535.129.03             Driver Version: 535.129.03   CUDA Version: 12.2     |
                |-----------------------------------------+----------------------+----------------------+
                | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
                | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
                |                                         |                      |               MIG M. |
                |=========================================+======================+======================|
                |   0  NVIDIA GeForce RTX 4070        Off | 00000000:01:00.0 Off |                  N/A |
                |  0%   38C    P0              31W / 200W |      2MiB / 12282MiB |      0%      Default |
                |                                         |                      |                  N/A |
                +-----------------------------------------+----------------------+----------------------+

                +---------------------------------------------------------------------------------------+
                | Processes:                                                                            |
                |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
                |        ID   ID                                                             Usage      |
                |=======================================================================================|
                |  No running processes found                                                           |
                +---------------------------------------------------------------------------------------+
            
        

安裝 CUDA

CUDA 是一種由 NVIDIA 提供的並行計算平台與程式設計介面(API),主要透過 NVIDIA GPU 的運算能力,來加速運算密集型的任務,特別適用於科學計算、深度學習、機器學習和大規模資料處理等領域。簡單來說,CUDA 能夠有效提升 GPU 的運算效能,讓程式執行得更快速。

在安裝 CUDA 時,需注意 CUDA 的版本必須與現有的 GPU 驅動程式相容。您可以透過 nvidia-smi 指令查看目前已安裝的 GPU 驅動所支援的最高 CUDA 版本。例如,我的主機支援的 CUDA 版本為 12.2。 接下來,請透過以下連結前往 NVIDIA 官方網站,選擇適合您需求的 CUDA 安裝方式。官網提供了 deb(local)、deb(network) 和 runfile(local) 三種安裝方式,您可以依照個人喜好任選其一。我個人習慣使用 deb(network) 的方式。

附帶一提,CUDA 安裝套件同時包含了 GPU 驅動與 CUDA Toolkit,如果您直接安裝 CUDA 套件,系統會自動安裝相對應的 GPU 驅動。但由於上述步驟中我們已經安裝過驅動程式,因此在此步驟我們僅需安裝 CUDA Toolkit 即可。

            
                wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
                sudo dpkg -i cuda-keyring_1.1-1_all.deb
                sudo apt-get update
                sudo apt-get -y install cuda-toolkit-12-2

                # [不要執行] 以下指令會連同驅動一起安裝
                sudo apt-get -y install cuda

                # 加入環境變數
                # 這個指令是暫時修改環境變數而已
                # 如果要永久修改,請將以下兩行文字複製到 ~/.bashrc 檔案中的最後一行
                export PATH=/usr/local/cuda-12/bin${PATH:+:${PATH}}
                export LD_LIBRARY_PATH=/usr/local/cuda-12/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
            
        

確認是否正確安裝。

            
                # 方法一:直接使用 nvcc 指令
                nvcc -V
                # 正確安裝的話,會輸出以下內容
                nvcc: NVIDIA (R) Cuda compiler driver
                Copyright (c) 2005-2023 NVIDIA Corporation
                Built on Tue_Aug_15_22:02:13_PDT_2023
                Cuda compilation tools, release 12.2, V12.2.140
                Build cuda_12.2.r12.2/compiler.33191640_0

                # 方法二:使用 deviceQuery 工具
                git clone https://github.com/NVIDIA/cuda-samples
                cd cuda-samples/Samples/1_Utilities/deviceQuery
                make
                ./deviceQuery
                # 會輸出一大堆東西,但只要注意有輸出 Result = PASS 就代表成功安裝
            
        

安裝 cuDNN

cuDNN(CUDA Deep Neural Network library)是由 NVIDIA 開發的 GPU 加速函式庫,專門用來提升深度神經網路(Deep Neural Networks, DNN)效能所設計。cuDNN 提供針對深度學習中常見運算(如卷積、池化與激活函數等)的高度優化實作,可有效發揮 NVIDIA GPU 的計算性能,進而加速模型的訓練與推論速度。

安裝 cuDNN 時需注意其與 CUDA 的版本相容性。在下載 cuDNN 前,您必須先註冊一個 NVIDIA 開發者帳號。請透過以下連結前往 NVIDIA 官方網站,選擇與您 CUDA 版本相符的 cuDNN 安裝檔,網站將引導您完成帳號註冊與檔案下載程序。

            
                # 啟用本機儲存庫
                sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.5.30_1.0-1_amd64.deb

                # 導入 GPG 金鑰
                sudo cp /var/cudnn-local-repo-*/cudnn-local-*-keyring.gpg /usr/share/keyrings/

                # 更新安裝源資料
                sudo apt-get update

                # 查詢是否有 libcudnn8 套件
                apt-cache search libcudnn8

                # 查詢 libcudnn8 安裝資訊
                apt-cache policy libcudnn8

                # 安裝 cuDNN
                sudo apt-get install libcudnn8=8.9.6.50-1+cuda12.2
            
        

確認是否正確安裝。

            
                sudo apt install libfreeimage3 libfreeimage-dev
                sudo apt-get install libcudnn8-samples=8.9.6.50-1+cuda12.2
                cp -r /usr/src/cudnn_samples_v8/ ~
                cd ~/cudnn_samples_v8/mnistCUDNN/
                make
                ./mnistCUDNN
                # 會輸出一大堆東西,但只要注意有輸出 Test passed! 就代表成功安裝
            
        

安裝 DKMS (非必要)

DKMS(Dynamic Kernel Module Support)是 Linux 系統中用於動態管理內核模組的框架。 當 Linux 內核更新時,原本編譯好的內核模組可能會因版本不同而產生相容性問題,導致無法正常運作。 DKMS 的主要功能就是在偵測到內核更新後,自動重新編譯並安裝相關模組,以確保模組與新版本的內核相容。 例如,在安裝 NVIDIA 顯示卡驅動後,有時會遇到驅動突然失效或無法正常運作的問題,這通常是由於系統內核更新後,原先安裝的 NVIDIA 驅動模組未經重新編譯所導致。 透過 DKMS 機制,可有效避免這種情況的發生,確保驅動在每次內核更新後仍能正常運作。

            
                # 安裝 DKMS
                sudo apt-get install dkms

                # 當您安裝 NVIDIA 驅動後,可以在 /usr/src 目錄中找到驅動原始檔
                ls /usr/src | grep nvidia

                # 使用 DKMS 安裝驅動
                sudo dkms install -m nvidia -v 535.129.03

                # 查看 DKMS 管理的模塊
                dkms status
            
        

安裝 GDS (非必要)

GDS (GPUDirect Storage) 是 NVIDIA 開發的一項技術,主要是通過減少 CPU 的參與,直接在 GPU 和存儲之間實現高效的數據傳輸,這可以加快模型參數載入的速度。

這一項我還沒有深入研究,先在這裡做個紀錄,以下是官網安裝指南,提供大家參考。

安裝 NVIDIA Container Toolkit (在 Docker 中使用 GPU)

Docker 是現今很常見的部署工具,要讓 Docker 也能使用 GPU 的話,還需要額外安裝 NVIDIA Container Toolkit。

            
                # 安裝 apt 安裝源
                curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
                  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
                    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
                    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list 

                # 更新
                sudo apt-get update

                # 安裝 NVIDIA Container Toolkit
                sudo apt-get install -y nvidia-container-toolkit
            
        

安裝完成後,還需要對 Docker 進行一些設定。

            
                # 設定 Docker 識別 NVIDIA Container Runtime
                sudo nvidia-ctk runtime configure --runtime=docker

                # 重新啟動 docker 服務
                sudo systemctl restart docker
            
        

鎖定 GPU 驅動版本

雖然 DKMS 可以在 Linux 內核更新時,自動重新編譯 NVIDIA 的驅動模組,以避免 GPU 驅動失效,但實際上仍存在另一種情況可能導致 GPU 驅動失效,那就是系統或套件管理程式自動更新 GPU 驅動版本。 為了避免因此產生不必要的問題和大量電話,我通常會將 GPU 驅動版本鎖定,防止其自動更新。 不過,鎖定版本後,建議還是需要定期進行手動更新,以確保驅動版本保持最新的安全性與效能修正。

            
                # 安裝 GPU 驅動版本
                sudo apt-mark hold nvidia-driver-535
                sudo apt-mark hold nvidia-kernel-source-535
                sudo apt-mark hold nvidia-kernel-common-535

                # 確認鎖定是否成功
                apt-mark showhold
            
        

移除驅動

如果您在安裝過程遇到問題,想要將驅動移除並重新安裝,可以參考一下指令。

            
                sudo apt remove --purge '^nvidia-.*'
                sudo apt remove --purge '^cuda-.*'
                sudo apt autoremove