BigDL 运行 LeNet5 on MNIST 发现的 BUG

1. 部署Hadoop 2.8.3, Spark 2.1.0

2. 编译和部署BigDL

    编译command: ./make-dist.sh -P spark_2.x

3. 运行脚本LeNet5-on-MNIST-example.sh:

#!/bin/bash
$SPARK_HOME/bin/spark-submit \
    --master yarn \
    --deploy-mode client \
    --driver-memory 2g \
    --num-executors 6 \
    --executor-cores 1 \
    --executor-memory 10g \
    --driver-class-path ./bigdl-master/lib/bigdl-0.5.0-SNAPSHOT-jar-with-dependencies.jar \
    --class com.intel.analytics.bigdl.models.lenet.Train \
    ./bigdl-master/lib/bigdl-0.5.0-SNAPSHOT-jar-with-dependencies.jar \
    -f hdfs://hadoop1master:8020/BigDL/Dataset/MNIST \
    -b 60000 \
    -e 10 \

    --checkpoint /opt/modules/bigdl-master-angelps/checkpoint-models

4. 出现错误:

BigDL 运行 LeNet5 on MNIST 发现的 BUG

5. 发现原因

5.1 

DistriOptimizer.scala: 899 的代码是

val parameters = AllReduceParameter.newParameter(partitionNum, size)

java.lang.ExceptionInInitializerError表示在静态初始化块中出现了异常,这里的静态object就是AllReduceParameter

5.2

静态初始化块异常的代码是AllReduceParameter.scala:47

java.lang.IllegalArgumentException 表示变量出现了异常

再深入代码会发现抛出异常的代码位于 ThreadPoolExecutor.java

BigDL 运行 LeNet5 on MNIST 发现的 BUG

说明异常的原因是maximumPoolSize <= 0, 也就是ComputePoolSize <=0

5.3 

ComputePoolSize的计算方法为:

private val computePoolSize: Int = System.getProperty("bigdl.Parameter.computePoolSize",
  (Runtime.getRuntime().availableProcessors() / 2).toString).toInt

可以看出当user没有指定参数  bigdl.Parameter.computePoolSize 

以及机器的core = 1 (core = Runtime.getRuntime().availableProcessors() )

ComputePoolSize = 0

从而导致异常

6. 修改方法

private val computePoolSize: Int = Math.max(System.getProperty("bigdl.Parameter.computePoolSize",
  (Runtime.getRuntime().availableProcessors() / 2).toString).toInt, 1)

其他:

之前运行时出现过guava 版本冲突导致的错误

发现default情况下:

Hadoop2.8.3 的 guava 是 11.0.2

Spark2.1.0 的 guava 是 14.0.1

BigDL 的 guava 是 11.0.2

于是后来编译BigDL时把pom.xml 和 spark/dl/pom.xml 中的guava版本改为了14.0.1