65.9K
CodeProject 正在变化。 阅读更多。
Home

BigDL – Apache Spark 集群上的大规模深度学习

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2017年4月12日

CPOL

8分钟阅读

viewsIcon

17690

BigDL 是一个用于 Apache Spark 的分布式深度学习库。使用 BigDL,用户可以将深度学习应用程序编写为标准的 Spark 程序,并直接在现有的 Spark 或 Hadoop 集群上运行。

摘要

BigDL 是一个用于 Apache Spark* 的分布式深度学习库。使用 BigDL,用户可以将深度学习应用程序编写为标准的 Spark 程序,并直接在现有的 Spark 或 Hadoop* 集群上运行。这使得在现有的 Hadoop/Spark 集群上实现深度学习功能,并分析 HDFS*、HBase*、Hive* 等中已存在的数据成为可能。BigDL 的其他常见功能包括:

  • 丰富的深度学习支持。 BigDL 以 Torch* 为模型,提供了全面的深度学习支持,包括数值计算(通过 Tensor)和高级神经网络;此外,用户还可以使用 BigDL 将预训练的 Caffe* 或 Torch 模型加载到 Spark 程序中。
  • 极高的性能。 为实现高​​性能,BigDL 在每个 Spark 任务中都使用了 Intel® Math Kernel Library (Intel® MKL) 和多线程编程。因此,在单节点 Intel® Xeon® 处理器上,其速度比开箱即用的开源 Caffe、Torch 或 TensorFlow 快几个数量级(即,与主流 GPU 相当)。
  • 高效的横向扩展。 BigDL 可以通过利用 Apache Spark(一个闪电般快速的分布式数据处理框架)以及在 Spark 上同步 SGD 和 all-reduce 通信的高效实现,来有效地横向扩展以执行“大数据规模”的数据分析。

图 1 展示了 BigDL 程序在现有 Spark 集群上执行的基本概述。借助集群管理器和应用程序主进程或驱动程序,Spark 任务被分发到 Spark 工作节点或容器(执行器)上。BigDL 通过使用 Intel MKL 加速 Spark 任务的执行。

图 1. BigDL 程序在 Spark* 集群上运行的基本概述。

实验设置

虚拟 Hadoop 集群

参考 Cloudera* 管理员培训指南,为 Apache Hadoop 配置了一个实验性的四节点虚拟 Hadoop 集群,并将 YARN* 作为资源管理器。集群上同时安装了 Standalone Spark 和 Spark on YARN。

虚拟机

节点_1

节点_2

节点_3

节点_4

服务

NameNode

Secondary NameNode

ResourceManager

JobHistoryServer

NodeManager

NodeManager

NodeManager

NodeManager

DataNode

DataNode

DataNode

DataNode

Spark Master

Spark Worker

Spark Worker

Spark Worker

Spark Worker

 

 

 

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

系统/主机处理器

Intel® Xeon® 处理器 E7-8890 v4 @ 2.20 GHz(4 插槽)

总物理核心数

96

主机内存

512 GB DDR-1600 MHz

主机操作系统

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

虚拟客户机

4

虚拟机客户机 - 系统配置

系统/客户机处理器

Intel® Xeon® 处理器 E7-8890 v4 @ 2.20 GHz

物理核心数

18

主机内存

96 GB DDR-1600 MHz

主机操作系统

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 安装

必备组件

Java* 编译 BigDL 需要 Java。可以从 Oracle 网站 下载最新版本的 Java。强烈建议在使用 Spark 2.0 时使用 Java 8;否则,您可能会遇到性能问题。

 export JAVA_HOME=/usr/java/jdk1.8.0_121/

Maven* Apache Maven 作为软件管理工具,需要下载和编译 BigDL。可以从 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”,以避免在将 BigDL 与 Java 7 一起使用时出现 OutOfMemoryError。

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

编译 BigDL

下载 BigDL。BigDL 源代码可在 GitHub* 上获得。

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

强烈建议使用 make-dist.sh 脚本 来编译 BigDL。

bash make-dist.sh

这将创建一个 dist 目录,其中包含用于设置 BigDL 环境的实用脚本(${BigDL_HOME}/dist/bin/bigdl.sh)以及用于 Spark、Python* 等支持工具和库的打包 JAR* 文件。

