BigDL – Apache Spark* 集群上的横向扩展深度学习

要点综述

BigDL 是一种面向 Apache Spark* 的分布式深度学习库。用户可以通过 BigDL 将深度学习应用编写为标准的 Spark 程序,可以直接在现有的 Spark 或 Hadoop* 集群上运行。这有助于在现有的 Hadoop/Spark 集群上提供深度学习功能,并分析 HDFS*、HBase* 和 Hive* 中已经存在的数据。BigDL 的其他常见特性包括:

  • 丰富的深度学习支持。 Torch* 模仿, BigDL 为深度学习提供综合支持,包括数值计算(通过 Tensor)和高级神经网络;此外,用户可以利用 BigDL 将预训练 Caffe* 或 Torch 模型加载至 Spark 程序。
  • 极高的性能。 为了获得出色的性能,BigDL 将英特尔® 数学内核函数库(英特尔® MKL)和多线程编程应用到每个 Spark 任务中。因此,相比现成的开源Caffe、Torch 或 TensorFlow,BigDL 在单节点英特尔® 至强® 处理器上的运行速度高出多个数量级(即与主流 GPU 相当)。
  • 高效的横向扩展。 BigDL 通过 Apache Spark(一种极速分布式数据处理框架)实现高效横向扩展,执行大数据规模数据分析,在 Spark 上有效实施同步 SGD 和 all-reduce 通信。

图 1 显示了 BigDL 程序在现有 Spark 集群上的执行情况。在集群管理器和应用主进程或驱动程序的帮助下,Spark 任务可在 Spark 工作节点或容器(执行程序)间分布。英特尔 MKL 有助于 BigDL 更快地执行 Spark 任务。

图 1.BigDL 程序在 Spark* 集群上的执行情况。

试验设置

虚拟 Hadoop 集群

您可以参考面向 Apache Hadoop 的 Cloudera* 管理员培训指南,了解如何设置用于试验的四节点虚拟 Hadoop 集群,其中 YARN* 用作资源管理器。该集群上安装了独立 Spark 和 Spark on YARN。

Virtual Machine

Node_1

Node_2

Node_3

Node_4

Services

NameNode

Secondary NameNode

ResourceManager

JobHistoryServer

NodeManager

NodeManager

NodeManager

NodeManager

DataNode

DataNode

DataNode

DataNode

Spark Master

Spark Worker

Spark Worker

Spark Worker

Spark Worker

 

 

 

物理机(主机)– 系统配置

系统/主机处理器

英特尔® 至强® 处理器 E7-8890 v4 @ 2.20 GHz ;(4 插槽)

物理内核总数

96

主机内存

512 GB DDR-1600 MHz

Host OS

Linux*; 版本 3.10.0-327.el7.x86_64

Virtual Guests

4

虚拟机客户机 - 系统配置

系统/客户机处理器

英特尔® 至强® 处理器 E7-8890 v4 @ 2.20 GHz

物理内核

18

主机内存

96 GB DDR-1600 MHz

Host OS

Linux*; 版本 2.6.32-642.13.1.el6.x86_64

Java 版本

1.8.0_121

Spark 版本

1.6

Scala 版本

2.10.5

CDH 版本

5.10

BigDL 安装

前提条件

构建 BigDL 需要安装 Java* Java。最新版的 Java 可从Oracle 网站下载。运行 Spark 2.0 时,强烈建议使用 Java 8,否则可能会出现性能问题。

导出 JAVA_HOME=/usr/java/jdk1.8.0_121/

下载和构建 BigDL 需要安装 Maven* Apache Maven 软件管理工具。最新版的 Maven 可从Maven 网站下载和安装

wget http://mirrors.ibiblio.org/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
export M2_HOME=/home/training/Downloads/apache-maven-3.3.9
export PATH=${M2_HOME}/bin:$PATH
export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"

当使用 Java 7 进行编译时,你需要添加 “-XX:MaxPermSize=1G”,以避免出现 OutOfMemoryError。

export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m -XX:MaxPermSize=1G"

Building BigDL

下载 BigDL。BigDL 源代码位于GitHub*。

git clone https://github.com/intel-analytics/BigDL.git

