要点综述
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
- 本地环境 - 在该模式中,可使用 –master=local[$NUM-OF_THREADS] 和 --env local标记来本地启动 BigDL 应用。例如,可在本地节点上启动 LeNet 模型训练:
- 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 独立集群—在该模式中,驱动程序作为外部客户端从本地启动。这是默认模式,用户可在客户端上查看应用的运行情况。
- 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
- 客户端部署模式 - 在该模式中,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 集群上的多个节点,训练模型所需的总时间大幅缩短。
参考
Spark on YARN – Cloudera Enterprise 5.10.x