在计算机时代的早期,一名极客的满足感很大程度上来源于能DIY一台机器。到了深度学习的时代,前面那句话仍然是对的。

缘起
在2013年,MIT科技评论将深度学习列为当年十大科技突破之首。其原因在于,模型有其为庞大的网络结构,参数够多,学习能力够强,能配合大数据达到惊人的效果。而且,能自动学习特征,避免了“特征工程”这种繁琐的手工劳动。对于图像、音频和文字处理领域有极大的意义。因为最近在尝试用深度学习做文本挖掘,所以需要一台深度学习服务器(相信我,如果用CPU来跑,你的人生显得好短)。

那么就有三个选择项:
A、购买组装好的服务器,例如NVIDIA DIGITS DEVBOX
B、购买云服务,例如Amazon的GPU服务
C、自己攒一台深度学习服务器。
A项从性价比上不合算,而且不一定买的到。B项的云服务对于研究探索性质工作而言也比较贵,机器配置也不一定合适,所以我们就C项了。

硬件选择:基本思路是单显卡机器,保留升级空间

显卡选择:
先解释一点,深度学习为什么需要显卡计算?
GPU 是为大规模的并行运算而优化;
GPU 上则更多的是运算单元(整数、浮点的乘加单元,特殊运算单元等等);
GPU 往往拥有更大带宽的显存,因此在大吞吐量的应用中也会有很好的性能。
这里有一个很有趣的解释视频,解释了GPU和CPU的计算区别。

所以显卡选择最重要,因为准备基于CUDA计算(CUDA (Compute Unified Device Architecture) 是NVIDIA开发的GPU并行计算环境。),所以只能选择Nvida系列的。在英伟达产品系列中,有消费领域的GeForce系列,有专业绘图领域的Quadro系列,有高性能计算领域的Tesla系列,如何选择?

有论文研究,太高的精度对于深度学习的错误率是没有提升的,而且大部分的环境框架都只支持单精度,所以双精度浮点计算是不必要,Tesla系列都去掉了。从显卡效能的指标看,CUDA核心数要多,GPU频率要快,显存要大,带宽要高。这样,最新Titan X算是价格便宜量又足的选择。

CPU选择:
在深度学习任务中,CPU并不负责主要任务,单显卡计算时只有一个核心达到100%负荷,所以CPU的核心数量和显卡数量一致即可,太多没有必要,但是处理PCIE的带宽要到40。

主板选择:
需要支持X99架构,支持PCIe3.0,还要支持4通道DDR4内存架构。如果要搞四显卡并行,PCIE带宽支持要达到40,并且支持4-Way NVIDA SLI技术。

内存:
达到显存的二倍即可,当然有钱的话越大越好。

电源问题:一个显卡的功率接近300W,四显卡建议电源在1500W以上,为了以后扩展,选择了1600W的电源。

机箱散热:
因为各种部件相当庞大,需要有良好散热功能的大机箱,选择了Tt Thermaltake Core V51机箱,标配3个12cm风扇。未来如果需要还可以加装水冷设备。

以上就是主要硬件环境的选择和安装。

软件环境安装:

主要安装了Ubuntu系统,CUDA环境,以及theano、keras环境

1、安装ubuntu 14.04(不要安装麒麟版本)
通过官网下载iso文件刻录U盘安装,在SSD硬盘上自动安装完成。
2、安装cuda 7.5 deb文件(自带显卡驱动)
2.1 获取CUDA安装包,在NVidia官网下载local deb文件。
2.2执行如下命令安装:
    $ sudo dpkg -i cuda-repo-ubuntu1410-7-0-local_7.0-28_amd64.deb
    $ sudo apt-get update
    $ sudo apt-get install cuda
2.3设置环境变量:sudo gedit /etc/profile
    $ export PATH=/usr/local/cuda-7.5/bin:$PATH
    $ export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
2.4重启机器:用其中一个样例进行验证测试
    $ cuda-install-samples-7.5.sh ~
    $ cd ~/NVIDIA_CUDA-Samples_7.5/5_Simulations/nbody
    $ make
    $ ./nbody
    或者在sample目录中make测试项目1_utility,再运行./deviceQuery

3、安装python以及theano工具
3.1 直接下载安装anaconda套件64位版本。
    下载后用conda升级到最新。anaconda自带openblas,使numpy和theano计算能达到最大效能
3.2 修改了theano配置文件,使之缺省由gpu运算
在主目录下新建.theanorc文件
.theanorc中输入下面的内容
[cuda]
root=/usr/local/cuda/bin/
[global]
floatX = float32
device = gpu0
[nvcc]
fastmath = True
3.3 安装完成后参考如下地址进行测试
THEANO_FLAGS=floatX=float32,device=gpu python `python -c "import os, theano; print os.path.dirname(theano.__file__)"`/misc/check_blas.py
3.4 安装keras
    通过anaconda安装pip install keras
    注意keras依赖的theano是dev版本的,需要从github下源码来安装。注意本系统此时有两个python,所以要写路径
    sudo /home/user/anaconda/bin/python setup.py develop

4、设置远程服务器调用
4.1 安装ssh,启动服务
4.2 设置notebook server
在ipython中如下命令设置密码:
from IPython.lib import passwd
passwd()
记下生成的字符串。
创建一个ipython配置文件,比如起名叫myserver
ipython profile create myserver
vim ~/.ipython/profile_myserver/ipython_notebook_config.py
编辑文件,加入下面几项:
c = get_config()
c.IPKernelApp.pylab = 'inline' #启动inline模式
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.password = u'sha1:yourhashedpassword'  #把第二步的密码考进来
c.NotebookApp.port = 6868   #自己设一个端口号
启动服务
ipython notebook --profile=myserver

4.3 远程浏览器调用
远程中浏览器登陆http://192.168.3.31:6868/,输入密码,即可进入ipython notebook。
如果需要保持连接,则
nohup ipython notebook --profile=myserver
杀掉连接
lsof nohup.out
kill -9 "PID"

完工!

最后的硬件配置:
CPU: Intel X99平台 i7 5960K
内存: DDR4 2800 32G(8G*4)
主板: GIGABYTE X99-UD4
显卡: GTX Titan X
硬盘: SSD+普通硬盘

系统和软件
操作系统: Ubuntu 14.04.3 x64
CUDA: 7.5
Anaconda 2.3
Theano 7.0
Keras 2.0

参考资料:
http://timdettmers.com/2014/08/14/which-gpu-for-deep-learning/
http://timdettmers.com/2015/03/09/deep-learning-hardware-guide/
http://graphific.github.io/posts/running-a-deep-learning-dream-machine/
http://docs.nvidia.com/cuda/cuda-quick-start-guide/index.html#ubuntu-x86_64-deb
http://deeplearning.net/software/theano/tutorial/using_gpu.html#cuda

之前网上找到另一种安装theano方式是自行安装组件。但尝试未成功,有可能是因为CPU等硬件不同,可能需要自行编译安装openblas,numpy, scipy, theano等环境,极为繁琐。最后还是直接用Anaconda方便。

