在完成 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)”】