文章目录
  1. 1. dependencies 安装
  2. 2. 配置步骤
    1. 2.1. MAVEN调用本地库
    2. 2.2. 配置Hadoop
    3. 2.3. 配置Spark
    4. 2.4. 分发环境
    5. 2.5. 启动集群
    6. 2.6. 编译打包BigDL的jar包
    7. 2.7. 示例程序

本文简要记述一下搭建BigDL运行环境的过程和一些需要注意的地方。
BigDL是Intel推出的一个基于Spark的深度学习框架,目前发布到0.1.0版本。
Github BigDL
BigDL提供了丰富的深度学习的支持,并且在Intel CPU(Xeon)上的性能表现优异,在单节点Xeon CPU上的性能能够媲美CPU,这也一定程度上归因于Intel针对BigDL的底层运算做了很多优化工作,我们都知道,一个GPU的价钱可以购买一台多Xeon CPU的服务器了,而且GPU服务器的用途相对单一,而买一台CPU服务器还能够干很多别的事情,其实对于很多中小公司来说,对GPU的需求并不是那么旺盛,所以在CPU上实现高性能的深度学习应用也显得非常重要。并且BigDL是基于Spark的,用户完全可以将其跑在已有的Spark集群上,部署成本很低。
更详细的介绍可以参考Github主页。

dependencies 安装

配置步骤

MAVEN调用本地库

考虑到服务器一般不能联网的原因,MAVEN无法到远程库获取依赖包,可以将已经下好的包传到Server,然后设置调用本地依赖包。过程如下,将自己Desktop最新的maven库文件(一般位于~/.m2)打包上传到Server,最好也命名为~/.m2,然后编辑$MAVEN_HOME/conf/settings.xml, 在注释掉的localRepository那里加上下面一行:

1
<localRepository>~/.m2/repository</localRepository>

即可。

配置Hadoop

如果已经配置过hadoop或者以前用过hadoop了,也可以不重新设置。
如果没有的话,那么按如下方法设置即可。

  1. 编辑core-site.xml,可进行如下配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <configuration>
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://xx.xx.xx.xx:9100</value>
    </property>
    <property>
    <name>hadoop.tmp.dir</name>
    <value>file:/path/to/hadoop/hadoop-2.7.2/tmp</value>
    </property>
    <property>
    <name>io.file.buffer.size</name>
    <value>131072</value>
    </property>
    <property>
    <name>hadoop.native.lib></name>
    <value>true</value>
    <description>Should native hadoop libraries,if present,be used</description> </property>
    </configuration>
  2. 编辑hdfs-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <configuration>
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file:hadooppath/hadoop-2.7.2/hdfs/name</value>
    </property>
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file:hadooppath/hadoop-2.7.2/hdfs/data</value>
    </property>
    <property>
    <name>dfs.replication</name>
    <value>3</value>
    </property>
    <property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>masterIP:9001</value>
    </property>
    <property>
    <name>dfs.namenode.servicerpc-address</name>
    <value>masterIP:10001</value>
    </property>
    <property>
    <name>dfs.webhdfs.enabled</name>
    <value>true</value>
    </property>
    <property>
    <name>dfs.datanode.address</name>
    <value>0.0.0.0:50011</value>
    <description>
    默认为50010, 是datanode的监听端口
    </description>
    </property>
    <property>
    <name>dfs.datanode.http.address</name>
    <value>0.0.0.0:50076</value>
    <description>
    默认为50075,为datanode的http server端口
    </description>
    </property>
    <property>
    <name>dfs.datanode.ipc.address</name>
    <value>0.0.0.0:50021</value>
    <description>
    默认为50020, 为datanode的ipc server端口
    </description>
    </property>
    </configuration>
  3. 编辑mapred-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <configuration>
    <property>
    <name>mapred.job.tracker</name>
    <value>master:9101</value>
    <description>
    job tracker运行的位置和端口
    </description>
    </property>
    <property>
    <name>mapred.task.tracker.http.address</name>
    <value>0.0.0.0:50061</value>
    <description>
    默认为50061, 是task tracker的http server端口
    </description>
    </property>
    <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.address</name>
    <value>masterIP:10020</value>
    </property>
    <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>masterIP:19888</value>
    </property>
    </configuration>
  4. 编辑yarn-site.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <configuration>
    <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    </property>
    <property>
    <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
    <name>yarn.resourcemanager.address</name>
    <value>masterIP:8032</value>
    </property>
    <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>masterIP:8030</value>
    </property>
    <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>masterIP:8031</value>
    </property>
    <property>
    <name>yarn.resourcemanager.admin.address</name>
    <value>masterIP:8033</value>
    </property>
    <property>
    <name>yarn.resourcemanager.webapp.address</name>
    <value>masterIP:8088</value>
    </property>
    <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>22528</value>
    </property>
    <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1500</value>
    </property>
    <property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
    </property>
    <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>16384</value>
    <discription>单个任务可申请最大内存,默认8192MB</discription>
    </property>

    <property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    </property>
    </configuration>
  5. 编辑$HADOOP_HOME/etc/hadoop/slaves,依次添加slaves的IP

配置Spark

  1. 编辑 $SPARK_HOME/conf/slaves,依次添加slaves的IP
  2. 编辑 $SPARK_HOME/conf/spark-env.sh, 在尾部添加
    1
    export SPARK_DIST_CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath)

分发环境

  1. 将上述安装过程在Slaves上都安装一遍,由于手动安装过程繁琐,没有技术含量,可以使用脚本安装。如果有需要可以提供笔者的脚本供参考。其中hadoop和Spark目录可以直接拷贝过去,就无需重新配置了。尽量保持Master和Slaves环境变量的一致,能够更快地部署。

启动集群

格式化namenode,然后启动所有datanode, namenode, resourcemanager, nodemanager等,即可运行BigDL程序了。

  1. hadoop namenode –format
  2. $SPARK_HOME/sbin/start-all.sh, $HADOOP_HOME/sbin/start-all.sh

编译打包BigDL的jar包

  1. bash make-dist.sh -P spark_2.0,具体可参看Build Page
  2. chmod +x dist/bin/bigdl.sh

示例程序

在BigDL-0.1.0上,基于CIFAR-10数据集运行RESNET20的示例运行命令如下:

1
2
3
4
5
6
7
8
dist/bin/bigdl.sh -- spark-submit \
--master yarn \
--driver-memory 6g --executor-memory 6g \
--num-executors 3 --executor-cores 8 \
--class com.intel.analytics.bigdl.models.resnet.Train \
dist/lib/bigdl-0.1.0-jar-with-dependencies.jar \
-f cifar-10/ --batchSize 480 --optnet true --depth 20 --classes 10 \
--shortcutType A --nEpochs 156 --learningRate 0.1 --cache model

然后等待训练完成即可。