07.21 使用AMD CPU,3000美元打造自己的深度學習服務器

選自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來細化各個部件,因為它可以將對比和組裝其它部件變得非常簡單,而且還具備很不錯的部件兼容性檢查器。我將詳細解釋選擇每個部件的原因以及它們如何與整個系統協同工作。以下是我的服務器鏈接地址: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 確實讓你看起來更酷。

使用AMD CPU,3000美元打造自己的深度學習服務器

這幅圖裡的東西花掉了我一年的積蓄和畢業的錢

把部件整合到一起

你可能不太瞭解如何組裝一臺電腦,這個過程其實就像組裝一套昂貴的樂高積木一樣。任何人都可以做到,因為它真的很簡單。我將快速介紹如何組裝電腦,並且我強烈建議你在組裝自己的電腦時觀看完整的視頻(https://www.youtube.com/watch??v = IhX0fOUYd8Q)。這些說明幾乎適用於任何你正在使用的電腦,就像我上面鏈接的視頻指南一樣。

第一步:組裝 CPU

使用AMD CPU,3000美元打造自己的深度學習服務器

這可能是組裝電腦過程中最可怕的部分,因為你必須遵循特定的步驟,並且可能由於一些小意外而毀掉價值 430 美元的 CPU(如弄斷一個 CPU 的引腳)。不過這一步其實很簡單,你只需確保組裝前看過視頻教程即可。對於 Threadripper 來說,安裝過程略有不同,因為在大多數主板上,你不需要「鎖緊」處理器,而是使用單個扣架即可。

使用AMD CPU,3000美元打造自己的深度學習服務器

第二步:組裝電源設備

使用AMD CPU,3000美元打造自己的深度學習服務器

電源的安裝順序並沒有對錯之分,但我喜歡先把 PSU 放進盒子裡,因為有些情況下你需要把 PSU 卡進一個插槽裡,這樣做你才能「穿過主板」。

第三步:組裝其它部件

使用AMD CPU,3000美元打造自己的深度學習服務器

這是至關重要的一步,一旦主板安裝好,那其他部分的安裝會變得很容易。我將按照如下順序進行安裝:

  1. 安裝 RAM。這很簡單,只需把內存條向正確的方向移動,並把插槽正確地按進主板即可(請參閱安裝手冊,因為插槽要根據你擁有的內存條個數決定)。
  2. 安裝 CPU 冷卻器。唯一的小麻煩是為了與 TR 兼容,我必須更換安裝支架,這需要很大的力氣。安裝散熱器需要 8 個螺栓,我已安裝完畢。
  3. 安裝顯卡。只需要把顯卡安裝到主板的特定卡槽中即可(像內存條一樣,參照你的手冊,看哪些插槽可以把顯卡放入),再把散熱器固定在你的機箱上。要確保你的散熱器在 GPU 上方。在上圖中我犯了個小錯誤,所以不得不把它重新掛在機箱的前板上。
  4. 安裝存儲器。為了獲得更好的散熱效果我卸掉了一塊驅動板,所以我把 SSD 和 HDD 放在右下角的單驅動器槽裡。

第四步:安裝成功?

使用AMD CPU,3000美元打造自己的深度學習服務器

現在可以打開你的設備了。開始因為我設備的電源鍵上正負線接反了,所以我的設備並沒有成功打開,但後來還是出現了預期的白光和紅光。如果一切順利,你可以看到你的電腦屏幕被點亮,然後主板開始搜索引導設備。

設置服務器

安裝操作系統

下一步是安裝操作系統。我使用的是 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。

第二步:創建一個動態 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
/<tmuxp-config>


分享到:


相關文章: