1. 程式人生 > >搭建linux下的深度學習開發環境

搭建linux下的深度學習開發環境

最近越來越感覺到在win下開發簡直渾身難受,各種lib需要逐個下載安裝不說,到現在乾脆在win下跑不起來了。無奈,只能打算轉戰linux平臺。在搭建環境過程中碰到了各種問題,因此把碰到的一些問題及其解決方法寫下來作為備忘。

1. ubuntu的安裝

由於之前ubuntu使用的比較多,所以這次也順理成章的選擇了ubuntu.
關於ubuntu的版本,注意一定要選擇新版本。目前(2016.8)的最新版本是ubuntu16.04. 我一開始圖方便,裝的是ubuntu12.04, 因為可以使用wubi無腦安裝。結果發現安裝是方便了,結果後來越來越麻煩,apt-get什麼都裝不了, apt-get update以後,想裝軟體要麼找不到裝不了,要麼依賴庫版本太低,總之是越來越麻煩。後來在把系統搞崩潰以後,終於下決心裝16.04

這裡使用easybcd來安裝ubuntu16.04,安裝指導
注意原文有一段是這樣的:

然後點選配置,將menu.lst檔案的內容替換成一下文字:
title Install Ubuntu
root (hd0,0)
kernel (hd0,0)/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04-desktop-amd64.iso locale=zh_CN.UTF-8
initrd (hd0,0)/initrd.lz
title reboot
reboot
title halt
halt
說明:hd0表示c盤所處的硬碟號,一般電腦只有一個,所以都是hd0;如果有多個硬碟,則根據情況改為hd0、hd1等。
hd0後面的數字表示C盤在硬碟中的分割槽順序,每個人的系統不大一樣,不知道的可以在磁碟管理裡面看一下,本人c盤是第三個分割槽,因此寫為(hd0,2
),如果是第一個,寫為(hd0,0)即可。

其實除了(hd0,0)要根據自己情況修改以外,下面這一行的iso地址和名稱也要根據自己的檔案進行修改,注意提前將iso檔案拷貝到C盤根目錄下。

kernel (hd0,0)/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04-desktop-amd64.iso locale=zh_CN.UTF-8

接下來就按照流程走。注意在分割槽過程中要設一個swap分割槽,類似於win下的虛擬記憶體。因為聽說如果不設定swap分割槽的話,有些程式會造成記憶體洩漏。所以我這裡就象徵性的設定了200M

此外還要把主要的分割槽格式設為ext4,用來掛載根目錄 / ,我這次是把一個80G的分割槽拿來用了。

2. apt-get相關

裝好系統以後,第一件事情自然是apt-get update了。原來我是用163源的,結果這次發現163的源有好多報錯,所以就改用官方伺服器了,發現速度也還可以,雖然確實比國內要慢一些,但是勝在省心。

另外,除了普通的apt-get install packname以外,apt-get還有許多很實用的功能,比如說apt-get upgrade,可以自動更新庫。如果在安裝中碰到有依賴庫沒有安裝,則執行 apt-get -f install 就會自動安裝所依賴的包了。之後再執行apt-get install pack 就可以順利安裝。此外,
apt autoremove 能夠自動清除沒有用的包,
apt-get remove pack 能夠手動解除安裝包
apt-get upgrade pack 手動更新指定包

3. 必要軟體安裝

工欲善其事必先利其器,一些必要的軟體也是非常有必要安裝的

3.1 tmux

tmux是一款終端中的分屏工具,很好用!

apt-get install tmux

tmux的使用方法見tmux快捷鍵

3.2 flash外掛

作為一臺電腦,免不了要看看視訊聽聽歌的。這時就需要flash外掛。我之前試過從adobe官網下載tar包,不過不管用。最後還是apt-get解決的。

apt-get install flashplugin-installer

Done

3.3 chrome

這個其實不是很強求,我因為在win下本身就是用的chrome,有很多書籤和外掛需要使用,所以需要安裝chrome. 總的來講,安裝chrome的流程還是比較簡單的,先從這裡下載對應的deb包,然後使用dpkg安裝。如果有提示缺少依賴包,就先執行下apt-get -f install 然後再用dpkg安裝一下即可

3.4 IDEA

IDEA是IntelliJ開發的IDE,可以編寫java,python等多種程式。我下載的是IDEA16 旗艦版,採用本地LicenseServer啟用。破解的具體教程參考這裡簡單的來說,就是

  1. 先下載好idea的tar包,解壓完以後先不要動
  2. 因為我是ubuntu64位,所以選擇linux amd64版本。但是注意,此時檔案是執行不了的,因為沒有執行的許可權,要先chmod u+x IntelliJIDEALicenseServer_linux_amd64 來賦予可執行許可權。接下來,在執行./ IntelliJIDEALicenseServer_linux_amd64 來執行server. 注意,這個伺服器佔用1017埠,而只有root才能使用1024以下的埠,所以要先獲得root許可權

