如何自己打造一个深度学习服务器?

4,209 阅读11分钟

本文首发自集智专栏

最近我(作者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优惠券哦)