Spark的GPU支持方法研究

原创
2018/01/04 16:14
阅读数 8.2K

本文持续更新中,转载请注明来源:https://my.oschina.net/u/2306127/blog/1602291

为了使用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。

只有同时满足上面的条件,才能通过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

具体的资源包括:

展开阅读全文
打赏
1
4 收藏
分享
加载中
openthings博主

引用来自“山水依旧”的评论

你运行过IBMGPUenabler里面的例子吗?我运行GpuDSArrayMult,会出现这个问题,能帮忙看一下吗
Caused by: java.lang.NullPointerException
at com.ibm.gpuenabler.CUDAManager.cachedLoadModule(CUDAManager.scala:72)
at com.ibm.gpuenabler.CUDAManager.getModule(CUDAManager.scala:62)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$JCUDAIteratorImpl.processGPU(Unknown Source)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$JCUDAIteratorImpl.hasNext(Unknown Source)
at com.ibm.gpuenabler.MAPGPUExec$$anonfun$doExecute$1.apply(CUDADSUtils.scala:152)
at com.ibm.gpuenabler.MAPGPUExec$$anonfun$doExecute$1.apply(CUDADSUtils.scala:73)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndex$1$$anonfun$apply$26.apply(RDD.scala:844)
at
没用过呢,IBM这个项目好像已经停止更新了。
2018/11/20 16:40
回复
举报
你运行过IBMGPUenabler里面的例子吗?我运行GpuDSArrayMult,会出现这个问题,能帮忙看一下吗
Caused by: java.lang.NullPointerException
at com.ibm.gpuenabler.CUDAManager.cachedLoadModule(CUDAManager.scala:72)
at com.ibm.gpuenabler.CUDAManager.getModule(CUDAManager.scala:62)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$JCUDAIteratorImpl.processGPU(Unknown Source)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$JCUDAIteratorImpl.hasNext(Unknown Source)
at com.ibm.gpuenabler.MAPGPUExec$$anonfun$doExecute$1.apply(CUDADSUtils.scala:152)
at com.ibm.gpuenabler.MAPGPUExec$$anonfun$doExecute$1.apply(CUDADSUtils.scala:73)
at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsWithIndex$1$$anonfun$apply$26.apply(RDD.scala:844)
at
2018/11/20 14:43
回复
举报
更多评论
打赏
2 评论
4 收藏
1
分享
返回顶部
顶部