1. 程式人生 > >[問題彙總]ubuntu16.04+cuda8.0+cudnn+opencv3.2+caffe+tensorflow+SS搭建

[問題彙總]ubuntu16.04+cuda8.0+cudnn+opencv3.2+caffe+tensorflow+SS搭建

未完待續。。。

ubuntu16.04安裝:

採用映象解壓U盤安裝,在官網下載映象包後解壓拷貝至U盤中,在電腦BIOS設定U盤啟動

顯示卡驅動

NVIDIA MX150驅動安裝(以小米筆記本為例)
安裝完ubuntu kylin16.04後,開機發熱嚴重,風扇狂轉。應該是顯示卡驅動的問題,通過輸入以下程式碼檢視最合適的驅動

sudo ubuntu-drivers devices  

如圖:
這裡寫圖片描述
顯示卡驅動版本應該選擇nvidia-384
下面有三種方法:

  • 方法一

NVIDIA驅動下載官網下載對應的run檔案
首先解除安裝系統中的nvidia驅動:

sudo
apt-get purge nvidia*

由於系統自帶的開源驅動與nvidia不相容,要遮蔽掉nouveau
新建blacklist-nouveau.conf檔案,輸入命令:

sudo gedit /etc/modprobe.d/blacklist-nouveau.conf

往檔案中寫入:

blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off

再更新一下

sudo update-initramfs -u

儲存並退出。這一步是為了禁掉Ubuntu自帶開源驅動nouveau。之後sudo reboot

重啟系統。在終端執行命令:

lsmod | grep nouveau

如果沒有feedback則已經禁用了nouveau。
下面我們找到驅動的存放目錄,開啟終端,為檔案新增可執行許可權:

sudo chmod a+x NVIDIA-Linux-x86_64-384.69.run

用這種方法安裝有一個弊端,就是不能在GUI中執行.run檔案。
首先輸入:

sudo /etc/init.d/lightdm stop

按下ctrl+alt+F1進入tty1,按下ctrl+alt+F7回到桌面
然後

sudo ./NVIDIA-Linux-x86_64-384.69.run --
no-opengl-files sudo /etc/init.d/lightdm start

一定不要裝opengl。
ok後重啟電腦
輸入nvidia-smi檢視安裝是否完成
(我用該方法時遇到一個問題,驅動貌似是裝了,但是開啟nvidia-settings後沒有選擇驅動的地方,也不能檢視當前驅動的狀態,經過多次解除安裝sudo apt-get purge nvidia*重灌也無濟於事。。。)
於是換到了方法2

  • 方法二
    使用ppa安裝(此處感謝Linux公社的教程
    解除安裝之前的驅動,和法一一樣
    1:sudo add-apt-repository ppa:mamarley/nvidia
    2:輸入你的root密碼
    3:sudo apt-get update
    4:sudo apt-get install nvidia-版本號 nvidia-prime
    5:等待安裝完成,重啟之後,你的電腦應該就是在用nvidIa顯示卡驅動了,可以使用這個進行顯示卡切換,切換之後必須登出登陸一次才行。

用這個方法時我也遇到了問題,就是下載卡在24%不動了,後來連結手機熱點才完成下載安裝,總體來說,這個方法最好用。
輸入nvidia-smi驗證驅動安裝
這裡寫圖片描述

顯示卡快速切換
開啟終端,輸入以下命令:

sudo add-apt-repository ppa:nilarimogard/webupd8 #新增PPA更新源
sudo apt-get update #重新整理更新源列表
sudo apt-get install prime-indicator #安裝雙顯示卡切換指示器

cuda8.0

  • 1.安裝

這裡寫圖片描述

sudo sh cuda_*****.run 

執行後會有一系列的Y/n選擇,其中選擇顯示卡驅動的一項一定選n。其他的隨意,一般預設即可。
ubuntu的gcc編譯器是5.4.0,然而cuda8.0不支援5.0以上的編譯器,因此需要降級,把編譯器版本降到4.9:

在terminal中執行:

sudo apt-get install gcc-4.9 gcc-5 g++-4.9 g++-5  
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20  
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10  
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20  
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 10  
sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30  
sudo update-alternatives --set cc /usr/bin/gcc  
sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30  
sudo update-alternatives --set c++ /usr/bin/g++ 

配置cuda8.0之後主要加上的一個環境變數宣告

gedit ~/.bashrc  

在檔案~/.bashrc之後加上:

export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}  
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}  

