雙顯示卡(Intel Nvidia)筆記本配置cuda開發環境

為了用GPU加速TENSORFLOW,筆者折騰了兩天,終於給我的雙顯示卡筆記本安裝上了CUDA,期間電腦幾次進不了桌面,說實話,我的內心是崩潰的。
嘗試了.run檔案和直接apt-get安裝,最後使用的方法是apt。在此將過程寫下來,免得小白入坑。

筆者的環境:

作業系統:
Ubuntu 16.04 LTS desktop amd64
顯示卡和CPU:
Intel i7-7500 Nvidia-Geforce-940MX

安裝過程:

一:檢查你的顯示卡是否支援CUDA,參考網址
http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#verify-you-have-cuda-enabled-system

二:這個教程採用apt網路安裝方式

  • 升級系統
apt-get update && apt-get upgrade 
dpkg -i virtualgl*.deb
apt-get install linux-headers-$(uname -r)
apt-get install freeglut3-dev libxmu-dev libpcap-dev
  • 編輯 .bashrc 加入PATH。下面變數的設定可能要根據你的環境而定
export PATH=$PATH:/opt/VirtualGL/bin
export PATH=$PATH:/usr/local/cuda/bin
  • 安裝bumblebee-nvidia 和 primus.它支援在Intel和Nvidia顯示卡間自動分配功率
apt-get install bumblebee-nvidia primus
  • 修改bumblebee config檔案。 讓bumblebee我們使用了 NVIDIA 驅動. 下面變數的設定可能要根據你的系統做修改.
    sudo nano 22 /etc/bumblebee/bumblebee.conf
    新增:
[bumblebeed]
ServerGroup=bumblebee
TurnCardOffAtExit=false
NoEcoModeOverride=false
Driver=nvidia
XorgConfDir=/etc/bumblebee/xorg.conf.d
Bridge=auto
PrimusLibraryPath=/usr/lib/x86_64-linux-gnu/primus:/usr/lib/i386-linux-gnu/primus
AllowFallbackToIGC=false
Driver=nvidia
[driver-nvidia]
KernelDriver=nvidia
PMMethod=auto
LibraryPath=/usr/lib/nvidia-367:/usr/lib32/nvidia-367
XorgModulePath=/usr/lib/xorg,/usr/lib/xorg/modules
XorgConfFile=/etc/bumblebee/xorg.conf.nvidia
Driver=nouveau
[driver-nouveau]
KernelDriver=nouveau
PMMethod=auto
XorgConfFile=/etc/bumblebee/xorg.conf.nouveau
  • 執行下面的命令並記錄你的顯示卡的 PCI 地址.
$ lspci | egrep 'VGA|3D'
00:02.0 VGA compatible controller: Intel Corporation Device 5916 (rev 02)
01:00.0 3D controller: NVIDIA Corporation Device 179c (rev a2)
  • 編輯xorg.conf.nvidia 檔案,加入你的顯示卡的 PCI 地址(我的是01:00.0) . 在 “ServerLayout”部分下更新顯示卡PCI資訊
sudo nano /etc/bumblebee/xorg.conf.nvidia

加入:

Section "ServerLayout"
Identifier  "Layout0"
Option      "AutoAddDevices" "false"
Option      "AutoAddGPU" "false"
BusID "PCI:01:00.0"
  • 重啟系統.
sudo shutdown -r now

三:後期工作

設定環境變數
編輯bashrc加入

#set cuda environment
export PATH=$PATH:/opt/VirtualGL/bin
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64\
${LD_LIBRARY_PATH: :${LD_LIBRARY_PATH}}

驗證CUDA的安裝

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61
$ nvidia-smi
Tue Apr  4 21:26:01 2017       
----------------------------------------------------------------------------- 
| NVIDIA-SMI 375.39                 Driver Version: 375.39                    |
|------------------------------- ---------------------- ---------------------- 
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|=============================== ====================== ======================|
|   0  GeForce 940MX       Off  | 0000:01:00.0     Off |                  N/A |
| N/A   41C    P0    N/A /  N/A |    325MiB /  2002MiB |     24%      Default |
------------------------------- ---------------------- ---------------------- 
----------------------------------------------------------------------------- 
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0      1258    G   /usr/lib/xorg/Xorg                             191MiB |
|    0      1977    G   compiz                                         125MiB |
|    0      2295    G   fcitx-qimpanel                                   8MiB |
----------------------------------------------------------------------------- 

編譯範例程式碼:
參考官網:
http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions

$ cuda-install-samples-8.0.61.sh   <你要將範例程式碼放置的資料夾>

進入程式碼目錄後執行make,編譯完成後
之後在bin目錄下執行deviceQuery 和 bandwidthTest。結果為Pass則OK。

四: 問題解決方案

  • 編譯報錯找不到-lnvcuvid解決辦法:
    檢視你的驅動版本號:
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  375.39  Tue Jan 31 20:47:00 PST 2017
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 

進入報錯的那個目錄,找findglib.mk這個檔案。
開啟它可以發現有一項

UBUNTU_PKG_NAME = "nvidia-367"

它將庫目錄硬編碼了。將其改成安裝的nvidia驅動對應版本號即可,這裡是375。

  • 因驅動問題進不了桌面解決辦法:
    按ctrl alt F1,在文字介面登入後,解除安裝nvidia驅動
sudo apt-get remove --purge nvidia-*

參考網址:

http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#environment-setup

http://askubuntu.com/questions/799184/how-can-i-install-cuda-on-ubuntu-16-04

https://devtalk.nvidia.com/default/topic/769578/cuda-6-5-cannot-find-lnvcuvid/