如何自己打造一個深度學習伺服器?
來自專欄景略集智62 人贊了文章
本文首發自集智專欄
最近我(作者Wayde Gilliam——譯者注)在學習了一些深度學習方面的知識和教程後,決定自己搭一個伺服器用來訓練機器學習模型,不再用現在所用的AWS p2虛擬機和存儲器。我意識到,後面我會用到規模大得多的數據集,不想因為處理能力不足而花上幾小時訓練我的模型,所以搭建自己的深度學習伺服器是個不錯的選擇,因為從長遠來看,能給我省下不少錢和時間,也能讓自己有更豐富的搭建伺服器的經驗。
注意:本文更多的是想關注伺服器設置,以及讓多個用戶同時協同工作,所以軟體安裝過程寫的相對簡單一些。想看更詳細的版本,可參見這篇文章
列出各部分清單
在將各個部分組裝在一起之前,你需要想好自己想要什麼樣的機器。就我個人而言,想達到如下標準:
- 比亞馬遜P2虛擬機要更強大
- 有空間可以添加GPU,RAM,存儲器以及自定義冷卻系統
- 硬體至少能撐上幾年
- 預算不超過3000美元左右
我用http://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期《人工智慧-從零開始到精通》限時折扣中!
(https://h5.youzan.com/v2/goods/1ya9wqql1ow4c)
談笑風生 在線編程 了解一下?(前25位同學還可領取¥200優惠券哦)推薦閱讀:
※簡單粗暴地入門機器學習
※是什麼技術讓我們變成透明人?
※『A 』關於Python機器學習,一套無敵的體系是怎樣的?
※如何計算卷積層中對應參數個數?
※循環神經網路不需要訓練?復現「世界模型」的新發現
TAG:深度學習DeepLearning | 機器學習 | 人工智慧 |