我在 TCL 的實習即將結束。在回校參加畢業典禮之前,我決定搭建自己的個人深度學習平臺。我想我不能真的依賴於公司或實驗室的機器,畢竟那工作站不是我的,而且開發環境可能是一團糟(它已經發生過一次)。有了個人平臺,我可以方便地通過 teamViewer 隨時登入我的深度學習工作站。我有機會從頭開始搭建平臺。
在本文中,我將介紹 PC 平臺搭建深度學習的整個過程,包括硬體和軟體。在此,我分享給大家,希望對具有相同需求的研究人員和工程師有所幫助。由於我使用 GTX 1080、Ubuntu 16.04、CUDA 8.0RC、CuDNN 7 搭建平臺,這些都是最新版本。以下是這篇文章的概述:
硬體
配件選擇
搭建工作站
軟體
作業系統安裝
準備可引導安裝的 USB 驅動器
安裝系統
深度學習環境安裝
遠端控制:teamViewer
開發包管理:Anaconda
開發環境:python IDE
GPU 優化環境:CUDA 和 CuDNN
深度學習框架:Tensorflow & Mxnet & Caffe & Darknet
開箱即用的深度學習環境:Docker
安裝 Docker
安裝 NVIDIA-Docker
下載深度學習 Docker 映象
主機和容器之間共享資料
瞭解簡單的 Docker 命令
硬體:
配件選擇
我推薦使用 PcPartPicker 來挑選配件。它可以幫助你以最低價購買到配件,併為你檢查所選配件的相容性。他們還上線了一個 youtube 頻道,在這個頻道里他們提供了用於展示構建過程的視訊。
在我的搭建案例中,我使用他們的搭建文章作為參考,並建立了一個搭建清單,可以在 這裡 找到。以下是我搭建工作站使用的配件。
由於我們正在進行深度學習研究,一個好的 GPU 是非常有必要的。因此,我選擇了新近釋出的 GTX 1080。它雖然很難買到,但如果你注意到 newegg (新蛋網,美國新蛋網是電子數碼產品銷售網站) 上的捆綁銷售,一些人已經囤到貨並組合 [GPU + 主機板] 或 [GPU + 電源] 進行捆綁銷售。你懂得,這就是市場。購買捆綁產品會比買一個價格高的要好。不管怎樣,一個好的 GPU 將加快訓練或者後期調參過程。以下是一些 GTX 1080 同其他品牌 GPU 的優勢,在效能,價格和耗電量(節約日常用電量和用於購買合適 PC 電源的開支)。
注意:相比於 12GB 記憶體的 TITAN X,GTX 1080 僅有 8GB,你可能手頭寬裕或更慷慨,因此會選擇使用堆疊式 GPU。然後記得選擇一個帶有更多 PCI 的主機板。
配件組裝
平臺搭建從配件組裝開始,我參考了 這段視訊(youtube 網站,需要翻牆) 教程。雖然各個部分略有不同,但搭建過程非常相似。我沒有一點組裝經驗,但是有了這個教程,我就能在 3 小時內完成組裝。(你可能花費更少的時間,但你知道,我非常謹慎)
軟體:
作業系統安裝
通常採用 Ubuntu 進行深度學習研究。但是有時你需要使用另一作業系統協同工作。例如,如果你使用 GTX 1080,同時又是一位 VR 開發者,你可能需要使用 Win10 進行基於 Unity 或其他框架的 VR 開發。以下我將介紹 Win10 和 Ubuntu 的安裝。如果你僅對 Ubuntu 的安裝感興趣,你可以跳過 windows 安裝。
準備可引導安裝的 USB 驅動器
使用 USB 盤安裝作業系統非常方便,因為我們少不了它。由於 USB 盤將被格式化,所以您不希望在行動硬碟上發生這種情況。或者如果你有可寫的 DVD,你可以用它們來安裝作業系統,並儲存它們以備將來使用,如果你能在那時再找到它們的話。
由於在官方網站上已經很好的說明了,你可以訪問 Windows 10 頁面 學習如何製作 USB 驅動。對於 Ubuntu,你可以同樣下載 ISO 並構建 USB 安裝媒體或者燒錄到 DVD 上。如果你正在使用 Ubuntu 系統,參考 Ubuntu 官方網站的 教程。 如果你在使用 Windows,參考 本教程。
系統安裝
強烈建議安裝 Windows 為主系統的雙系統。我將會跳過 Win10 的安裝,因為詳細的安裝指南可以從 Windows 10 主頁 找到。需要注意的一點是,你需要使用啟用碼。如果在你的膝上型電腦上安裝了 Windows 7 或 我 Windows 10,你可以在你的膝上型電腦底部找到啟用碼的標籤。
安裝 Ubuntu16.04 時遇到點小麻煩,這有些出乎意料。這主要是因為一開始我就沒有安裝 GTX 1080 驅動。我將把這些分享給大家,以防你遇到同樣的問題。
安裝 Ubuntu:
首先,插入用於安裝系統的引導 USB。在我的 LG 螢幕上並沒有出現任何東西,除了顯示頻率太高。但是螢幕是正常的,因為在另一臺筆記本上測試過了。我試著將 PC 連線到 電視上,可以在電視上正常顯示,但僅有桌面沒有工具皮膚。我發現這是 NVIDIA 驅動的問題。因此我開啟 BIOS,並設定整合顯示卡作為預設顯示卡並重啟。記得要把 HDMI 從 GTX1080 埠上的介面切換到主機板上。現在這個顯示器工作得很好。我按照提示指南成功地安裝了 Ubuntu。
為了使用 GTX1080,請訪問 本頁面 獲取 基於 Ubuntu 的 NVIDIA 顯示卡驅動。安裝好驅動後,確保 GTX1080 在主機板上。 現在螢幕上顯示 “You appear to be running an X server..”。 我參考了 本連結 來解決這個問題並安裝驅動。我在這裡引用下:
確保登出系統。
同時按住 CTRL+ALT+F1 並用你的授權進行登入。
通過執行 sudo service lightdm stop 或 sudo stop lightdm 殺死當前的 X 服務會話。
通過執行 sudo init 3 進入到第三等級 並安裝 *.run 檔案。
當安裝結束,你需要重啟系統。如果沒有重啟,執行 sudo service lightdm start 或 sudo start lightdm 重新啟動 X 服務。
驅動器安裝完後,我們需要重啟並在 BIOS 中 將 GTX1080 設定為預設。此時,我們已經準備好了。
我遇到的其他一些小問題,以備將來使用:
問題: 當我重啟時,我不能找到選項來選擇 windows。
解決方案: 在 ubuntu 下,sudo gedit /boot/grub/grub.cfg, 增加如下行:
menuentry ‘Windows 10′{
set root=’hd0,msdos1′
chainloader +1
}
複製程式碼
問題: Ubuntu 不支援 百思買經常出售的這款 Belkin N300 無線介面卡,
解決方案: 參考 本連結 的指南, 問題將會被解決。
問題: 安裝好 teamViewer 後,提示 “dependencies not met”
解決方案: 參考 本連結。
深度學習環境
遠端控制軟體安裝 (TeamViewer):
dpkg -i teamviewer_11.0.xxxxx_i386.deb
包管理工具安裝 (Anaconda):
Anaconda 是一個易於安裝的免費包管理、環境管理和 Python 分發工具包。其中收集了多達 720 個 開源包並提供免費的支援社群。它可以建立虛擬環境,這些虛擬環境並不會相互影響。當同時使用不同的深度學習框架,這非常有用,儘管它們配置不同。使用它來安裝包頁非常方便。極易安裝,參考這裡。
使用虛擬環境的一些命令:
source activate virtualenv
source deactivate
開發環境安裝 (Python IDE):
Spyder vs Pycharm?
Spyder:
優點:類 matlab,易於檢視中間結果。
Pycharm:
優點:模組化編碼、更完整的 web 開發框架和跨平臺的 IDE。
在我的個人哲學中,我認為它們只是工具。當使用時每個工具就會派上用場。我將使用 IDE 來構建主專案。例如,使用 pycharm 構建框架。然後,我僅用 vim 修改程式碼。這並不是說 VIM 有多麼的強大和花哨。之後,我將使用 Vim 修改程式碼。而是因為它是我想真正掌握的文字編輯器。對於文字編輯器,我們不需要掌握兩個。在特殊情況下,我們需要頻繁地檢查IO、目錄等,我們可能希望使用 spyder。
安裝:
spyder:
你不需要安裝 spyder,因為 Anaconda 中已經自帶了 spyder
Pycharm
vim
sudo apt-get install vim
我使用的配置:Github
Git
sudo apt install git
git config –global user.name “Guanghan Ning”
git config –global user.email “guanghan.ning@gmail.com”
git config –global core.editor vim
git config –list
GPU 優化計算環境安裝 (CUDA 和 CuDNN)
CUDA
安裝 CUDA 8.0 RC: 選擇 7.5 以上版本的 8.0 版本有兩個原因:
相比於 CUDA 7.5,CUDA 8.0 將會提高 GTX1080 (Pascal) 的效能。
ubuntu 16.04 似乎不支援 CUDA 7.5,因為你在官網上找不到它。因此 CUDA 8.0 是唯一的選擇。
CUDA 入門指南
CUDA 安裝指南
sudo sh cuda_8.0.27_linux.run
按照命令提示
作為 CUDA 環境一部分,你需要在你主目錄的 ~/.bashrc 檔案中新增以下內容。
export CUDA_HOME=/usr/local/cuda-8.0
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
PATH=${CUDA_HOME}/bin:${PATH}
export PATH
驗證是否安裝 CUDA(記住需要重啟 terminal):
nvcc –version
CuDNN(CUDA 深度學習庫)
安裝 CuDNN
版本:CuDNN v5.0 for CUDA 8.0RC
使用者指南
安裝指南
方式一:(環境變數中新增 CuDNN 路徑)
Extract folder “cuda”
cd
export LD_LIBRARY_PATH=
pwd
:$LD_LIBRARY_PATH
方式二: (將 CuDNN 的檔案 拷貝到 CUDA 資料夾下。如果 CUDA 執行正常,它會通過相對路徑自動找到 CUDNN)
tar xvzf cudnn-8.0.tgz
cd cudnn
sudo cp include/cudnn.h /usr/local/cuda/include
sudo cp lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
安裝深度學習框架:
Tensorflow / keras
首先安裝 tensorflow
conda create -n tensorflow python=3.5
在環境中使用 Pip 安裝 Tensorflow (目前不支援 cuda 8.0。當 CUDA 8.0 的二進位制檔案釋出後我將會進行更新)
source activate tensorflow
sudo apt install python3-pip
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.9.0-cp35-cp35m-linux_x86_64.whl
pip3 install –upgrade $TF_BINARY_URL
install bazel: install jdk 8, uninstall jdk 9.
sudo apt-get install python-numpy swig python-dev
./configure
build with bazel: bazel build -c opt –config=cuda //tensorflow/cc:tutorials_example_trainer, bazel-bin/tensorflow/cc/tutorials_example_trainer –use_gpu.
安裝 keras
定位到 Keras 目錄中並執行安裝命令:
sudo python setup.py install
改變預設後端 從 theano 到 tensorflow
使用 conda 在虛擬環境間進行切換
source activate tensorflow
source deactivate
Mxnet
為 Mxnet 建立一個虛擬環境
conda create -n mxnet python=2.7
source activate mxnet
參考 官方網站 安裝 mxnet
sudo apt-get update
sudo apt-get install -y build-essential git libatlas-base-dev libopencv-dev
git clone –recursive https://github.com/dmlc/mxnet
edit make/config.mk
set cuda= 1, set cudnn= 1, add cuda path
cd mxnet
make clean_all
make -j4
我遇到的一個問題是,“高於 5.3 版本的 gcc 是不支援的!”, 而我的 gcc 為 5.4,因此我不得不刪除它。
apt-get remove gcc g++
conda install -c anaconda gcc=4.8.5
gcc –version
用於 mxnet 的Python 包安裝
conda install -c anaconda numpy=1.11.1
方法 1:
cd python; sudo python setup.py install
sudo apt-get install python-setuptools
方法 2:
cd mxnet
cp -r ../mxnet/python/mxnet .
cp ../mxnet/lib/libmxnet.so mxnet/
快速測試:
python example/image-classification/train_mnist.py
GPU 測試:
python example/image-classification/train_mnist.py –network lenet –gpus 0
Caffe
需要安裝 OpenCV。Opencv 3.1 的安裝,參考以下連結:Ubuntu 16.04 或 15.10 OpenCV 3.1 安裝指南
Darknet
這是所有需要安裝工具中最易安裝的。僅需執行 “make” 命令,就是這麼簡單。
開箱即用的深度學習環境:Docker
我已經在 Ubuntu 14.04 和 TITAN-X (cuda7.5) 上正確的安裝過 caffe、darknet、mxnet 和 tensorflow 等。我已經完成了這些框架的專案,一切都很順利。因此,如果你想專注於深度學習的研究,而不是被你可能遇到的外圍問題所困擾,那麼使用這些預先構建的環境比使用最新版本更安全。然後,您應該考慮使用 docker 將每個框架與它自己的環境隔離開來。這些 docker 映象可以在 DockerHub 中找到。
安裝 Docker
與虛擬器不同,docker 映象由層構建。同一個元件可以在不同的映象間共享。當我們下載一個新映象,已經存在的元件是不需要重新下載的。相比於完全替換虛擬機器映象,這是非常高效和方便的。docker 容器是 docker 映象的執行時。這些映象可以被提交和更新,就如同 Git.
要在 Ubuntu 16.04 上安裝 docker,我們可以參考 官方網站 的指南。
安裝 NVIDIA-Docker
docker 容器是硬體和平臺無關的,但是 docker 並沒有通過容器來支援 NVIDIA GPU。(硬體是專門的,需要驅動程式。)為了解決這個問題,在特定的機器上啟動容器的時候,我們需要 nvidia-docker 掛載到裝置和驅動檔案上。在這種情況下,映象對於 Nvidia 驅動是不可知的。
NVIDIA-Docker 的安裝從 這裡 可以找到。
下載深度學習 Docker 映象
我從 docker Hub 收集了一些預購建映象。這些映象列表如下:
cuda-caffe
cuda-mxnet
cuda-keras-tensorflow-jupyter
可以在 docker hub 上找到更多映象。
在主機和容器間共享資料 對於計算機視覺研究人員來說,沒有看到結果會很尷尬。例如,給一個影像新增畢加索風格,我們希望從不同的 epoch 輸出結果。參考 本頁面 快速在主機和容器間共享資料。在一個共享目錄中,我們可以建立專案。在主機上,我們可以使用文字編輯器或者我們喜歡的 IDE 來編寫程式碼。接著,我們可以在容器中執行程式。共享容器中的資料可以在基於 Ubuntu 機器的主機上通過 GUI 看到並處理。
瞭解簡單的 命令
如果你是一個 docker 新手,不要不知所措。如果你將來不需要用到它的話,你是不需要系統的學習這方面的知識的。以下是一些在 docker 上 使用的簡單命令。如果你認為 docker 是一個工具,這些命令足夠了,並且僅僅是為了深度學習而使用它。
如何檢查 docker 映象?
docker images: 查詢所有安裝的 docker 映象。
如何檢查 docker 容器?
docker ps -a:查詢所有安裝的容器。
docker ps: 查詢當前執行的容器
如何退出 docker 容器?
(方法 1) 在對應於當前容器的終端輸入:
exit
(方法 2) 使用 [Ctrl + Alt + T] 開啟一個新終端,或者使用 [Ctrl + Shift + T] 開啟一個新終端:
docker ps -a:查詢安裝的映象。
docker ps: 查詢執行的容器。
docker stop [container’s ID]: 停止退出容器。
如何刪除一個 docker 映象?
docker rmi [docker_image_name]
如何刪除一個 docker 容器?
docker rm [docker_container_name]
基於已經存在的映象如何製作我們自己的 docker 映象?(從一個已經建立的映象更新容器並且將結果提交到映象。)
載入映象,開啟一個容器
在容器中做一些修改 -提交映象:docker commit -m “Message: Added changes” -a “Author: Guanghan” 0b2616b0e5a8 ning/cuda-mxnet
在主機和 docker 容器之間拷貝資料:
docker cp foo.txt mycontainer:/foo.txt
docker cp mycontainer:/foo.txt foo.txt
從 docker 映象中開啟一個容器:
是否需要儲存這個容器,因為它是可以被提交的:docker run -it [image_name]
如果容器只是暫時使用:docker run –rm -it [image_name]
歡迎發表評論
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。