在ThinkPad系列膝上型電腦中使用過Ubuntu 16.04系統的同學都知道,NVIDIA顯示卡驅動程式特別難安裝。以我使用的ThinkPad P50s為例,顯示卡型號為:GM108GLM [Quadro K620M](可以在命令終端中使用lspci | grep NVIDIA查詢),按照網上大多數安裝教程所示的下載.run程式安裝的方法進行過N次(N>10)失敗的嘗試,最後幾乎達到懷疑人生的地步了,其中的苦楚恐怕只有自己心裡清楚。功夫不負有心人,我終於找到一種利用CUDA安裝包來安裝驅動的方法,操作比較簡便,並且效果不錯,現將操作過程記錄下來,給有需要的同學參考借鑑。
雖然本文僅針對ThinkPad P50s型膝上型電腦進行介紹,但本文方法適用於所有機型,作者已在另外的桌上型電腦上進行過成功安裝。

一、下載CUDA安裝包

CUDA官網下載最新的CUDA安裝包,具體如下圖所示:
3

二、禁用第三方NVIDIA顯示卡驅動程式nouveau

Ubuntu 16.04系統使用第三方驅動程式nouveau支援NVIDIA顯示卡,為了安裝NVIDIA公司的原版驅動程式,需要將其禁用,具體方法為:使用快捷鍵Ctrl+Alt+T開啟一個終端,使用vi編輯器在/etc/modprobe.d目錄中建立檔案:blacklist-nvidia.conf(檔名隨便起,只要字尾為.conf並且自己覺得有意義就行):

sudo vi /etc/modprobe.d/blacklist-nvidia.conf

檔案內容如下:

blacklist nouveau
options nouveau modeset=0

然後使用如下命令更新核心資訊:

sudo update-initramfs -u

注意:更改資訊後一定要記得重啟電腦!
整個操作如下圖所示:
1
重啟電腦後,可能無法進入圖形化登入介面,症狀類似如下介面,甚至可能完全黑屏:
11
解決方法:按快捷鍵Ctrl+Alt+F1Ctrl+Alt+F6選擇六個文字終端之間的任意一個,登入文字介面,然後執行第三步。

三、安裝CUDA程式

在命令終端中進入步驟一下載CUDA安裝包的目錄,使用如下命令安裝CUDA程式。因為CUDA安裝包會檢測更新NVIDIA顯示卡驅動程式,於是我們可以利用這個特性來安裝顯示卡驅動。

sudo dpkg -i cuda-repo-ubuntu1604-9-2-local_9.2.148-1_amd64.deb
sudo apt-key add /var/cuda-repo-9-2-local/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda 

四、重啟電腦禁用安全啟動

為了順利應用新安裝的NVIDIA顯示卡驅動,需要重啟電腦並禁用安全啟動(其實也可以不禁用安全啟動,只不過簽名比較麻煩,我也懶得費神去弄,如果不怕麻煩,可以參考該網頁進行簽名)。
禁用方法如下圖所示,開機後按Enter再按F1鍵進入BIOS設定,將Secure Boot禁用:
4
5
6
7

五、驗證驅動是否安裝成功

執行完步驟四,重新進入Ubuntu系統後,在命令終端中使用如下方法驗證驅動已安裝成功:

# 方法1
nvidia-smi
# 方法2
nvidia-settings

如下圖所示:
8
9
10

六、可能存在的問題

6.1 安裝顯示卡驅動程式後無法進入圖形化介面

顯示卡驅動程式安裝完畢重啟電腦後,可能無法進入圖形化登入介面,症狀類似如下介面,甚至可能完全黑屏:
11
解決方法:按快捷鍵Ctrl+Alt+F1Ctrl+Alt+F6選擇六個文字終端之間的任意一個,登入文字介面,然後使用命令:

sudo nvidia-xconfig

重新生成NVIDIA顯示卡的配置檔案資訊,配置檔案路徑為:/etc/X11/xorg.conf,檔案內容如下,注意:這個預設生成的檔案內容是錯誤的,如果直接使用,一定不能正常載入NVIDIA顯示卡驅動程式!

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 396.37  ([email protected])  Tue Jun 12 14:50:28 PDT 2018

Section "ServerLayout"
    Identifier     "layout"
    Screen      0  "nvidia" 0 0
    Inactive       "intel"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "keyboard"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    HorizSync       28.0 - 33.0
    VertRefresh     43.0 - 72.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "intel"
    Driver         "modesetting"
    Option         "AccelMethod" "None"
    BusID          "PCI:[email protected]:2:0"
EndSection

Section "Device"
    Identifier     "nvidia"
    Driver         "nvidia"
    BusID          "PCI:[email protected]:0:0"
EndSection

Section "Screen"
    Identifier     "intel"
    Device         "intel"
    Monitor        "Monitor0"
EndSection

Section "Screen"
    Identifier     "nvidia"
    Device         "nvidia"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "AllowEmptyInitialConfiguration" "on"
    Option         "IgnoreDisplayDevices" "CRT"
    Option         "ConstrainCursor" "off"
    SubSection     "Display"
        Depth       24
        Modes      "nvidia-auto-select"
    EndSubSection
EndSection

正確的配置檔案內容如下所示。大家一定要在預設檔案的基礎上,將原檔案內容修改為如下正確內容:

Section "ServerLayout"
    Identifier "layout"
    Screen 0 "nvidia"
    Inactive "intel"
EndSection

Section "Device"
    Identifier "intel"
    Driver "modesetting"
    BusID "PCI:[email protected]:2:0"
    Option "AccelMethod" "None"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "PCI:[email protected]:0:0"
    Option "ConstrainCursor" "off"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    Option "AllowEmptyInitialConfiguration" "on"
    Option "IgnoreDisplayDevices" "CRT"
EndSection

如果重啟電腦後還是無法進入圖形化登入介面,則進入文字終端後使用如下命令

sudo rm /etc/X11/xorg.conf
sudo touch /etc/X11/xorg.conf

重新生成一個空白的X11顯示配置檔案,之後再重啟電腦,這樣就可以順利使用系統自帶的整合顯示卡驅動進行顯示。接下來,自然就是重新安裝CUDA,以便正確安裝NVIDIA顯示卡驅動程式了。

6.2 突然斷電重啟電腦後NVIDIA顯示卡驅動程式損壞

有一次突然斷電,重啟電腦後,執行一個tensorflow-gpu程式時,居然報錯說不是NVIDIA顯示卡驅動,一查居然是NVIDIA顯示卡驅動程式損壞,作業系統重新啟用整合顯示卡驅動nouveau,甚至還把步驟二中建立的黑名單檔案/etc/modprobe.d/blacklist-nvidia.conf都給刪除了,真是讓人憤怒。
解決辦法:重新執行步驟二至步驟五,再次安裝NVIDIA顯示卡驅動。

七、其他安裝方法

最近在網上還看到一種通過新增ppa源的安裝方法,也很簡單,我在Dell桌上型電腦上已順利安裝成功,但沒有在筆記本上測試過,感興趣的同學可以嘗試一下。具體操作方法如下:

7.1 查詢本機顯示卡所需的驅動版本號

NVIDIA驅動下載官網上,搜尋你機器上NVIDIA顯示卡所需的驅動版本號,如下圖所示:
12

7.2 通過新增ppa源的方法安裝驅動

開啟一個命令終端,使用如下命令安裝驅動,安裝完畢後,重啟電腦即可。

sudo add-apt-repository ppa:graphics-drivers/ppa  
sudo apt-get update  
sudo apt-get install nvidia-390 # 此處的390要根據上面查詢到的版本號適當更改
.