默认情况下,make-dist.sh 对 Spark 1.5.x 或 1.6.x 使用 Scala* 2.10,对 Spark 2.0 使用 Scala 2.11。在 BigDL 的 构建页面 上发布了其他编译 BigDL 的方法。

BigDL 和 Spark 环境

BigDL 可以通过 Java、Standalone Spark、Spark with Hadoop YARN 或 Amazon EC2 云,在各种本地和集群环境中进行使用。在此,我们将以 LeNet* 为例来解释和区分每种模式。关于 LeNet 模型和用法的详细信息将在后续章节中介绍。

  • 本地 Java 应用程序 – 在此模式下,可以使用本地 Java 环境通过 BigDL 启动应用程序。
    ${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 Standalone – 在此模式下,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 应用程序在集群环境中启动。根据驱动程序的部署位置,BigDL 可以在 Spark 集群环境中以两种方式使用。
    • Spark Standalone 集群(客户端部署模式)——在此模式下,驱动程序在本地作为外部客户端启动。这是默认模式,可以在客户端查看应用程序的进度。
      ${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 Standalone 集群(集群部署模式) - 在此模式下,驱动程序在一个工作节点上启动。您可以使用 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 with 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 上使用 Spark 实验 BigDL。有关在 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 模型

使用 BigDL 和在 YARN 上运行的 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

Usage:
LeNet parameters
  -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>
        execution environment
YARN parameters
                --master yarn --deploy-mode cluster : Using spark with YARN cluster manager in cluster deployment mode
       --executor-cores 16 --num-executors 4: This sets the number of executors and cores per executor for YARN to match with --core and –-node parameters for LeNet training. Currently this is a known issue and hence required for successful cluster training with BigDL using Spark

测试 LeNet 模型

使用 BigDL 和在 YARN 上运行的 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

Usage:
    -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>
        execution environment

为了快速验证,模型准确性的结果如下所示:

yarn logs -applicationId application_id | grep accuracy

有关此训练的更多信息,请参阅 Hadoop 集群 WebUI。

CIFAR-10* 上的 VGG 模型

此示例演示了使用 BigDL 在 CIFAR-10* 数据集上训练和测试 VGG 类模型的用法。有关此模型的详细信息可在 此处 找到。

您可以从 此处 下载 CIFAR-10 数据集的二进制版本。

作为 BigDL 安装的一部分,会创建一个用于训练和测试示例 VGG 模型的 JAR 文件。如果尚未创建,请参阅 编译 BigDL 部分。

训练 VGG 模型

使用 BigDL 和在 YARN 上运行的 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

Usage:
  -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>
        execution environment

测试 VGG 模型

使用 BigDL 和在 YARN 上运行的 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

Usage:
  -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>
        execution environment

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

BigDL 还可用于将预训练的 Torch 和 Caffe 模型加载到 Spark 程序中进行分类或预测。其中一个示例展示在 BigDL GitHub 网站上。

性能扩展

图 2 展示了使用 BigDL 在 Spark 上训练 VGG 和 ResNet 模型在增加核心数和节点数(根据当前设置的虚拟节点)时的性能扩展。在这里,我们比较了在 CIFAR-10 数据集上对两个模型进行五个 epoch 训练的平均时间。

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

结论

在本文中,我们通过一个四节点虚拟 Hadoop 集群,验证了安装和使用 BigDL 在 Apache Spark 上训练和测试一些常用深度神经网络模型的步骤。我们展示了 BigDL 如何轻松地在现有的 Hadoop/Spark 集群上启用深度学习功能。模型训练的总时间可以大大缩短;首先,通过每个 Spark 任务中的 Intel MKL 和多线程编程的帮助,然后通过将 Spark 任务分发到 Hadoop/Spark 集群的多个节点上。

参考文献

BigDL GitHub

Apache Spark

Spark on YARN – Cloudera Enterprise 5.10.x

LeNet/MNIST

VGG on CIFAR-10 in Torch

Deep Residual Learning for Image Recognition

CIFAR-10 数据集

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

BigDL:已知问题

Cloudera Administrator Training for Apache Hadoop

Cloudera Archive – CDH 5.10

Java SE Download Kit

VirtualBox

© . All rights reserved.