引言:工作以来研究了一段时间的Spark利用GPU进行异构加速训练的的研究。下文是整理了网上一些常见的Spark结合GPU使用的方法。
为了使用Spark进行机器学习,支持GPU是必须的,上层再运行神经网络引擎。目前AWS\GCP和Databricks的云都已经支持GPU的机器学习,AliYun也在实验之中。
这包括几个层次:GPU直接支持Spark。因为Spark是多线程的,而GPU往往只能起一个单例,导致线程会竞争GPU资源,需要进行管理、加锁和调度。方法包括:
- 原生代码内置编译支持。
- 引入cuDNN等NVidia库进行调用。
- 通过Tensorflow等间接进行支持。
- JIT方式即时编译调用方式支持。
- GPU支持的Docker中运行Spark。如果将Spark节点放入Docker容器中运行,则需要使用NVidia提供的特殊版本Docker,而且需要安装NVidai提供的cuDNN等软件支持库。由于这些库调用了系统驱动,而且是C++编写,因此Spark要能够进行系统库的调用。
- GPU支持的Kubernetes之上运行Spark。在上面的基础上,支持GPU的Docker容器需要能够接受Kubernetes的管理和调度。参考:https://my.oschina.net/u/2306127/blog/1808304
只有同时满足上面的条件,才能通过Kubernetes的集群管理对Docker中Spark进行GPU操作。下面是已经做的一些研究。
- IBMSparkGPU的方案可以将GPU用于RDD和DataFrame,支持通用计算,重点支持机器学习;
- deeplearning4j是基于Java的,包含数值计算和神经网络,支持GPU;
- NUMBA的方案通过PySpark即时编译产生GPU的调用代码,兼容性好;
- Tensorflow/Caffe/MXNet等与Spark整合主要是节点调度,GPU由深度学习引擎调度,RDD需要数据交换,主要用于存储中间超参数数据。如TensorFrame的实-https://github.com/databricks/tensorframes
具体的资源包括:
只有同时满足上面的条件,才能通过Kubernetes的集群管理对Docker中Spark进行GPU操作。下面是已经做的一些研究。IBMSparkGPU的方案可以将GPU用于RDD和DataFrame,支持通用计算,重点支持机器学习;deeplearning4j是基于Java的,包含数值计算和神经网络,支持GPU;NUMBA的方案通过PySpark即时编译产生GPU的调用代码,兼容性好;Tensorflow/Caffe/MXNet等与Spark整合主要是节点调度,GPU由深度学习引擎调度,RDD需要数据交换,主要用于存储中间超参数数据。如TensorFrame的实现 https://github.com/databricks/tensorframes
具体的资源包括:
- https://github.com/databricks/spark-deep-learning,Deep Learning Pipelines for Apache Spark,直接支持Images的一些功能。
- http://www.spark.tc/simd-and-gpu/, Spark多种支持GPU方法。
- http://www.spark.tc/gpu-acceleration-on-apache-spark-2/,
GPU扩展 - https://my.oschina.net/u/2306127/blog/1602295, 同上。
- http://www.spark.tc/0-to-life-changing-app-new-apache-systemml-api-on-spark-shell/, systemML在Spark中使用。
- Continuum-Anaconda,NUMBA: A PYTHON JIT COMPILER,http://on-demand.gputechconf.com/gtc/2016/presentation/s6413-stanley-seibert-apache-spark-python.pdf
- http://spark.tc/why-you-should-be-using-apache-systemml-2/, 关于SystemML。
- 基于Java的神经网络深度学习系列库(支持GPU,https://deeplearning4j.org/),https://github.com/deeplearning4j
- https://github.com/IBMSparkGPU, 源码:https://github.com/IBMSparkGPU/GPUEnabler
- Spark Summit 2016 Talk by Jun Feng Liu (IBM) and Yonggang Hu (IBM)
https://databricks.com/session/gpu-support-in-spark-and-gpu-cpu-mixed-resource-scheduling-at-production-scale
https://www.slideshare.net/SparkSummit/gpu-support-in-spark-and-gpucpu-mixed-resource-scheduling-at-production-scale-63065895 - Hadoop, Spark, Deep Learning Mesh on Single GPU Cluster https://www.nextplatform.com/2016/02/24/hadoop-spark-deep-learning-mesh-on-single-gpu-cluster/
- IBM,关于GPU RDD的讨论
http://on-demand.gputechconf.com/gtc/2016/presentation/s6280-rajesh-bordawekar-accelerating-spark.pdf - GPU Computing with Apache Spark and Python
http://on-demand.gputechconf.com/gtc/2016/presentation/s6413-stanley-seibert-apache-spark-python.pdf - Spark ML Runs 10x Faster on GPUs, Databricks Says。https://www.datanami.com/2016/10/27/spark-ml-runs-faster-gpus/
目前楼主比较确定的结论是:
- Numba+Spark的架构真实可行,但GPU对计算的提速不尽人意
- GPUEnabler项目IBM已经停止维护,但仍然可以研究下,建议用Scala语言编写。GPUEnabler在yarn模式下,楼主未能运行成功。