然後設定環境變數和動態連結庫,在命令列輸入

sudo gedit /etc/profile  

在開啟的檔案裡面加上(注意等號兩邊不能有空格)

export PATH=/usr/local/cuda/bin:$PATH  

儲存之後,建立連結檔案
sudo gedit /etc/ld.so.conf.d/cuda.conf
在開啟的檔案中新增如下語句:
/usr/local/cuda/lib64
儲存退出執行命令列:
sudo ldconfig

  • 2.測試
    測試cuda的Samples
    命令列輸入(注意cuda-8.0是要相對應自己的cuda版本)
cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery  
sudo make  
sudo ./deviceQuery 

返回GPU資訊:表示配置成功
這裡寫圖片描述

cudnn

cd進入cudnn7.0解壓之後的include目錄,在命令列進行如下操作:

sudo cp cudnn.h /usr/local/cuda/include/ #複製標頭檔案  

再cd進入lib64目錄下的動態檔案進行復制和連結:(7.0.1為對應版本具體可修改)


    sudo cp lib* /usr/local/cuda/lib64/ #複製動態連結庫  
    cd /usr/local/cuda/lib64/  
    sudo rm -rf libcudnn.so libcudnn.so.7 #刪除原有動態檔案  
    sudo ln -s libcudnn.so.7.0.1 libcudnn.so.7 #生成軟銜接  
    sudo ln -s libcudnn.so.7 libcudnn.so #生成軟連結  

Opencv3.2.0

linux下檢視opencv版本
pkg-config --modversion opencv

在github上下載程式碼並將其解壓到你要安裝的位置,(下載的位置還是在home/ubuntu、Downloads資料夾下)

首先安裝Ubuntu系統需要的依賴項,雖然我也不知道有些依賴項是幹啥的,但是隻管裝就行,也不會佔據很多空間的。

sudo apt-get install --assume-yes libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip  

然後安裝opencv需要的一些依賴項,一些檔案編碼解碼之類的東東。

sudo apt-get install build-essential cmake git  
sudo apt-get install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev libtbb-dev qtbase5-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip  

在終端中cd到OpenCV資料夾下(解壓的那個資料夾),然後
mkdir build #新建一個build資料夾,編譯的工程都在這個資料夾裡

cd build/  
  • 問題

cmake opencv 時遇到nvcc warning : The ‘compute_20’, ‘sm_20’, and ‘sm_21’ ……

解決辦法如下:

sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_ARCH_BIN="5.0" ..

CUDA_ARCH_BIN代表你當前顯示卡的計算能力。具體能力值可在nvidia官網下載cuda的地方查閱。新增CUDA計算能力值後即可正常編譯通過。

cmake成功後,會出現如下結果,提示配置和生成成功:

– Configuring done

– Generating done

– Build files have been written to: /home/ise/software/opencv-3.2.0/build

使用checkinstall:

使用checkinstall的目的是為了更好的管理我安裝的opencv,因為opencv的安裝很麻煩,解除安裝更麻煩,其安裝的時候修改了一大堆的檔案,當我想使用別的版本的opencv時,將當前版本的opencv解除安裝就是一件頭疼的事情,因此需要使用checkinstall來管理我的安裝。執行了checkinstall後,會在build檔案下生成一個以backup開頭的.tgz的備份檔案和一個以build開頭的.deb安裝檔案,當你想解除安裝當前的opencv時,直接執行dpkg -r build即可。

在install時,執行下面程式碼後出現錯誤

    sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'  
    sudo ldconfig  

在sudo ldconfig時遇到:/sbin/ldconfig.real: /usr/local/cuda/lib64/libcudnn.so.6 不是符號連線

解決辦法:

建立硬連結

首先找到usr/local/cuda-8.0/lib64/目錄,搜尋 libcudnn 然後發現

兩個檔案

libcudnn.so.6 和libcudnn.so.6.0.21

理論上只有一個libcudnn.so.6.0.21

sudo ln -sf /usr/local/cuda/lib64/libcudnn.so.6.0.21 /usr/local/cuda/lib64/libcudnn.so.6
  • 完成
    這裡寫圖片描述

caffe

  • 在make py的時候,遇到了這個錯誤:
