如何自己打造一個深度學習伺服器?

如何自己打造一個深度學習伺服器?

來自專欄景略集智62 人贊了文章

本文首發自集智專欄


最近我(作者Wayde Gilliam——譯者注)在學習了一些深度學習方面的知識和教程後,決定自己搭一個伺服器用來訓練機器學習模型,不再用現在所用的AWS p2虛擬機和存儲器。我意識到,後面我會用到規模大得多的數據集,不想因為處理能力不足而花上幾小時訓練我的模型,所以搭建自己的深度學習伺服器是個不錯的選擇,因為從長遠來看,能給我省下不少錢和時間,也能讓自己有更豐富的搭建伺服器的經驗。

注意:本文更多的是想關注伺服器設置,以及讓多個用戶同時協同工作,所以軟體安裝過程寫的相對簡單一些。想看更詳細的版本,可參見這篇文章

列出各部分清單

在將各個部分組裝在一起之前,你需要想好自己想要什麼樣的機器。就我個人而言,想達到如下標準:

  • 比亞馬遜P2虛擬機要更強大
  • 有空間可以添加GPU,RAM,存儲器以及自定義冷卻系統
  • 硬體至少能撐上幾年
  • 預算不超過3000美元左右

我用pcpartpicker.com這個網站將所需的全部明細列出,因為這樣能讓我很容易的比較各個部件。後面我會詳細說說為何我選擇每個部件,以及是怎樣和系統作為一個整體工作的。作為參考,點擊這裡查看我的伺服器部件明細

GPU:GTX 1080 Ti Hybrid

GPU是你搭建深度學習伺服器中最重要的部分,因為你是在用你的顯卡訓練模型,所以你的GPU越強,處理大型數據集的速度就越快。更高的GPU內存等於更高的處理速度(比如更快的訓練速度,更大的批次,等等)。我選了兩個GPU用於我的伺服器,因為對GPU的預算還算充足,而且這樣能讓我用一個GPU訓練模型,同時讓其他人可以用另一個訓練別的模型。這部分看你自己的需要和預算情況選擇合適的GPU就行。

Hybrid 1080 GPU性能不錯,因為它除了大部分GPU內置的風扇冷卻系統外,還帶了水冷系統。 1080 Ti在全負荷情況下運行起來會很熱,所以高質量的冷卻系統才能保證顯卡的使用壽命和訓練模型的效果。如果想了解更多關於深度學習環境下的顯卡選擇知識,可以參考這篇文章,對我幫助很大。

CPU: AMD Threadripper 1900x

雖然我們是在用顯卡訓練神經網路,但是CPU也很重要,因為它用於計算操作,比如數據預處理,因此內核更高的CPU能加快計算速度。我使用的是Treadripper,因為它是市面上非常新的CPU,有數量很多的內核(32核,TR2』!),另外它的價格比英特爾系列的同類產品也稍低一些。

另外提醒一點,在你選擇CPU的時候,確保為PCI-E x16或PCI-E x8 顯卡插槽,因為在伺服器低負荷或你想限制系統時,它們性能良好。如果你的伺服器有4個顯卡,應該用更高端的CPU,能保證為你提供足夠多的PCI-E卡槽。

主板:MSI X399 SLI Plus

選擇這款主板,是因為它是完整的ATX主板,能夠放置4個GPU,另有最大128G的RAM。因為我前面提過,我的主要目標就是讓伺服器將來還有升級空間。

內存:32 GB 海盜船復仇者 LPX DDR4 (2 x 16GB)

更多的內存能讓我更容易的處理大型數據集。未來我的升級計劃是再添加2個16G的內存條,這也是我為何沒有選4通道RAM(4 x 8GB)的原因,雖然運行效果會稍微好一點。

存儲器:256GB 三星 SSD & 2TB HDD

我將Ubuntu,所有的庫還有數據集都放在了SSD存儲器上,其餘數據則存儲在了2TB HDD上。

散熱器:海盜船H100i v2水冷散熱器

Threadrippers沒有常備的散熱器,所以我想一種能24/7使用、便宜且易於維護的適用散熱器。我選的這款一體化散熱器非常容易安裝,也很實用,而且無雜訊。

電源:EVGA EVGA SuperNOVA 1000w 80+ 金牌

一定要記得始終保證電源功率大於你的技術需要。如果不確定你需要多少功率(我的是824w),可以用PCPartpicker的功率計算器幫你獲得一個大致的數字,而且最好把這裡弄的保險一點再開機。

機箱:海盜船 760T 全塔式機箱

我選了這款機箱是因為其內部空間充足,價格適中。雖然它沒法讓你的模型訓練更快些,但乾淨的側板,紅色的LED燈,還是能讓你看著酷炫多了!

一年的省吃儉用全都在這張圖上了

組裝各個部件

