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

景略集智發表於2019-03-03

本文首發自集智專欄

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

最近我(作者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 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 ~/downloads
cd ~/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新增到我們的PATH變數:

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:

# 取消下一行的註釋能讓你為使用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"

# 配置 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
複製程式碼

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

#echo "c.NotebookApp.port = 9999" >> $HOME/.jupyter/jupyter_notebook_config.py
複製程式碼

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

pip install tmuxp
mkdir ~/.tmuxp
複製程式碼

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

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:
    # 執行為所有窗格中的第一行命令
    - 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 ~
複製程式碼

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

附我參考的一些資料: www.digitalocean.com

towardsdatascience.com

medium.com

參考資料:waydegg.github.io


0806期《人工智慧-從零開始到精通》

限時折扣中! 戳這裡看詳情

談笑風生 線上程式設計 瞭解一下?

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

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

相關文章