3.5 flux

flux是一款護眼工具,能根據一天中的不同時間自動調節螢幕亮度。安裝這個有點麻煩,需要先匯入flux的ppa源

sudo add-apt-repository ppa:nathan-renniewaldock/flux
sudo apt-get update
sudo apt-get install fluxgui

4. python的安裝

4.1 安裝pip

既然是搭建深度學習環境,同時作為python玩家,python自然是少不得的。當然了,由於ubuntu在安裝的時候已經裝好了兩個版本的python,分別是2.7和3.5. 所以主要講相關庫的安裝。

首先是pip的安裝。注意pip是安裝python2.7的庫,而pip3才是安裝python3.5的庫。執行

apt-get install python3-pip

開始安裝pip3. 這裡我要再提一下,一定要用最新版本的ubuntu,我一開始就是在這一步死活裝不上,換成16.04以後一步成功。

4.2 安裝第三方庫

有了pip,就可以進行接下來相關庫的安裝了。我用到的主要有

  • numpy 矩陣運算
  • scipy 科學運算
  • pandas 科學計算
  • gensim 自然語言處理
  • jieba 分詞
  • networkx 網路分析庫
  • redis Redis資料庫的介面
  • pymongo MongoDB的介面
  • pymysql MySQL的介面
  • matplotlib 繪相簿
  • seaborn 繪相簿

以上這些庫使用

pip3 install packagename

即可進行安裝。注意,如果下不動,可以考慮使用豆瓣的源

pip3 install -i http://pypi.douban.com/simple/ packname

如果還是下不動,那可以考慮

apt-get install python3-packname

如果還是不行,那就只能考慮像windows下大部分情況一樣,跑到相關庫的官網或者第三方站點下載whl 檔案,然後

pip3 install packname.whl

如果下到的是原始碼,即解壓以後裡面有setup.py檔案,可以試試

python3 setup.py install

4.3 TensorFlow安裝

Tensorflow是Google開源的深度學習庫。嚴格來說,tensorflow屬於python的一個庫,但是由於安裝方式比較特殊以及太過重要,所以單獨講一下

首先進入tensorflow的官網,但是不知道什麼原因,tensorflow居然被GFW給牆了,我也是搞不懂。。所以,下載tensorflow需要先翻牆。

進入官網以後,選擇進行pip安裝然後按照流程來。我的系統是ubuntu16.04 64位,python版本是python3.5,因為版本太新所以暫時沒法用CUDA,所以選擇的是CPU-ONLY,所以綜合各項情況,選定的版本是這個

但是這裡有個問題,原來的pip安裝是直接從url下載的,也就是下載-安裝一起完成,而我這裡因為下載太慢,使用pip安裝時報錯timed out,所以我這裡稍作改動,先用瀏覽器下載whl,然後再用pip安裝,最後的效果是一樣的

最後來測試一下

$ python3
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>

說明已經安裝好了

5. linux 常用知識

5.1 一些常用linux指令

dpkg -i packname                # 安裝deb檔案
su username                     # 切換使用者
ln -s                           # 建立軟連結
xdg-open                        # 使用系統預設的應用開啟當前檔案
ls -l filename                  # 查詢link鏈
fdisk -l                        # 檢視磁碟資訊
ps -ef && ps -ef | grep pname   # 檢視各程序
netstat                         # 檢視端口占用
top                             # cpu使用率
iftop                           # 流量使用率
iotop                           # 磁碟讀寫情況
lsof                            # 顯示檔案使用情況,包括程序,埠
pwd                             # 當前檔案所在全路徑
chmod                           # 改變檔案許可權
chown                           # 改變檔案擁有者
whereis                         # 查詢檔案
trickle                         # 限制程式流量
ssh                 
sshfs

5.2 常用檔案所在位置