如果你沒有組裝電腦的經驗,把這些部件組到一起很像是在玩一套很昂貴的樂高玩具。剛開始都很容易腦子被搞得一團亂。我下面就快速說一下自己的組裝過程,不過我高度建議你跟著一個完整的組裝視頻學習組裝過程,比如這個視頻

步驟1:安裝CPU

這可能是組裝電腦中最可怕的部分,因為必須遵循一定的操作步驟,稍有不慎就有可能搞壞一塊CPU(幸運的是你可以擁有一顆高逼格的鑰匙扣)。

這部分,還是建議到網上搜一個仔細講解的視頻,一步步跟著做。Threadripper的安裝過程有點不一樣,不是把處理器「加固」在主板上,而是有個類似滑軌的拉伸式裝置。

步驟2:安裝電源

這部分沒有絕對的標準順序,不過我個人喜歡先把電源放進機箱,因為有些機箱需要你將電源放在卡槽里,這就導致有時候得經過主板,不太妙。

步驟3:把其它部分組裝在一起

一旦主板安裝好了,其它地方就很容易組裝了。我的安裝順序如下:

  • 安裝RAM。操作非常簡單,只要在正確的方向滑動內存條,放在主板上正確的卡槽里即可(記得看手冊,因為根據內存條數量不同,有些卡槽有特定用途)。
  • 安裝CPU散熱器。這部分唯一的小麻煩是我得換掉支架,這樣才能和散熱器兼容,費了一番力氣才搞定。
  • 安裝顯卡。只需將它們推入在主板上的各自卡槽里即可(和內存條一樣,查看手冊看看哪些卡插入哪些卡槽里),將散熱器固定在機箱里。確保散熱器在GPU上面。在上圖中我犯了個錯誤,我得將重新它放在機箱的前板才行。
  • 安裝存儲器。我移除了其中一個驅動器,讓空氣流通更好一些,所以將SSD和HDD一起放在了右下方底部的一個驅動器上。

步驟4:成功了嗎?

這個時候就可以開機了。剛開始我這沒打開,因為將機箱的電源鍵的正負極線路搞反了。重新弄了一遍後看到了久違的閃亮的白色、紅色光暈。如果你一切順利,應該在電腦後面也能看到這一幕,然後去找啟動設備就好了。

設置伺服器

安裝操作系統

下一步是安裝你的操作系統。我是用的Linux,因為大部分深度學習框架都是面向Linux設計的。我選了Ubuntu Desktop v16.04 LTS,然後用U盤上下載了所有東西。可以下載很多免費的工具,比如UNetbootin或Rufus(只有Windows版本),準備你的拇指驅動器。在Mac上創建一個引導USB的完整過程,可以參考這篇教程。如果用的是Windows,參考這篇

設置SSH

步驟1:埠轉發

在所有路由器中的設置過程都是一樣的,不過我用的是蘋果路由器,所以設置步驟如下:

1.為你的伺服器設置一個靜態IP,這樣每次關閉時就不會改變了。

2.用Apple Airport Utility登入你的路由器。

3.為伺服器映射埠。你需要在部分找到你的伺服器的MAC地址,在Ubuntu上怎麼找可參見這篇教程

步驟2:創建一個動態IP地址

我習慣了我伺服器設置一個動態IP地址,從而讓我能在終端遠程連接伺服器。你可以用這個網站檢查是否有效。

我輸入了以下命令以連接伺服器:

ssh [my_username]@[my_ip] -L 8888:[dl-rig_static_ip]:8889

我讓伺服器在埠8888運行,讓Jupyter notebook在埠8889運行(-L選項會將你指定的本地埠重新指向不同的埠&主機)。這樣我就能在本地機器運行notebook用於測試的同時,還能用伺服器運行模型進行訓練。不過如果你不想這樣,只需在-L部分之前輸入所有東西即可。我在下部分會解釋怎樣修改你運行notebook的埠。

安裝深度學習/機器學習庫

現在進入到安裝機器學習/深度學習所需的庫這部分。我寫了一段安裝腳本,下面會逐步講解,幫助你理解,全部代碼地址在這裡。

首先,我們要確保系統是最新的,安裝我們所需的全部基本工具:

sudo apt-get updatesudo apt-get --assume-yes upgradesudo apt-get --assume-yes install tmux build-essential gcc g++ make binutils unzipsudo apt-get --assume-yes install software-properties-commonsudo apt-get --assume-yes install git

下一步是下載和安裝所有的CUDA GPU 驅動器:

mkdir ~/downloadscd ~/downloadswget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.debsudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.debsudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pubsudo apt-get updatesudo apt-get -y install cudasudo apt-get --assume-yes upgradesudo apt-get --assume-yes autoremovesudo apt-get install cuda-toolkit-9.0 cuda-command-line-tools-9-0

