在服务器集群上搭建BigDL环境
总阅读次
本文简要记述一下搭建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 安装
- Java 1.8.0_121
- Hadoop 2.7.2
- Spark 2.1.0
- 底层运算库MKL 2017.2.174
- apache-maven 3.3.9
- Scala 2.10.4
配置步骤
MAVEN调用本地库
考虑到服务器一般不能联网的原因,MAVEN无法到远程库获取依赖包,可以将已经下好的包传到Server,然后设置调用本地依赖包。过程如下,将自己Desktop最新的maven库文件(一般位于~/.m2)打包上传到Server,最好也命名为~/.m2,然后编辑$MAVEN_HOME/conf/settings.xml
, 在注释掉的localRepository那里加上下面一行:1
<localRepository>~/.m2/repository</localRepository>
即可。
配置Hadoop
如果已经配置过hadoop或者以前用过hadoop了,也可以不重新设置。
如果没有的话,那么按如下方法设置即可。
编辑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: to 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>编辑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 name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:hadooppath/hadoop-2.7.2 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>编辑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>编辑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>编辑
$HADOOP_HOME/etc/hadoop/slaves
,依次添加slaves的IP
配置Spark
- 编辑
$SPARK_HOME/conf/slaves
,依次添加slaves的IP - 编辑
$SPARK_HOME/conf/spark-env.sh
, 在尾部添加1
export SPARK_DIST_CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath)
分发环境
- 将上述安装过程在Slaves上都安装一遍,由于手动安装过程繁琐,没有技术含量,可以使用脚本安装。如果有需要可以提供笔者的脚本供参考。其中hadoop和Spark目录可以直接拷贝过去,就无需重新配置了。尽量保持Master和Slaves环境变量的一致,能够更快地部署。
启动集群
格式化namenode,然后启动所有datanode, namenode, resourcemanager, nodemanager等,即可运行BigDL程序了。
- hadoop namenode –format
$SPARK_HOME/sbin/start-all.sh, $HADOOP_HOME/sbin/start-all.sh
编译打包BigDL的jar包
bash make-dist.sh -P spark_2.0
,具体可参看Build Pagechmod +x dist/bin/bigdl.sh
示例程序
在BigDL-0.1.0上,基于CIFAR-10数据集运行RESNET20的示例运行命令如下:1
2
3
4
5
6
7
8dist/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
然后等待训练完成即可。