使用AMD CPU,打造自己的深度學習伺服器
選自GitHub,作者:Wayde Gilliam,機器之心編譯。
本文作者詳細描述了自己組裝深度學習伺服器的過程,從 CPU、GPU、主板、電源、機箱等的選取到部件的安裝,再到伺服器的設置,可謂面面俱到。作者指出,組裝者首先要弄清自己的需求,然後根據預算做出合理的選擇。
註:本文旨在討論伺服器設置及多用戶協作,部件組裝和軟體安裝過程是 Slav Ivanov 關於創建自己的 DL Box 的文章(https://medium.com/m/global-identity?redirectUrl=https://blog.slavv.com/the-1700-great-deep-learning-box-assembly-setup-and-benchmarks-148c5ebe6415)的簡化版本。
我剛開始學習 fast.ai 課程的第一部分——「Practical Deep Learning for Coders」,我想搭建自己的伺服器來訓練模型,作為使用 AWS p2 和存儲的升級。我將會使用更大的數據集,並且我不希望在訓練模型時因為缺乏足夠的處理能力而等待數小時,因此構建自己的 DL rig 伺服器對我來說是一個不錯的選擇,而且從長遠來看,它將為我節省大量的時間和金錢,而且可以積累組裝伺服器的良好經驗。
組裝
列出部件清單
在準備部件之前,你要弄清楚自己到底想從機器中得到什麼。個人而言,我想獲得以下改進:
- 比 Amazon p2 更加強大
- 容納額外 GPU、RAM、存儲及定製液體冷卻的空間
- 可以用很久的硬體
- 預算控制在 3000 美元左右
我用 pcpartpicker.com (http://pcpartpicker.com/) 來細化各個部件,因為它可以將對比和組裝其它部件變得非常簡單,而且還具備很不錯的部件兼容性檢查器。我將詳細解釋選擇每個部件的原因以及它們如何與整個系統協同工作。以下是我的伺服器鏈接地址:https://pcpartpicker.com/b/CgpG3C。
GPU: GTX 1080 Ti Hybrid
因為你要使用顯卡來訓練模型,所以這是組裝過程中最重要的一部分,因此,GPU 越強大,你處理大型數據集的速度就越快。GPU 內存越大,處理能力也就越強(如:訓練速度更快,批尺寸更大……)。我為自己的伺服器選了兩塊這種顯卡,因為我在預算里為它們預留了空間,這樣我就能用其中一塊顯卡訓練模型,讓另一個用戶在第二塊卡上訓練其模型。你可以根據自己的預算縮減 GPU 內存(1070、1060 等),防止與其它部件爭搶預算。Hybrid 1080 GPU 也不錯,因為除了大多數 GPU 具有的正常風扇冷卻之外,它還預裝了 aio 水冷系統。1080 Ti 在滿負載運行時會過熱,因此,在訓練模型時,良好的冷卻系統對於延長顯卡壽命並保持其性能至關重要。關於顯卡選擇的更多細節,請參見 http://timdettmers.com/2017/04/09/which-gpu-for-deep-learning/,該文幫助我真正了解了如何選擇適合深度學習環境的顯卡。
CPU: AMD Threadripper 1900x
雖然你用顯卡訓練神經網路,但 CPU 依然很重要,因為你要用它來進行數據準備等操作,因此那些多核 CPU 將有助於加快速度。我用的是「線程撕裂者」Treadripper,因為這是市面上非常新的一款多核 CPU(ThreadRipper 2 代有 32 個內核!),而且比因特爾價格低得多。1900x 是去年發布的基礎版 TR,它只有 8 個內核,不過我對這台伺服器的整體目標是保持它的可升級性。
需要注意的一點是,在選擇 CPU 時,要確保有 8 或 16 個 pcie 插槽供顯卡使用,這樣才能保證它們在低負載下發揮最好的性能,否則就有堵塞系統的風險。在高端 CPU 上,如果你的伺服器中有 4 個顯卡,那麼你就有足夠的 pcie 插槽。
主板:MSI X399 SLI Plus
選擇這塊主板是因為它是一塊完整的 ATX 板,可容納 4 個 GPU,RAM 最多可達 128GB。正如我前面所說,這個伺服器的主要目標之一是保持它可升級。
內存:32GB Corsair Vengeance LPX DDR4 (2 x 16GB)
內存越大,處理大型數據集就越容易。我的下一個升級計劃是再添加兩個 16GB RAM 內存條,這也是我沒有安裝四通道內存(4 個 8GB 內存條)的原因,儘管它會提高我的伺服器的性能。
存儲:256GB Samsung SSD & 2TB HDD
我把 Ubuntu、我的所有庫、我在 SSD 上正在使用的數據集以及手裡的其它所有數據都存在 2TB 的機械硬碟上。
冷卻器:Corsair H100i v2 液體冷卻器
「線程撕裂者」沒有備用冷卻器(如果你有 30 美元的餘款,至少應該買一個便宜的二手冷卻器),所以我想要一個可以全天候使用的、便宜又容易維護的冷卻器。這款集各種優點於一身的冷卻器非常容易安裝,而且非常可靠(在數十萬台機組中,可能只有一兩台發生冷卻液泄漏)、安靜。
電源:EVGA SuperNOVA 1000w 80 + Gold Certified
最好有一個功率超過技術要求的 PSU。PCPartpicker 的功率計算器能夠大致算出你需要多大的功率(我的伺服器是 824w),然而它經常在數量上出錯,因此最好進行安全操作,以防你的計算機無法打開。「Gold Certified」只是指 PSU 的效率(浪費了多少功率作為熱量)。
機箱:Corsair 760T Full Tower
我選擇這個機箱是因為它的價格和內部空間大小。雖然它並不能提高你的模型訓練速度,但是透明的側面板和紅色的 LED 確實讓你看起來更酷。
這幅圖裡的東西花掉了我一年的積蓄和畢業的錢
把部件整合到一起
你可能不太了解如何組裝一台電腦,這個過程其實就像組裝一套昂貴的樂高積木一樣。任何人都可以做到,因為它真的很簡單。我將快速介紹如何組裝電腦,並且我強烈建議你在組裝自己的電腦時觀看完整的視頻(https://www.youtube.com/watch??v = IhX0fOUYd8Q)。這些說明幾乎適用於任何你正在使用的電腦,就像我上面鏈接的視頻指南一樣。
第一步:組裝 CPU
這可能是組裝電腦過程中最可怕的部分,因為你必須遵循特定的步驟,並且可能由於一些小意外而毀掉價值 430 美元的 CPU(如弄斷一個 CPU 的引腳)。不過這一步其實很簡單,你只需確保組裝前看過視頻教程即可。對於 Threadripper 來說,安裝過程略有不同,因為在大多數主板上,你不需要「鎖緊」處理器,而是使用單個扣架即可。
照片來源:Slav Ivanov
第二步:組裝電源設備
電源的安裝順序並沒有對錯之分,但我喜歡先把 PSU 放進盒子里,因為有些情況下你需要把 PSU 卡進一個插槽里,這樣做你才能「穿過主板」。
第三步:組裝其它部件
這是至關重要的一步,一旦主板安裝好,那其他部分的安裝會變得很容易。我將按照如下順序進行安裝:
- 安裝 RAM。這很簡單,只需把內存條向正確的方向移動,並把插槽正確地按進主板即可(請參閱安裝手冊,因為插槽要根據你擁有的內存條個數決定)。
- 安裝 CPU 冷卻器。唯一的小麻煩是為了與 TR 兼容,我必須更換安裝支架,這需要很大的力氣。安裝散熱器需要 8 個螺栓,我已安裝完畢。
- 安裝顯卡。只需要把顯卡安裝到主板的特定卡槽中即可(像內存條一樣,參照你的手冊,看哪些插槽可以把顯卡放入),再把散熱器固定在你的機箱上。要確保你的散熱器在 GPU 上方。在上圖中我犯了個小錯誤,所以不得不把它重新掛在機箱的前板上。
- 安裝存儲器。為了獲得更好的散熱效果我卸掉了一塊驅動板,所以我把 SSD 和 HDD 放在右下角的單驅動器槽里。
第四步:安裝成功?
現在可以打開你的設備了。開始因為我設備的電源鍵上正負線接反了,所以我的設備並沒有成功打開,但後來還是出現了預期的白光和紅光。如果一切順利,你可以看到你的電腦屏幕被點亮,然後主板開始搜索引導設備。
設置伺服器
安裝操作系統
下一步是安裝操作系統。我使用的是 Linux,因為大多數 DL 框架都是針對該系統設計的。使用的台式機是 Ubuntu 16.04 LTS, 用 USB 就可安裝全部的東西。有很多像 UNetbootin 或 Rufus(僅用於 Windows)的免費工具,可以先下載到 U 盤中備用。這是一個介紹在 Mac 上創建可啟動 USB 的完整過程的教程(https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-macos?_ga=2.169997348.541383618.1529376295-1852780805.1529376295#0),如果你用 Windows,可以打開此鏈接:https://www.howtogeek.com/howto/linux/create-a-bootable-ubuntu-usb-flash-drive-the-easy-way/。
設置 SSH
第一步:埠映射
你需要對所有的路由器進行類似處理,如果是 apple 的路由器可以遵循這個指南:https://portforward.com/apple/,操作如下:1. 為你的伺服器設置一個靜態 IP,防止它在每次關閉時更改。2. 用 Apple Airport Utility 登錄你的路由器。3. 為伺服器映射埠,完成這一步需要找到伺服器的 MAC 地址,如何在 Ubuntu 找到地址可以查看此鏈接:http://technologyinfinite.blogspot.com/2016/07/three-simple-ways-to-find-mac-address.html。(http://technologyinfinite.blogspot.com/2016/07/three-simple-ways-to-find-mac-address.html%E3%80%82)
第二步:創建一個動態 IP 地址
我之前為伺服器創建過動態 IP 地址,可以允許我在終端遠程連接它。你可以通過該網站(http://canyouseeme.org/)驗證它的有效性。
鍵入一個如下所示的命令連接到我的伺服器:
ssh [my_username]@[my_ip] -L 8888:[dl-rig_static_ip]:8889
我的伺服器在埠 8888 上運行,jupyter notebooks 運行在 8889 上(-L 選項將指定的本機埠重新定向到不同的主機和埠)。這樣我們就可以在本地運行我們的設備,與伺服器同時測試,以便訓練。如果不想這樣,在-L 之前把所有東西輸入進去即可。在下一節我會解釋如何更改運行 jupyter notebooks 的埠。
安裝深度學習/機器學習庫
現在需要安裝所有的與深度學習/機器學習相關的庫。我會將安裝腳本進行分節,這樣你就容易理解這些內容。該腳本是基於 Jeremy Howard』s 編寫的 install-gpu.sh(https://github.com/fastai/courses/blob/master/setup/install-gpu.sh),這裡邊很多東西不僅僅是因為它們是實用性工具,更是因為這也是我們要在 Fastai 中使用的。
首先,我們需要保證系統是最新的,並且安裝了所有我們需要的基礎工具包:
sudo apt-get update
sudo apt-get --assume-yes upgrade
sudo apt-get --assume-yes install tmux build-essential gcc g++ make binutils unzip
sudo apt-get --assume-yes install software-properties-common
sudo apt-get --assume-yes install git
下一步是下載和安裝所有 CUDA GPU 的驅動包:
mkdir ~/downloadscd ~/downloads
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda
sudo apt-get --assume-yes upgrade
sudo apt-get --assume-yes autoremove
sudo apt-get install cuda-toolkit-9.0 cuda-command-line-tools-9-0
現在我們開始驗證是否正確安裝了 CUDA:
sudo modprobe nvidia
nvcc --version
nvidia-smi
現在開始,我們將 CUDA(Nvidia Deep Learning api)添加到路徑變數:
cat >> ~/.bashrc << "EOF"
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64
${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
EOF
source ~/.bashrc
下一步是安裝 CuDNN 庫(創建神經網路所需):
wget http://files.fast.ai/files/cudnn-9.1-linux-x64-v7.tgz
tar xf cudnn-9.1-linux-x64-v7.tgz
sudo cp cuda/include/*.* /usr/local/cuda/include/
sudo cp cuda/lib64/*.* /usr/local/cuda/lib64/
現在我們為當前用戶安裝 Anaconda:
wget "https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh"
bash "Anaconda3-5.0.1-Linux-x86_64.sh" -b
cd ~
echo "export PATH="$HOME/anaconda3/bin:$PATH"" >> ~/.bashrc
export PATH="$HOME/anaconda3/bin:$PATH"
conda install -y bcolz
conda upgrade -y --all
下一步,安裝 Tensorflow 和 Keras:
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.8.0-cp36-cp36m-linux_x86_64.whl
pip install keras
mkdir ~/.keras
echo "{
"image_dim_ordering": "tf",
"epsilon": 1e-07,
"floatx": "float32",
"backend": "tensorflow"
}" > ~/.keras/keras.json
接下來,我們將為 Fastai 安裝 Python 依賴項:
mkdir -p ~/development/_training/ml
cd ~/development/_training/ml
git clone https://github.com/fastai/fastai.git
cd fastai
conda env update
以下幾節將介紹如何配置 jupyter notebook:
# Leaving the next line uncommented will prompt you to provide a password to
# use with your jupyter notebook.
jupass=`python -c "from notebook.auth import passwd; print(passwd())"`
# To hardcode the password to "jupyter" comment line above and uncomment the line below.
#jupass=sha1:85ff16c0f1a9:c296112bf7b82121f5ec73ef4c1b9305b9e538af
# create ssl cert for jupyter notebook
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout $HOME/mykey.key -out $HOME/mycert.pem -subj "/C=IE"
# configure notebook
echo "c.NotebookApp.certfile = u"/home/{user}/mycert.pem"" >> $HOME/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.keyfile = u"/home/{user}/mykey.key"" >> $HOME/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.password = u""$jupass""" >> $HOME/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.ip = "*"" >> $HOME/.jupyter/jupyter_notebook_config.py
echo "c.NotebookApp.open_browser = False" >> $HOME/.jupyter/jupyter_notebook_config.py
要更改默認埠以在(埠 8888)上運行 Jupyter notebook,請取消注釋,並輸入所需埠。這樣就可以在伺服器和本地同時運行你的筆記本,也可以在你使用筆記本時讓多個用戶使用他們自己的筆記本。
#echo "c.NotebookApp.port = 9999" >> $HOME/.jupyter/jupyter_notebook_config.py
現在我們開始配置 tmux,這個工具可以使我們在終端窗口創建多個「窗口」,同時在斷開連接後仍能保持程序的運行。因為這個文件能夠幫助我們理解 tmux 的所有功能,所以需要檢查此文件。它非常的有用,因為你可以在一個窗口中運行你的筆記本,在另一個窗口中監視 GPU 使用,並在第三個窗口中打開一個 linux 終端:
pip install tmuxp
mkdir ~/.tmuxp
接下來,我們將創建 tmuxp 的配置文件,該文件將在一個命令中對開發環境進行設置,這樣我們每次想處理事務的時候就無需配置窗口、啟用 jupyter notebook 了。對於 fastai 環境,我們將從 tmuxp 載入 fastai 開始。請參見使用 tmuxp 的鏈接,此處是 bash 腳本中的文檔,此鏈接用於在伺服器重啟時保存 tmux 會話。現在讓我們配置運行環境。
cat > $HOME/.tmuxp/fastai.yml <<tmuxp-config
session_name: fastai
windows:
- window_name: dev window
layout: main-vertical
options:
main-pane-width: 140
shell_command_before:
# run as a first command in all panes
- cd ~/development/_training/ml/fastai
- source activate fastai
panes:
- shell_command:
- clear
- shell_command:
- clear
- jupyter notebook
- shell_command:
- watch -n 0.5 nvidia-smi
Tmuxp-config
因為我們不再需要這些,所以可以刪除安裝文件:
cd ~/downloads
rm -rf cuda-repo-ubuntu1604_9.0.176-1_amd64.deb xf cudnn-9.1-linux-x64-v7.tgz Anaconda3-5.0.1-Linux-x86_64.sh
cd ~
就是這樣。在我寫這篇文章的時候,伺服器一直在全天候運行,無問題、無雜訊、非常輕鬆地通過了訓練。
其他參考資料來源:
- https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2
- https://towardsdatascience.com/building-your-own-deep-learning-box-47b918aea1eb
- https://medium.com/impactai/setting-up-a-deep-learning-machine-in-a-lazy-yet-quick-way-be2642318850
※小米開源移動端深度學習框架MACE:可轉換TensorFlow模型
※你的英語不行!微軟亞研自動語法糾錯系統達到人類水平
TAG:機器之心 |