現在我們驗證是否正確安裝了所有的CUDA部件:

sudo modprobe nvidianvcc --versionnvidia-smi

從這裡我們會將CUDA添加到我們的PATH變數:

cat >> ~/.bashrc << EOFexport 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}}EOFsource ~/.bashrc

之後,下個步驟就是安裝CuDNN庫(創建神經網路時需要):

wget http://files.fast.ai/files/cudnn-9.1-linux-x64-v7.tgztar xf cudnn-9.1-linux-x64-v7.tgzsudo 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" -bcd ~echo "export PATH="$HOME/anaconda3/bin:$PATH"" >> ~/.bashrcexport PATH="$HOME/anaconda3/bin:$PATH"conda install -y bcolzconda 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.whlpip install kerasmkdir ~/.kerasecho { "image_dim_ordering": "tf", "epsilon": 1e-07, "floatx": "float32", "backend": "tensorflow"} > ~/.keras/keras.json

接著,我們安裝Fastai所需的Python環境依賴:

mkdir -p ~/development/_training/mlcd ~/development/_training/mlgit clone https://github.com/fastai/fastai.gitcd fastaiconda env update

接下來的幾個部分是配置Jupyter notebook:

# 取消下一行的注釋能讓你為使用Jupyter notebook提供一個密碼jupass=`python -c "from notebook.auth import passwd; print(passwd())"`# 將密碼硬編碼到上面的 jupyter 注釋行並取消下面一行的注釋#jupass=sha1:85ff16c0f1a9:c296112bf7b82121f5ec73ef4c1b9305b9e538af# 為jupyter notebook創建ssl 證書openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout $HOME/mykey.key -out $HOME/mycert.pem -subj "/C=IE"# 配置 notebookecho "c.NotebookApp.certfile = u/home/{user}/mycert.pem" >> $HOME/.jupyter/jupyter_notebook_config.pyecho "c.NotebookApp.keyfile = u/home/{user}/mykey.key" >> $HOME/.jupyter/jupyter_notebook_config.pyecho "c.NotebookApp.password = u"$jupass"" >> $HOME/.jupyter/jupyter_notebook_config.pyecho "c.NotebookApp.ip = *" >> $HOME/.jupyter/jupyter_notebook_config.pyecho "c.NotebookApp.open_browser = False" >> $HOME/.jupyter/jupyter_notebook_config.py

如果想修改運行Jupyter notebook的默認埠(埠8888),取消這一行的注釋,進入目標埠。這能讓你在伺服器和本地同時運行你的notebook,其他人在用他們的notebook時,你也能用你的:

#echo "c.NotebookApp.port = 9999" >> $HOME/.jupyter/jupyter_notebook_config.py

現在,我們配置tmux,這是一款工具能讓我們在終端窗口創建很多個窗格(pane),以及在下線後讓程序保持運行。可以看看這份文檔(),在理解tmux的功能時幫了我很大的忙。它真的很有用,因為你可以在一個窗格上運行你的notebook,在另一個窗格上面監督你的GPU使用狀況,在另一個窗格上面打開一個Linux終端:

pip install tmuxpmkdir ~/.tmuxp

接著我們創建tmuxp配置文件,它能用一行命令設置我們的開發環境,不必在每次想做些工作時就得配置所有的窗格,啟動Jupyter notebook等等。對於我們的fastai環境,我們先用tmuxp載入fastai。我們配置環境:

cat > $HOME/.tmuxp/fastai.yml <<tmuxp-config session_name: fastaiwindows:- window_name: dev window layout: main-vertical options: main-pane-width: 140 shell_command_before: # 運行為所有窗格中的第一行命令 - cd ~/development/_training/ml/fastai - source activate fastai panes: - shell_command: - clear - shell_command: - clear - jupyter notebook - shell_command: - watch -n 0.5 nvidia-smiTmuxp-config

因為我們不再需要他們,所以刪掉安裝文件:

cd ~/downloadsrm -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 ~

就這樣我們配置了一台深度學習伺服器!在我寫這篇教程時,我的伺服器已經無故障全天候運行了很長一段時間,完全沒有噪音,用它做了很多訓練模型的工作。

附我參考的一些資料:

www.digitalocean.com

towardsdatascience.com

medium.com

參考資料:waydegg.github.io


0806期《人工智慧-從零開始到精通》限時折扣中!

(h5.youzan.com/v2/goods/)

談笑風生 在線編程 了解一下?

(前25位同學還可領取¥200優惠券哦)

推薦閱讀:

簡單粗暴地入門機器學習
是什麼技術讓我們變成透明人?
『A 』關於Python機器學習,一套無敵的體系是怎樣的?
如何計算卷積層中對應參數個數?
循環神經網路不需要訓練?復現「世界模型」的新發現

TAG:深度學習DeepLearning | 機器學習 | 人工智慧 |