强烈 建议您使用  make-dist.sh 脚本来构建 BigDL

bash make-dist.sh

这将借助实用程序脚本 (${BigDL_HOME}/dist/bin/bigdl.sh)创建目录 dist 以便设置 BigDL 环境,以及使用所需的 Spark 依赖性、Python* 和其它支持工具与库来创建打包的 JAR* 文件。

默认情况下,make-dist.sh 使用 Scala* 2.10 处理 Spark 1.5.x 或 1.6.x;使用 Scala 2.11 处理 Spark 2.0。有关构建 BigDL 的其他方法,请参考 BigDL 构建页面

BigDL 和 Spark 环境

BigDL 可与多种本地和集群环境结合使用,比如 Java、独立 Spark、Spark with Hadoop YARN 或 Amazon EC2 云。在这里,我们以 LeNet* 为例来介绍每种模式的不同之处。下文将向您介绍关于 LeNet 模型和使用方法的详细信息。

  • 本地 Java 应用 - 在该模式中,BigDL 可使用本地 Java 环境来启动应用。
    ${BigDL_HOME}/dist/bin/bigdl.sh -- java \
      -cp ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies-and-spark.jar \
       com.intel.analytics.bigdl.models.lenet.Train \
       -f $MNIST_DIR \
       --core 8 --node 1 \
       --env local -b 512 -e 1
  • 独立 Spark - 在该模式中,使用 Spark 自带的集群管理器,在运行 BigDL 的应用之间分配资源。
    • 本地环境 - 在该模式中,可使用 –master=local[$NUM-OF_THREADS] 和 --env local标记来本地启动 BigDL 应用。例如,可在本地节点上启动 LeNet 模型训练:
      ${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master local[16] \
        --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
        --class com.intel.analytics.bigdl.models.lenet.Train \
        ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
        -f $MNIST_DIR \
        --core 16 --node 1 \
        -b 512 -e 1 --env local
  • Spark 集群环境 - 在该模式中,可在集群环境中启动 BigDL 应用。在 Spark 集群中可以通过两种方式使用 BigDL,具体取决于驱动程序所部署的位置。
    • 客户端部署模式中的 Spark 独立集群—在该模式中,驱动程序作为外部客户端从本地启动。这是默认模式,用户可在客户端上查看应用的运行情况。
      ${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master spark://Node_1:7077 \
         --deploy-mode client --executor-cores 8 --executor-memory 4g --total-executor-cores 32 \
         --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
         --class com.intel.analytics.bigdl.models.lenet.Train \
         ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
         -f $MNIST_DIR \
         --core 8 --node 4 \
         -b 512 -e 1 --env spark
    • 集群部署模式中的 Spark 独立集群—在该模式中,驱动程序在其中一个工作节点上启动。您可以使用 webUI* 或 Spark 日志文件来追踪应用的进度。
      ${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master spark://Node_1:7077 \
        --deploy-mode cluster --executor-cores 8 --executor-memory 4g \
        --driver-cores 1 --driver-memory 4g --total-executor-cores 33 \
        --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
        --class com.intel.analytics.bigdl.models.lenet.Train \
         ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
         -f $MNIST_DIR \
         --core 8 --node 4 \
         -b 512 -e 1 --env spark
  • Spark(YARN 作为集群管理器) - 在该模式中,使用 Hadoop 的 YARN 集群管理器,在运行 BigDL 的应用之间分配资源。
    • 客户端部署模式 - 在该模式中,Spark 驱动程序在主机上运行,相关的任务也在该主机上提交。
      ${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master yarn \
        --deploy-mode client --executor-cores 16 --executor-memory 64g \
        --driver-cores 1 --driver-memory 4g --num-executors 4 \
        --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
        --class com.intel.analytics.bigdl.models.lenet.Train \
        ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
        -f $MNIST_DIR \
        --core 16 --node 4 \
        -b 512 -e 1 --env spark
    • 集群部署模式 - 在该模式中,Spark 驱动程序在 YARN 选择的集群主机上运行。
      ${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master yarn --deploy-mode cluster \
        --executor-cores 16 --executor-memory 64g \
        --driver-cores 1 --driver-memory 4g --num-executors 4 \
        --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
        --class com.intel.analytics.bigdl.models.lenet.Train \
        ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
        -f $MNIST_DIR \
        --core 16 --node 4 \
        -b 512 -e 1 --env spark
  • 在 Amazon EC2 上运行 - BigDL 团队提供了一个公用的 Amazon Machine Image* (AMI*) 文件,以便在 EC2 上试验 BigDL(在 Spark 上运行)。有关在 Amazon EC2 环境中设置在 Spark 上运行 BigDL 的详细信息,请参考GitHub

BigDL 示例模式

本教程展示了针对两个示例模式(LeNet 和 VGG*)的训练和测试,以便介绍如何将 BigDL 用于 Apache Spark 上的分布式深度学习。

LeNet

LeNet 5 是用于数值分类的典型 CNN 模式。如欲了解详情,请参考 http://yann.lecun.com/exdb/lenet/

MNIST* 数据库可从 http://yann.lecun.com/exdb/mnist/下载。下载图像和标签,以训练并验证数据。 

安装 BigDL 时会创建用于训练和测试示例 LeNet 模式的 JAR 文件。如果还未创建,请参考构建 BigDL章节的相关内容。

训练 LeNet 模型

下面是一个示例命令,展示了在 YARN 上使用 BigDL with Spark 来训练 LeNet 模型的情形:

${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master yarn \
  --deploy-mode cluster --executor-cores 16 --executor-memory 64g \
  --driver-cores 1 --driver-memory 4g --num-executors 4 \
  --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
  --class com.intel.analytics.bigdl.models.lenet.Train \
  ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
  -f $MNIST_DIR \
  --core 16 --node 4 \
  -b 512 -e 5 --env spark --checkpoint ~/models

用法:
LeNet 参数
  -f <value> | --folder <value>
        where you put the MNIST data
  -b <value> | --batchSize <value>
        batch size
  --model <value>
        model snapshot location
  --state <value>
        state snapshot location
  --checkpoint <value>
        where to cache the model
  -r <value> | --learningRate <value>
        learning rate
  -e <value> | --maxEpoch <value>
        epoch numbers
  -c <value> | --core <value>
        cores number on each node
  -n <value> | --node <value>
        node number to train the model
  -b <value> | --batchSize <value>
        batch size (currently this value should be multiple of (–-core * –-node)
  --overWrite
        overwrite checkpoint files
  --env <value>
        执行环境
YARN 参数
                --master yarn --deploy-mode cluster :在集群部署模式中使用 spark with YARN 集群管理器
       --executor-cores 16 --num-executors 4:这将设置执行器的数量以及每个执行器的内核数(面向 YARN),并使其与 LeNet 训练的 --core 和 –-node 参数相匹配。 这是一个确认存在的问题,因此需要使用 Spark 成功完成对 BigDL 的集群训练

测试 LeNet 模型

下面是一个示例命令,展示了在 YARN 上使用 BigDL with Spark 来测试 LeNet 模型的情形:

${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master yarn --deploy-mode cluster \
  --executor-cores 16 --executor-memory 64g \ 
  --driver-cores 1 --driver-memory 4g --num-executors 4 \
  --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
  --class com.intel.analytics.bigdl.models.lenet.Test \ 
  ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
  -f $MNIST_DIR \
  --core 16 --nodeNumber 4 \ 
  -b 512 --env spark --model ~/models/model.591

用法:
    -f <value> | --folder <value>
       where you put the MNIST data
  --model <value>
        model snapshot location (model.iteration#)
  -c <value> | --core <value>
        cores number on each node
  -n <value> | --nodeNumber <value>
        nodes number to train the model
  -b <value> | --batchSize <value>
        batch size
  --env <value>
        执行环境

请按照下面的操作快速检查模型准确性结果:

yarn logs -applicationId application_id | grep accuracy

请参考 Hadoop 集群 WebUI,了解关于此训练的更多信息。

CIFAR-10* 上的 VGG 模型

该实例展示了如何使用 BigDL 在 CIFAR-10* 数据集上训练和测试 VGG 这样的模型。有关该模式的详细信息,请参考这里

如欲下载 CIFAR-10 数据集的二进制版本,请点击这里

安装 BigDL 时会创建用于训练和测试示例 VGG 模式的 JAR 文件。如果还未创建,请参考构建 BigDL章节的相关内容。

训练 VGG 模型

下面是一个示例命令,展示了在 YARN 上使用 BigDL with Spark 来训练 CIFAR-10 数据集上的 VGG 模型的情形:

${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master yarn --deploy-mode cluster \ 
  --executor-cores 16 --executor-memory 64g \ 
  --driver-cores 1 --driver-memory 16g --num-executors 4 \ 
  --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
  --class com.intel.analytics.bigdl.models.vgg.Train \
  ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
  -f $VGG_DIR \
  --core 16 --node 4 \
  -b 512 -e 5 --env spark --checkpoint ~/models

用法:
  -f <value> | --folder <value>
        where you put the Cifar10 data
  --model <value>
        model snapshot location
  --state <value>
        state snapshot location
  --checkpoint <value>
        where to cache the model and state
  -c <value> | --core <value>
        cores number on each node
  -n <value> | --node <value>
        node number to train the model
  -e <value> | --maxEpoch <value>
        epoch numbers
  -b <value> | --batchSize <value>
        batch size
  --overWrite
        overwrite checkpoint files
  --env <value>
        执行环境

测试 VGG 模型

下面是一个示例命令,展示了在 YARN 上使用 BigDL with Spark 来测试 CIFAR-10 数据集上的 VGG 模型的情形:

${BigDL_HOME}/dist/bin/bigdl.sh -- spark-submit --master yarn \
  --deploy-mode cluster --executor-cores 16 --executor-memory 64g \ 
  --driver-cores 1 --driver-memory 16g --num-executors 4 \
  --driver-class-path ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
  --class com.intel.analytics.bigdl.models.vgg.Test \ 
  ${BigDL_HOME}/dist/lib/bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar \
  -f $VGG_DIR \
  --core 16 --nodeNumber 4 \
  -b 512 --env spark --model ~/models/model.491

用法:
  -f <value> | --folder <value>
        where you put the Cifar10 data
  --model <value>
        model snapshot location
  -c <value> | --core <value>
        cores number on each node
  -n <value> | --nodeNumber <value>
        nodes number to train the model
  -b <value> | --batchSize <value>
        batch size
  --env <value>
        执行环境

关于其他使用 BigDL 的示例模型的训练和测试的详细步骤,如循环神经网络 (RNN)、残差网络 (ResNet)、Inception*、Autoencoder* 等,请访问BigDL GitHub网站。

BigDL 还可用于将预训练 Torch 和 Caffe 模型加载至 Spark 程序,以进行分类和预测。请访问BigDL GitHub网站,查看相关的示例。

性能扩展

图 2 展示了通过增加内核和节点数量(根据当前设置的虚拟节点),使用 BigDL on Spark 实现的 VGG 和 ResNet 模型训练性能的扩展。在此处,我们在 5 个时间点上比较了在 CIFAR-10 数据集上训练这两种模型的时间。

图 2:在 YARN 上运行时使用 BigDL on Spark 实现的 VGG 和 ResNet 性能扩展。

结论

在本文中,我们讨论了如何安装 BigDL,以及如何在四节点虚拟 Hadoop 集群上使用 BigDL 来训练部分常用的深度神经网络模型(在 Apache Spark 上运行)。我们看到了 BigDL 能够轻松地在现有 Hadoop/Spark 集群上支持深度学习功能。 借助每个 Spark 任务中的英特尔 MKL 和多线程编程,以及将 Spark 任务分配至 Hadoop/Spark 集群上的多个节点,训练模型所需的总时间大幅缩短。

参考

BigDL GitHub

Apache Spark

Spark on YARN – Cloudera Enterprise 5.10.x

LeNet/MNIST

Torch 中的 VGG on CIFAR-10

面向图像识别的深度残差学习

CIFAR-10 数据集

BigDL:Apache Spark 上的分布式深度学习

BigDL:已知问题

面向 Apache Hadoop 的 Cloudera 管理员培训

Cloudera Archive – CDH 5.10

Java SE 下载套件

VirtualBox

Para obtener información más completa sobre las optimizaciones del compilador, consulte nuestro Aviso de optimización.