关于Spark 集群中调度GPU的一些实验

自己毕设做了一些Spark 调用GPU 相关的实验,自己也在网上找到了一些资料,也写下来分享一些自己的做法。

目前Spark(2.3) 还不支持直接调用GPU , 需要自己通过JNI的方式实现调用GPU来做一些加速计算。通常是自己定义好接口,在用NVCC生成动态链接库,然后在Spark中调用。

自己做的一些尝试

1.通过Docker 做到 GPU 容器化,虚拟化。若GPU支持MPS,建议开启MPS。 一个容器成为一个Spark计算节点。

2.为了更好的扩展和调度,采用上面的镜像。在K8S中建立Spark集群,可以通过副本集快速扩容。

3.可以预估单个计算任务,需要的资源,合理的指定每个GPU node 部署的 单个SparkGPU容器的数量。若需要更细粒度的管理每个容器分配的GPU资源,可以查看阿里云开源的一个K8S插件,支持MB级别的分配(https://github.com/nvidia/k8s-device-plugin)

4.总结起来就是,我做的是把每张不同的GPU卡,通过Docker虚拟化做到细粒度的量化,因为每张卡的计算能力不同,这样可以通过K8S,快速给不同的节点部署不同个数的容器实例,在容器实例中启动Spark,再对saprk层面做公平的计算分配。