最近我(作者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的完整过程,可以参考原文教程。
设置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 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 ~/downloads
wget 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.pub
sudo apt-get updatesudo 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 nvidianvcc --versionnvidia-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}}
EOFsource ~/.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' -bcd ~echo 'export PATH=\'$HOME/anaconda3/bin:\$PATH\'' >> ~/.bashrcexport 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/mlcd ~/development/_training/ml
git clone https://github.com/fastai/fastai.gitcd 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'# 配置 notebookecho '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 tmuxpmkdir ~/.tmuxp
接着我们创建tmuxp配置文件,它能用一行命令设置我们的开发环境,不必在每次想做些工作时就得配置所有的窗格,启动Jupyter notebook等等。对于我们的fastai环境,我们先用tmuxp加载fastai。我们配置环境:cat > $HOME/.tmuxp/fastai.yml <>
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 ~/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 ~
就这样我们配置了一台深度学习服务器!在我写这篇教程时,我的服务器已经无故障全天候运行了很长一段时间,完全没有噪音,用它做了很多训练模型的工作。