/usr/bin/ld: cannot find -lhdf5_hl
/usr/bin/ld: cannot find -lhdf5
collect2: error: ld returned 1 exit status

這說明聯結器找不到 hdf5_hl和hdf5這兩個庫,沒法進行連結。
我的解決方案是更改makefile:在makefile中作如下更改:

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

把第一行註釋,然後改成第二行的內容就可以了。

  • 問題2
    /usr/bin/ld:/usr/local/cuda/lib64/libcudnn.so: file format not recognized; treating as linker script
    /usr/bin/ld:/usr/local/cuda/lib64/libcudnn.so:1: syntax error
    collect2: error: ld returned 1 exit status
    Makefile:573: recipe for target ‘.build_release/lib/libcaffe.so.1.0.0’ failed
    make: * [.build_release/lib/libcaffe.so.1.0.0] Error 1
    這裡寫圖片描述
    解決方法:
    移除除libcudnn.so.7.0.1以外的libcudnn.so檔案
    /usr/local/cuda/lib64$ sudo rm -rf libcudnn.so libcudnn.so.7
    重新生成
    sudo ln -s libcudnn.so.7.0.1 libcudnn.so.7
    sudo ln -s libcudnn.so.7 libcudnn.so
    這裡寫圖片描述
    然後
    make clean
    make all -j10

之後執行sudo make runtest測試是否裝好
如果出現錯誤:
error while loading shared libraries: ×××.so.3.2: cannot open shared object file: No such file or directory
這裡寫圖片描述
參考:
http://blog.chinaunix.net/uid-26212859-id-3256667.html
在root模式下(×××#)表示root模式,按ctrl+D切換出root使用者
sudo su
×××# cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

×××# echo "/usr/local/lib" >> /etc/ld.so.conf
×××# ldconfig

tensorflow

theano

fanQ篇

設定終端的全域性代理:
安裝polipo軟體

sudo apt-get install polipo

修改配置檔案

config檔案是隻讀的,要想修改裡面的資料,需要獲得最高許可權。

cd /etc/polipo/
sudo chmod 777 config # 為config檔案申請最高許可權
vi /etc/polipo/config # 開啟進行編輯
原檔案中已經有了兩句話,那麼需要新加入3句話:

socksParentProxy = "localhost:1080"
socksProxyType = socks5
logLevel=4

ps:這裡建議修改檔案後恢復其本來的許可權,這算是個好習慣。

關閉和啟動polipo
關閉軟體,讓配置生效,然後重啟。
sudo service polipo stop
sudo service polipo start

驗證和使用
$ http_proxy=http://localhost:8123 curl ip.gs
Current IP / 當前 IP: 160.16..
ISP / 運營商: sakura.a***
City / 城市: Tokyo Tokyo
Country / 國家: Japan
IP.GS is now IP.SB, please visit https://ip.sb/ for more IP information, ip.gs will only use for curl purpose. / IP.GS 已更新至 IP.SB 請訪問 https://ip.sb/ 獲取更多資訊, ip.gs 域名僅作 curl 使用
如有問題,請加入 Telegram 群 https:// t me sbfans

設定別名

每一次都輸入這麼一串命令實在太不人性化,解決方法就是給這個命令一個縮寫的別名,比如“hp”。

vi .bashrc

開啟配置檔案,在最後面加上一句:

alias hp="http_proxy=http://localhost:8123"
關閉檔案,執行下面程式碼:

source ~/.bashrc

這樣,hp就可以代表之前很長的命令,試驗一下:

hp curl ip.gs

為當前會話設定全域性代理

難道要在每條聯網命令前面都加上“hp”?當然不會,以下操作可以讓當前終端視窗的所有聯網命令都經過代理,一條命令,接管所有:

$export http_proxy=http://localhost:8123 # 當前終端使用代理
$ unset http_proxy # 當前終端取消代理

更為長久的代理設定

如果我想Ubuntu終端一直處於代理狀態,能不能做到呢?這也是可以的,以下設定可以讓本機的終端一直擁有代理能力,設定好後就完全不用操心了,類似於寫入環境變數的操作。

方法很簡單,將以下語句:

export http_proxy=http://localhost:8123
加入.bashrc檔案末尾,再執行source ~/.bashrc即可。

軟體源問題

sudo apt-get update