搭建一台deeplearning的服务器的更多相关文章

  1. 为一个支持GPRS的硬件设备搭建一台高并发服务器用什么开发比较容易?

    高并发服务器开发,硬件socket发送数据至服务器,服务器对数据进行判断,需要实现心跳以保持长连接. 同时还要接收另外一台服务器的消支付成功消息,接收到消息后控制硬件执行操作. 查了一些资料,java ...

  2. Manjaro搭建无密访问samba服务器

    为了方便Linux在Windows平台下开发,搭建Manjaro无密访问samba服务器 后面加了Windows下搭建samba方法 安装smb服务器 我用的是Manjaro gnome 18,需要安 ...

  3. 使用gitblit搭建一个简单的局域网服务器

    使用gitblit搭建一个简单的局域网服务器 1.使用背景 现在很多使用github管理代码,但是github需要互联网的支持,而且私有的git库需要收费.有一些项目的代码不能外泄,所以,搭建一个局域 ...

  4. 在Linux下搭建我的世界(Minecraft)服务器

    最近薅了百度云双12的羊毛,1核2G一年150.突然想起以前大学整个宿舍通宵开黑挖泥土的岁月,所以刚好趁着这台服务器,打算自己搭建一个我的世界服务器,重温一下以前的感觉. 超详细Linux搭建Java ...

  5. 快速搭建一个本地的FTP服务器 win10及win7

    快速搭建一个本地的FTP服务器   如果需要开发FTP文件上传下载功能,那么需要在本机上搭建一个本地FTP服务器,方便调试. (win10) 第一步:配置IIS Web服务器 1.1 控制面板中找到“ ...

  6. DNS:从零搭建公司内网DNS服务器

    写在前面的话 网上关于 DNS 的文章其实一搜索一大把,但是看别人的文档一般都会有个问题,乱,不讲究,全是 ctrl c + ctrl v,我个人是看不下去的.头皮发麻.所以决定自己来写写这方面的东西 ...

  7. 通过ProGet搭建一个内部的Nuget服务器

    .NET Core项目完全使用Nuget 管理组件之间的依赖关系,Nuget已经成为.NET 生态系统中不可或缺的一个组件,从项目角度,将项目中各种组件的引用统统交给NuGet,添加组件/删除组件/以 ...

  8. NuGet学习笔记3——搭建属于自己的NuGet服务器

    文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重 ...

  9. NuGet学习笔记(3) 搭建属于自己的NuGet服务器

    文章导读 创建NuGetServer Web站点 发布站点到IIS 添加本地站点到包包数据源 在上一篇NuGet学习笔记(2) 使用图形化界面打包自己的类库 中讲解了如何打包自己的类库,接下来进行最重 ...

随机推荐

  1. sqli-labs:7,导入导出;8-10 延时注入

    1,Load_file()导出文件 使用条件: A.必须有权限读取并且文件必须完全可读(and (select count(*) from mysql.user)>0/* 如果结果返回正常,说明 ...

  2. oracle银行卡卡号计算函数

    create or replace function GetCardNoBySerialNo(v_sysacc varchar2,v_position number) return varchar2 ...

  3. c#使用Stopwatch来计算时间间隔

    今天要记录一个接口的耗时情况,就要求去写一段测试各个代码运行时间的方法,于是就加了这么一段代码.原来的做法是在代码执行之前和之后获取系统时间,然后相减.被改成了使用c#里的Stopwatch来计算时间 ...

  4. spring事件机制

    前置知识补充: 程序里面所谓的“上下文”就是程序的执行环境,打个比方:你就相当于web程序,你的房子就相当于web程序的上下文,你可以在家里放东西,也可以取东西,你的衣食住行都依赖这个房子,这个房子就 ...

  5. Selenium+python入门

    在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供 ActionChains 类提供了鼠标操作的常用方法: perform(): 执行所有 ActionCh ...

  6. 【linux轻松学】修改文件权限

    用chmod修改文件权限,此命令非常重要. 用户范围:u 表示当前用户g 表示当前群组o 除u,g之外的用户和群组a 所有用户和群组 权限代号:r :读,用数字4表示w :写,用数字2表示x :执行, ...

  7. python学习 day21 (3月28日)----(抽象类 多态 nametuple dump)

    不要因为走的路太久了,而忘记了为了什么而出发. 提前作准备了吗?把思维导图的东西做了吗? 和工作了几年的人,相比,是不是相同的水平,如果要写简历的话. 一边学习,一边复习. 小就是大,少就是多. 1. ...

  8. 使用Hadoop API 解压缩 HDFS文件

    接上篇:使用Hadoop API 压缩HDFS文件 压缩完了,当然需要解压缩了. 直接上代码: private static void getFile(String filePath) throws ...

  9. Query - noConflict() 方法

    ps:菜鸟教程 如何在页面上同时使用 jQuery 和其他框架? noConflict() 方法会释放对 $ 标识符的控制,这样其他脚本就可以使用它了. 当然,您仍然可以通过全名替代简写的方式来使用 ...

  10. 线性回归,多项式回归(P2)

    回归问题 回归问题包含有线性回归和多项式回归 简单来说,线性回归就是用多元一次方程拟合数据,多项式回归是用多元多次来拟合方程 在几何意义上看,线性回归拟合出的是直线,平面.多项式拟合出来的是曲线,曲面 ...