BigDL – Apache Spark 集群上的大规模深度学习
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 任务的执行。
实验设置
虚拟 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
- 本地环境 – 在此模式下,使用 –master=local[$NUM-OF_THREADS] 和 --env *local* 标志在本地启动 BigDL 应用程序。例如,可以使用以下命令在本地节点上开始 LeNet 模型训练:
- 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 Standalone 集群(客户端部署模式)——在此模式下,驱动程序在本地作为外部客户端启动。这是默认模式,可以在客户端查看应用程序的进度。
- 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
- 客户端部署模式 - 在此模式下,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 训练的平均时间。
结论
在本文中,我们通过一个四节点虚拟 Hadoop 集群,验证了安装和使用 BigDL 在 Apache Spark 上训练和测试一些常用深度神经网络模型的步骤。我们展示了 BigDL 如何轻松地在现有的 Hadoop/Spark 集群上启用深度学习功能。模型训练的总时间可以大大缩短;首先,通过每个 Spark 任务中的 Intel MKL 和多线程编程的帮助,然后通过将 Spark 任务分发到 Hadoop/Spark 集群的多个节点上。
参考文献
Spark on YARN – Cloudera Enterprise 5.10.x
Deep Residual Learning for Image Recognition