火花3.0内置支持GPU调度的示例分析

这篇文章将为大家详细讲解有关Spark 3.0内置支持GPU调度的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU、FPGA 或 TPU 来加速计算。在 Apache Hadoop 3.1 版本里面已经开始内置原生支持 GPU 和 FPGA 了。

Spark 3.0内置支持GPU调度的示例分析

作为通用计算引擎的 Spark 肯定也不甘落后,来自 Databricks、NVIDIA、Google 以及阿里巴巴的工程师们正在为 Apache Spark 添加原生的 GPU 调度支持,该方案填补了 Spark 在 GPU 资源的任务调度方面的空白,有机地融合了大数据处理和 AI 应用,扩展了 Spark 在深度学习、信号处理和各大数据应用的应用场景。

  • 这项工作的 issue 可以在 SPARK-24615 里面查看。

  • 相关的 SPIP(Spark Project Improvement Proposals) 文档可以参见 SPIP: Accelerator-aware scheduling。

Spark 3.0内置支持GPU调度的示例分析

目前 Apache Spark 支持的资源管理器 YARN 和 Kubernetes 已经支持了 GPU。为了让 Spark 也支持 GPUs,在技术层面上需要做出两个主要改变:

  • 在 cluster manager 层面上,需要升级 cluster managers 来支持 GPU。并且给用户提供相关 API,使得用户可以控制 GPU 资源的使用和分配。

  • 在 Spark 内部,需要在 scheduler 层面做出修改,使得 scheduler 可以在用户 task 请求中识别 GPU 的需求,然后根据 executor 上的 GPU 供给来完成资源分配。

因为让 Apache Spark 支持 GPU 是一个比较大的特性,所以项目分为了几个阶段。在 Apache Spark 3.0 版本,将支持在 standalone、 YARN 以及 Kubernetes 资源管理器下支持 GPU,并且对现有正常的作业基本没影响。对于 TPU 的支持、Mesos 资源管理器中 GPU 的支持、以及 Windows 平台的 GPU 支持将不是这个版本的目标。而且对于一张 GPU 卡内的细粒度调度也不会在这个版本支持;Apache Spark 3.0 版本将把一张 GPU 卡和其内存作为不可分割的单元。

1、Spark Scheduling

在这个层面,我们得允许从 RDD/PandasUDF API 中指定资源请求,这些请求应该在 DAGScheduler 中汇总。TaskSetManager 管理每个 Stage 挂起(pending)的任务,对于那些有 GPU 请求的任务,我们需要处理;对于那些不需要 GPU 的作业,其调度行为和效率应该和之前保持一致。

目前,CPUS_PER_TASK(spark.task.cpu)是一个int类型的全局配置,用于指定每个任务应分配的核心。为了支持GPU的配置,引入了spark.task。GPU参数用于指定每个任务需要申请的GPU数。如果用户没有指定spark.task。cpu或spark.task。gpu,那么火花程序将使用默认的值;因为需要向后兼容,所以如果用户没指定spark.task。cpu或spark.task。GPU,这两个参数的默认值分别为1和空。

对于ExecutorBackend,需要使得它可以识别和管理GPU,并且把这些信息同步(比如修改现有的RegisterExecutor类)到SchedulerBackend,然后SchedulerBackend可以根据这些GPU信息,为那些需要GPU资源的任务进行资源分配。

2,资源管理器

第一阶段将在独立的、纱线以及Kubernetes上支持GPU.Spark需要在这三种资源管理上面做一些工作。

独立

独立是引发内置的资源管理模式,但是目前的独立部署模式并不能支持GPU等资源。为了能识别GPU信息,一种可行的方法是在配置文件里面对GPU资源进行配置,工人通过读取这些配置信息,并在内存结构里面维护GPU和CPU等可用资源等信息。同时,在主上通过allocateWorkerResourceToExecutors方法对执行人申请的资源(包括GPU)进行分配。

为纱了能够在纱线上支持GPU,我们需要使用纱3.1.2 +版本;同时我们需要在纱集群上做出相关配置,使得纱启动了对GPU资源的支持,关于如何在纱线上配置GPU资源,请参见这里。

当为执行人申请容纱器时,火花需要在纱容器请求中将遗嘱执行人所需的GPU数量映射到纱线。io/gpu资源中.YARN具有gpu隔离机制,所以无论是否使用码头工人容器,对未分配给纱容器的gpu资源的使用将会被阻止。

需要注意的是,截至目前仅纱支持Nvidia gpu。

Kubernetes

火花3.0内置支持GPU调度的示例分析