近些年来机器学习中的子领域深度学习成为一个热门的话题,特别是在围棋领域,谷歌的AlphaGo也使用了深度学习的技术。
在大数据领域,Spark MLlib是一个很流行的机器学习算法库,如果你想用Spark来做深度学习训练,MLlib还无法很好的支持。本文要介绍Intel开源的深度学习框架BigDL,他也是在Spark上的一个算法库,提供了全面的深度学习算法支持,包括数值计算(Tensor)和高阶神经网络等。
因为BigDL是在Spark上运行的,借助Spark平台的分布式扩展性,可以方便的扩展到上百或上千个节点。同时BigDL利用了Intel MKL等先进的数学计算库,基于Intel CPU计算能力可能取得媲美GPU的性能。
BigDL的使用场景
BigDL可能使用在下列场景中:
- 直接在Hadoop或Spark平台上使用深度学习进行大数据分析,同时数据是存储在HDFS、HBase、Hive等文件系统或数据库上;
- 希望在Spark程序或工作流中加入深度学习功能;
- 利用现有的 Hadoop/Spark 集群来运行深度学习程序,然后将代码与其他的Spark应用场景进行动态共享,例如ETL、数据仓库(Spark SQL)、功能引擎、经典机器学习(MLlib)、图分析(GraphX)等。
E-MapReduce
阿里云的EMR服务提供了全面的开源大数据组件的支持,比如Hadoop、Spark、HBase等。EMR提供了一个完整的Spark运行环境,所以BigDL也可以很方便的在EMR集群内运行。
BigDL安装
当前EMR还未直接支持BigDL,所以需要我们自己在EMR节点上编译和安装BigDL组件。在不久的未来,EMR上可能会直接安装BigDL,这样EMR用户就可以和Spark MLlib一样直接使用BigDL了。
- 通过SSH登录EMR Master节点,参考EMR文档
-
环境准备(我们假设EMR环境上的Spark是2.0.x)
- 下载并安装Maven
- 因为BigDL所在的Maven库需要用HTTPS连接,为了让OpenJDK支持,需要额外安装包:sudo yum install nss
-
参考BigDL build文档编译:
- git clone https://github.com/intel-analytics/BigDL.git
- cd BigDL
- bash make-dist.sh -P spark_2.0
如果上述过程执行成功,Build得到的BigDL/dist目录里有我们需要的运行环境,包括作业提交脚本和jar包等。
运行一个BigDL的样例
在BigDL在EMR的Master节点上安装好之后,我们可以来运行一个简单的深度学习算法(详情请参考BigDL官方文档)。这是一个在MNIST数据集上的LeNet-5模型训练算法,模型可以用来识别手写的数字。
- 数据准备,从http://yann.lecun.com/exdb/mnist/下载训练模型数据和测试数据特征文件以及label文件,并且解压缩放到本地的./data/mnist目录
- 创建模型的checkpoint目录./model/lenet_model
- 训练:
./dist/bin/bigdl.sh -- \
spark-submit \
--master yarn \
--executor-cores 2 \
--total-executor-cores 16 \
--driver-class-path dist/lib/bigdl-0.2.0-SNAPSHOT-jar-with-dependencies.jar \
--class com.intel.analytics.bigdl.models.lenet.Train \
dist/lib/bigdl-0.2.0-SNAPSHOT-jar-with-dependencies.jar \
-f ./data/mnist \
-b 128 \
--checkpoint ./model/lenet_model > traing.log
(更多的参数请参考BigDL文档)
这是在Spark上的作业,可以通过WebUI看到作业运行进度:
最后,测试训练结果:
./dist/bin/bigdl.sh -- \
spark-submit \
--master yarn \
--executor-cores 2 \
--total-executor-cores 16 \
--class com.intel.analytics.bigdl.models.lenet.Test \
dist/lib/bigdl-0.2.0-SNAPSHOT-jar-with-dependencies.jar \
-f ./data/mnist \
--model ./model/lenet_model \
-b 128 > test.log
traing.log和test.log文件分别包含了训练的过程和测试的结果。我们可以用分析工具(比如Linux Shell工具或微软的Excel)来分析结果数据,来更好的了解训练模型。
这是某次使用Lenet-5训练MNIST的结果:
总结
本文是深度学习框架BigDL的入门介绍,目的是在EMR上运行一个真实的深度学习算法。当然,你看可以基于BigDL框架实现自己的深度学习算法,或者使用EMR notebook(Apache Zeppelin或交互式工作台)直接使用分析和训练模型。你可以关注E-MapReduce产品博客获取更多的Spark和BigDL实践文章。