這陣子因為工作關係,不定期的就安裝了一次 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 一種並行計算平台和應用程式程式設計介面 (API),主要利用 NVIDIA GPU 的運算能力,加速運算密集型工作,特別是科學計算、深度學習、機器學習和大規模數據處理等領域,簡單來說就是可以讓 GPU 跑更快。

CUDA 要安裝的版本必需與驅動搭配,您可以透過 nvidia-smi 指令看到驅動搭配的 CUDA 版本,以我的主機為例 CUDA 版本是 12.2。 接下來,請透過以下連結至官網找到您需要的 CUDA 資料,官網提供的安裝方法有 deb(local)、deb(network) 及 runfile(local),看個人習慣擇一挑選,我是選 deb(network)。 附帶一提,cuda 安裝源包含 GPU 驅動與 CUDA Toolkit,如果您直接安裝 CUDA 系統會連同對應的驅動一起安裝,由於上面我們已經安裝過驅動了,這邊我們只需要安裝 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) 是一個專為深度神經網路(DNN)設計的 GPU 加速程式庫,主要針對深度神經網路中的常見操作,如卷積、池化、激活函數等,提供高度優化的實現,以充分發揮 NVIDIA GPU 的計算能力。

cuDNN 安裝需要搭配 CUDA 版本,在下載之前您必須先註冊 NVIDIA 帳號,請先透過以下連結至官網找到您需要的 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 驅動安裝完成之後,常常無緣無故驅動失效,大概就是因為內核更新造成的。

            
                # 安裝 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
            
        

移除驅動

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

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