/etc/apt/source.list            # 軟體源位置
/etc/apt/source.list.d/*        # 由第三方新增PPA源引入的軟體源位置
/etc/apparmor.d/*               # apparmor引數設定

/etc/mysql/mysql.conf.d/mysqld.conf # mysql的引數設定

5.3 一些帖子

6. Docker 安裝

docker是一個新的虛擬化工具,具體的就不詳述了。總的來講,安裝流程官網都有的,照著官網流程來就行。因為我的系統是ubuntu16.04 ,所以是按照這個來的。 不過為了便於檢視,這邊記錄簡化版的流程。

$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates 
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D`   # 增加GPG key

開啟/etc/apt/sources.list.d/docker.list, 往其中寫入deb https://apt.dockerproject.org/repo ubuntu-xenial main 增加docker的apt源

$ sudo apt-get update
$ sudo apt-get purge lxc-docker  # 去掉之前的repo
$ apt-cache policy docker-engine # 確認apt能夠獲得對應的庫
# 下面這條命令可以讓我們使用aufs storage driver
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual 

$ sudo apt-get install docker-engine       # 正式安裝
$ sudo service docker start                # 啟動docker
$ sudo docker run hello-world          # 確認docker正常安裝

# 至此docker已經安裝完畢,接下來是一些相關的配置
$ sudo groupadd docker                 # 增加docker使用者組
$ sudo usermod -aG docker $USER        # 將你常用賬號加到docker組裡,這樣不用root就能執行docker了
# 登出,再登入
$ docker run hello-world               # 測試是否需要root許可權

注意上面那行$ sudo docker run hello-world那裡,可能會報錯,因為國內網路你懂得,有時候會提示下載失敗,timeout之類的。此時docker已經安裝完成需要下載images。在docker hub上有很多images可以選擇,我選了個最簡單的ubuntu

$ docker pull ubuntu  # 從docker hub下載ubuntu的images
$ docker images            

此時就能夠看到下載好的ubuntu。因為docker使用了aufs,所以相關的images非常小,只有120M左右。
這裡寫圖片描述

$ docker run ubuntu echo "23333"
>>>23333            # 說明可以通過docker來使用下載好的ubuntu了

輸入

$docker run -t -i ubuntu

可以進入虛擬機器的shell中

7 Hadoop和Spark的安裝

7.1 Hadoop安裝

關於hadoop的安裝步驟,可以參見我之前的文章linux下命令列安裝hadoop2.7.2過程。下面主要講講spark的安裝過程。spark與hadoop一樣,解壓以後再配置一下就能用了。

7.2 Scala安裝

因為spark是用scala寫的,雖然提供了python,java等介面,但是還是要安裝scala才能使用。
1.從scala官網下載下載地址
2.解壓scala,放入安裝位置。我是安裝在/usr/lib/scala中的

tar -zxvf scala-2.11.8.tgz  # 解壓
mv scala-2.11.8 /usr/lib/scala # 將解壓後的資料夾移入/usr/lib/scala

3.將SCALA_HOME加入環境變數。開啟/etc/profile,往最後寫入

export SCALA_HOME=/usr/lib/scala
export PATH=.:$SCALA_HOME/bin:$PATH

儲存退出,在shell中執行source /etc/profile
4.最後測試一下是否安裝成功

scala -version
=>Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFL

7.3 Spark安裝

1.從spark官網下載spark,根據你的hadoop版本來。我選了prebuild for hadoop2.7 and later.
2.下載完以後解壓,移到你想要安裝的地方。我放在/home/hamaster/spark

tar -zxvf spark-2.0.1-bin-hadoop2.7.tgz
mv spark-2.0.1-bin-hadoop2.7 /home/hamaster/spark

4.將SPARK_HOME加入環境變數。跟之前一樣,開啟/etc/profile,寫入

export SCALA_HOME=/home/hamaster/spark
export PATH=.:$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH

儲存退出,shell中執行source /etc/profile
5.修改spark的配置檔案。

cd $SPARK_HOME/conf
cp spark-env.sh.template  spark-env.sh
cp slaves.template slaves

6.開啟spark-env.sh,往末尾寫入

############ my own spark conf ############
### the location of the dependencies
#export JAVA_HOME=/usr/lib/jvm/java-8-oracle 
export HADOOP_HOME=$HADOOP_INSTALL
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

### the basic conf info of spark
#export SCALA_HOME=/usr/lib/scala
#export SPARK_HOME=$HOME/spark
export SPARK_MASTER_IP=127.0.0.1
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8099

### the detail conf info of spark
export SPARK_WORKER_CORES=1  #每個Worker使用的CPU核數
export SPARK_WORKER_INSTANCES=1 #每個Slave中啟動幾個Worker例項
export SPARK_WORKER_MEMORY=10G #每個Worker使用多大的記憶體
export SPARK_WORKER_WEBUI_PORT=8081 #Worker的WebUI埠號
export SPARK_EXECUTOR_CORES=1 #每個Executor使用使用的核數
export SPARK_EXECUTOR_MEMORY=1G #每個Executor使用的記憶體

7.測試spark是否安裝成功

cd /home/hamaster/hadoop/sbin
./start-dfs.sh
cd /home/hamaster/spark/sbin
./start-master.sh
./start-slaves.sh
jps

8. 安裝cuda和cudnn