集智专栏
资源加载中,请稍后...
集智专栏

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

集智小编

参考资料:waydegg.github.io


最近我(作者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


限时折扣中:0806期《人工智能-从零开始到精通》(前25位报名同学可领取¥200优惠券)

您也许喜欢这些文章

集智专栏

[Kaggle] 泰坦尼克号事故分析 01 数据清洗

发表至数据科学
Kaggle是一个全球性的机器学习竞赛网站,参赛者可以自己编写算法,预测更准者胜。参加竞赛是个练习机器学习技巧的好方法。 Kaggle上的竞赛有很多,目前最火热的一个是推测泰坦尼克号上哪些乘客幸存。本篇将介绍如何分析数据、训练模型、提交答案。当然如果想知道自己的真实成绩,还是需要到Kaggle.com上进行。
集智专栏

两分钟论文解析184:DeepMind自主学得音视频概念

发表至业界新闻
来自YouTube的《Two Minute PAPERS》系列,该系列视频在极短的时间浓缩介绍新近科研论文的成果,本篇(第184期)讲的是DeepMind的最新成果,用无监督的方式让算法自主学会了匹配声音和画面中的乐器。
集智专栏

两分钟论文解析185:声之形

发表至业界新闻
来自YouTube的《Two Minute PAPERS》系列,该系列视频在极短的时间浓缩介绍新近科研论文的成果,本篇(第185期)讲述的是根据声音信号建立表情模型,所采用的新技术在双盲测试中碾压了传统方法。

文章评论(2)

simbol 发表于 26天前回复
都看明白了,也准备好配自己的深度学习服务器了,剩下的先吃土半年吧
都看明白了,也准备好配自己的深度学习服务器了,剩下的就差钱了