成本14,000元,如何自己動手搭建深度學習服務器?
在完成 Jeremy Howard 非常出色的深度學習第一部分課程之后,我查看了一下我的亞馬遜網絡服務(AWS)賬單,發現我每個月運行 GPU 都要花費差不多 200 美元。以這樣的代價來完成網絡課程看起來代價有點大,而且我已開始著手研究一些課程以外的數據集,并迫切地想得出結果。
通過與大家進行交流,閱讀了大量博客文章之后,我最終決定開始配置自己的深度學習服務器。當今科技和硬件的發展是如此的迅猛,我擔心我曾閱讀過的文章很快就會過時,但我希望自己的以下總結能夠為大家帶來幫助。
配置服務器的 6 大步驟:
1). 選擇組件
2.) 組裝
3). 安裝操作系統
4). 安裝驅動程序
5). 安裝庫
6). 設置遠程訪問
1. 選擇部件
我閱讀了大量博客,最終形成了現在應該選擇哪種配置的概念。因為硬件更新換代太快,在下個世代到來時到底該買哪些型號的部件,這一問題還是得留給你們研究。但是一般而言,你需要選購以下部件:主板、CPU、內存(隨機存取存儲器,RAM)、硬盤驅動器(固態硬盤,SSD)、顯卡(GPU)、CPU 風扇、電源和機箱。
P.S. 我強烈建議你在購買之前在 pcpartpicker.com 上創建一個清單。這個網站的特色在于它有一個「兼容性檢查」的功能,它會告訴你自己選擇的部件是否互相兼容。我的列表在這里。
部件清單(原文為美國市場價,機器之心將其替換為 2 月 23 日,京東自營/淘寶價)
- CPU—英特爾 i7 7700k(Kabylake)4.2GHz 四核 2799 元
- 內存—海盜船 復仇者 LPX 32GB (2 x 16) DDR4–3200 2499 元
- 固態硬盤—三星 850 EVO sata3 500G 1299 元
- GPU—索泰 GeForce GTX 1080 8GB 4999 元
- 主板—微星 Z270-A PRO ATX LGA1151 1299 元
- CPU 風扇—酷冷至尊 Hyper 212 EVO 82.9 CFM 128 元
- 供電電源—EVGA SuperNOVA G2 750W ATX 879 元
- 機箱—NZXT S340 (White) ATX Mid Tower Case 369 元
- 總價:14,271 元
我決定從單塊顯卡開始自己的裝機之路,但我選擇的微星 (MSI) 主板有多個 PCIe 通道,這意味著如果有需要,我可以在未來添加更多的 GPU。一般而言,我都會選擇那些用戶評論數最多的硬件,即使這些評論褒貶不一。但評論意味著部件受歡迎的程度,用戶數量越大,就越有可能出現用戶自行創建的使用指南和建議。這會為你接下來的兩個步驟免去了很大的痛苦。
一些實用的文章:
- Build Personal Deep Learning Rig (http://guanghan.info/blog/en/my-works/building-our-personal-deep-learning-rig-gtx-1080-ubuntu-16-04-cuda-8-0rc-cudnn-7-tensorflowmxnetcaffedarknet/)
- Optimizing a Starter CUDA Build (https://www.servethehome.com/optimizing-a-starter-cuda-machine-learning-ai-deep-learning-build/)
- Building a Deep Learning Dream Machine (http://graphific.github.io/posts/building-a-deep-learning-dream-machine/)
- Deep Learning Hardware Guide (http://timdettmers.com/2015/03/09/deep-learning-hardware-guide/)
2. 組裝
這一部分非常有趣。幾乎所有的部件,我都可以在網上找到相關的指導性視頻,但是有一些部件我必須要根據相似型號的安裝視頻才可以。微星主板、酷冷至尊風扇和 NZXT 機箱的指導手冊非常不錯,但是我還是需要再找一些其他的材料。
經驗總結
- 買一把好用的螺絲刀——我的螺絲刀非常的差勁,所以很快就讓我停滯不前了。買一個桿長一點的螺絲刀,這樣你就可以夠得到很緊的地方,也是為自己省力。
- 不要吝惜自己的力量——免責聲明:要是把什么東西弄壞了,不要怪我。但是至少在兩種情況下(CPU 和內存),我因為在安裝部件時候用勁太小浪費了好多時間。我擔心太過用力,所以如果部件不能夠輕松放進去,我就放棄了。至于內存,我幾乎在亞馬遜上購買了一整套新的芯片。這些情況下,解決的辦法就是用力壓。
- 理解你的 BIOS——BIOS 是一個預先安裝在主板上的軟件,是你的機器啟動時加載的第一個軟件。它基本上是你配置硬件和安裝操作系統的一個控制面板。學會如何在 BIOS 上找到「引導盤」(U 盤或是包含操作系統的固態硬盤),怎樣選擇使用哪一張顯卡都是非常重要的。遺憾的是微星的用戶手冊在這些問題上表達得不甚清楚,但是這個視頻(https://www.youtube.com/watch?v=C6mQqlmL5Sc)會讓你更好地進行理解。
- 你的顯示器沒有壞——弄清怎樣讓顯示屏在我的新機器上工作花了我不少時間。我之前曾聽說在你第一次啟動的時候,你需要將你的 HDMI 線插到主板的某個位置,因為一開始顯卡驅動還沒有安裝。我照做了,但是當我最后啟動的時候,顯示器上什么都沒有。接著我嘗試把線插到顯卡上,也沒有用。最后我嘗試將顯卡拔出來,把線連上主板并重新啟動。終于能看到東西了!這意味著,微星的主板如果不能在 PCIe 通道找到其他的外置顯卡,就會默認使用核顯。因為在我第一次啟動的時候,就安裝了顯卡,主板就選擇使用我的的新新卡。顯示器上看不到任何東西是因為我沒有安裝英偉達的驅動。
最后,大功告成了!
3. 安裝操作系統
在顯示器可以工作之后,你會看到一個這樣的界面。這就是你的 BIOS(注:不同品牌的主板,BIOS 界面略有不同)。我需要更改兩處配置,以保證所有的東西都能正常運行:更改啟動優先級,替換默認的顯卡。
在 MSI 主板上預置的 BIOS
我計劃主要將我的機器用于編程和機器學習,所以我決定要安裝 Ubuntu 操作系統。我還希望能夠通過我的 Mac 對它進行遠程操作,所以我可能不需要 Windows,但是你可以安裝雙系統。
制作安裝 Ubuntu 的 U 盤
我依照針對 Mac 的說明(https://www.ubuntu.com/download/desktop/create-a-usb-stick-on-macos),下載了一個叫做 UNetBootin (https://unetbootin.github.io/) 的客戶端,它可以為你把所有的事情都處理好。
啟動 UBUNTU
若是一切正常,我應該能夠插入我的 U 盤,重啟,回答問題,安裝一個完全可運行版本的 Ubuntu,準備好進行下一步。但是,我得到的確實這樣的錯誤信息。
我按了好幾次退出鍵,之后按了刪除鍵,之后 F1、 F10、 F12、 #%^ 、 $\&]&&&#^,但都沒有用。
問題在于微星主板已經選擇了默認的「啟動優先級」。再次進入 BIOS(在開機之后立刻按 F11),我看到 BIOS 的配置是首先啟動硬件驅動(三星固態硬盤),這里面是空的,但是也可能會有一大堆選項。解決辦法就是把 USB 選項拉到優先級列表的頂部,然后重啟。最后,我看到了這十分友好的 Ubuntu 安裝屏幕!
在安裝了 Ubuntu 并且重啟之后,我很失望地發現我卡在了 Ubuntu 的加載屏幕上,它就停在了那里,最終超時。這又是怎么了呢?!
原來問題在于微星主板內置的顯卡(我的 GTX 1080 還在我的咖啡桌上)。它與 Ubuntu 的圖形用戶界面(GUI)不兼容!這真是經典的雞和蛋的問題。沒有 Ubuntu,我不能下載使用顯卡所需的驅動,但是沒有顯卡,我不能安裝 Ubuntu!進入 GRUB
(https://help.ubuntu.com/community/Grub2)。
Ubuntu 啟動菜單。你可以在開機后按壓左 Shift 鍵進入這一菜單。
最后,我找到了兩篇非常好的文章(http://askubuntu.com/questions/162075/my-computer-boots-to-a-black-screen-what-options-do-i-have-to-fix-it,http://askubuntu.com/questions/716957/what-do-the-nomodeset-quiet-and-splash-kernel-parameters-mean)幫我解決了這個問題。解決辦法就是在啟動命令中添加一個 *nomodeset*參數。這幫我安裝了一個普通版本的 Ubuntu GUI,得以讓我繼續進行。
4. 安裝驅動程序
英偉達的驅動是出了名地難運行,這一個也不例外。在其他用戶的引導下,我去英偉達的網站下載了 GeForce 驅動程序,接著利用 Ubuntu GUI 對它進行安裝。這個錯誤給我帶來了很大的痛苦。
- 無法檢測到可兼容的英偉達顯卡
這又是一個雞和蛋的問題。我沒有再重新接上 GTX 1080 是因為沒有驅動程序它無法工作。如果我重新接上,MSI 主板就會開始再次使用它,我就又回到了我開始的地方。解決辦法是重新進入 BIOS,改變顯卡優先級。我更新了設置,將優先級賦予給內置顯卡,而不是選擇新的顯卡。這樣我又可以重新接入 GTX 1080,并正常進入 Ubuntu。
- 你好像在運行 X 服務器
我通過使用這里的說明 (http://askubuntu.com/questions/149206/how-to-install-nvidia-run) 解決了這個問題,但是在最初,我都無法通過第一步:「點擊 CTRL+ALT+F1,使用你的憑據登錄。」我這樣做了之后,屏幕又變成了空白,和顯示器的連接就斷開了。解決方法是啟動 Ubuntu,進入文本模式,完成命令行的步驟。
更好的辦法
最終讓我感到欣慰的是所有的東西(驅動程序、CUDA、深度學習庫等)都可以運行了。但是沒過多久,因為一些配置文件我又把事情搞得一團糟。
在 Ask Ubuntu 網站上瀏覽了幾個小時之后,我注意到英偉達驅動程序上預先安裝了新的 CUDA 8.0 工具箱,讓你可以同時安裝 CUDA 和驅動程序。
我清除了現有的英偉達庫,運行了下面的代碼,然后一切都便正常運行了。你可以在這里 (http://docs.nvidia.com/cuda/cuda-quick-start-guide/index.html#ubuntu-x86_64) 看到完整的說明。
- wget
- http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
- sudo dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
- sudo apt-get update
- sudo apt-get install cuda
然后將下面的代碼添加多你的~/.bash_文件中:
- export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
- export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
- export LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LIBRARY_PATH:+:${LIBRARY_PATH}}
5. 安裝深度學習庫
有很多的好文章都對必要的深度學習庫和如何安裝進行了描述。關鍵點在于你不能夠盲目地跟隨這些說明,尤其是關于如何安裝的部分。因為這些說明經常更新,你可以在這些庫的網站上找到更好的示例。下面是我安裝的一些工具:
- CUDA—利用 GPU 的并行計算平臺
- cuDNN—加速深度學習的英偉達庫
- Anaconda—Python 數據科學 (numpy, scikit, jupyter..)
- OpenBLAS—快速的線性代數方法
- Tensorflow—谷歌的機器學習框架
- Theano—深度學習框架
- Keras—另一種框架,可以簡化 Tensorflow 或 Theano 的工作
在這之后,我進行了一些測驗以保證一切正常運行,并開始運行 Jupyter 筆記本。
6. 設置遠程訪問
再是一個可選步驟。但是如果你希望通過筆記本電腦遠程操作,下面是一些方法。
Teamviewer 是一款屏幕分享軟件。如果你安裝了這一軟件,并在兩個機器上運行,你便可以通過你的筆記本電腦控制 Ubuntu 主機,反之亦可。這讓工作變得更加方便,但是在進行屏幕分享時做所有的事情都會有一點延遲且不靈活。
SSH 和端口轉發
我想要遠程通過 SSH 訪問我的新機器,并且和它進行互動,就好像它是我在筆記本上多了個 Tab 鍵一樣。為了做到這一點,我在 Ubuntu 上安裝了 OpenSSH。
- sudo apt-get install openssh-server
- sudo service ssh status
之后,我將 Comcast 路由器配置到將外部通信量直接轉發到我的主機。我根據 Comcast 的說明,出乎意料的是這居然管用!我通過在 www.canyouseeme.org 查看端口 22,確認了這一點。部分過程可能需要你的公共 IP 地址,你可以通過運行下面的代碼找到:
- dig +short myip.opendns.com @resolver1.opendns.com
遠程筆記本
另外一個很酷的技巧就是,如果你喜歡 Jupyter,你可以在你的深度學習主機上運行你的筆記本,但是在你筆記本電腦上進行瀏覽和編輯。這里有關于這一技巧的一些教程 (http://www.justinkiggins.com/blog/zero-configuration-remote-jupyter-server/),所以我在下面只列出了命令:
- $laptop: ssh -l bfortuner@DEEPLEARNINGIP
- $server: jupyter notebook --no-browser --port=8888
- $laptop: ssh -NL 8888:localhost:8888 bfortuner@DEEPLEARNINGIP
現在你就可以在筆記本電腦的瀏覽器上訪問 http://localhost:8888,開始編輯你在深度學習機器上的筆記本。
【本文是51CTO專欄機構機器之心的原創文章,微信公眾號“機器之心( id: almosthuman2014)”】