您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Spark 3.0內置支持GPU調度的示例分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
如今大數(shù)據和機器學習已經有了很大的結合,在機器學習里面,因為計算迭代的時間可能會很長,開發(fā)人員一般會選擇使用 GPU、FPGA 或 TPU 來加速計算。在 Apache Hadoop 3.1 版本里面已經開始內置原生支持 GPU 和 FPGA 了。
作為通用計算引擎的 Spark 肯定也不甘落后,來自 Databricks、NVIDIA、Google 以及阿里巴巴的工程師們正在為 Apache Spark 添加原生的 GPU 調度支持,該方案填補了 Spark 在 GPU 資源的任務調度方面的空白,有機地融合了大數(shù)據處理和 AI 應用,擴展了 Spark 在深度學習、信號處理和各大數(shù)據應用的應用場景。
這項工作的 issue 可以在 SPARK-24615 里面查看。
相關的 SPIP(Spark Project Improvement Proposals) 文檔可以參見 SPIP: Accelerator-aware scheduling。
目前 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,并且對現(xiàn)有正常的作業(yè)基本沒影響。對于 TPU 的支持、Mesos 資源管理器中 GPU 的支持、以及 Windows 平臺的 GPU 支持將不是這個版本的目標。而且對于一張 GPU 卡內的細粒度調度也不會在這個版本支持;Apache Spark 3.0 版本將把一張 GPU 卡和其內存作為不可分割的單元。
在這個層面,我們得允許從 RDD/PandasUDF API 中指定資源請求,這些請求應該在 DAGScheduler 中匯總。TaskSetManager 管理每個 Stage 掛起(pending)的任務,對于那些有 GPU 請求的任務,我們需要處理;對于那些不需要 GPU 的作業(yè),其調度行為和效率應該和之前保持一致。
目前,CPUS_PER_TASK(spark.task.cpus)是一個 int 類型的全局配置,用于指定每個 task 應分配的 cores。為了支持 GPU 的配置,引入了 spark.task.gpus 參數(shù)用于指定每個 task 需要申請的 GPU 數(shù)。如果用戶沒有指定 spark.task.cpus 或 spark.task.gpus,那么 Spark 程序將使用默認的值;因為需要向后兼容,所以如果用戶沒指定 spark.task.cpus 或 spark.task.gpus,這兩個參數(shù)的默認值分別為 1 和 空。
對于 ExecutorBackend ,需要使得它可以識別和管理 GPU ,并且把這些信息同步(比如修改現(xiàn)有的 RegisterExecutor 類)到 SchedulerBackend,然后 SchedulerBackend 可以根據這些 GPU 信息,為那些需要 GPU 資源的 task 進行資源分配。
第一階段將在 Standalone、YARN 以及 Kubernetes 上支持 GPU。Spark 需要在這三種資源管理上面做一些工作。
Standalone 是 Spark 內置的資源管理模式,但是目前的 Standalone 部署模式并不能支持 GPU 等資源。為了能識別 GPU 信息,一種可行的方法是在配置文件里面對 GPU 資源進行配置, Worker 通過讀取這些配置信息,并在內存結構里面維護 GPU 和 CPU 等可用資源等信息。同時,在 Master 上通過 allocateWorkerResourceToExecutors 方法對 Executors 申請的資源(包括 GPU)進行分配。
為了能夠在 YARN 上支持 GPU,我們需要使用 YARN 3.1.2+ 版本;同時我們需要在 YARN 集群上做出相關配置,使得 YARN 啟動了對 GPU 資源的支持,關于如何在 YARN 上配置 GPU 資源,請參見這里。
當為 Executors 申請 YARN 容器時,Spark 需要在 YARN 容器請求中將 executor 所需的 GPU 數(shù)量映射到 yarn.io/gpu 資源中。YARN 具有 GPU 隔離機制,所以無論是否使用 Docker 容器, 對未分配給 YARN 容器的 GPU 資源的使用將會被阻止。
需要注意的是,截至目前 YARN 僅支持 Nvidia GPU。
從 Kubernetes 1.8 版本開始,Kubernetes 使用設備插件模型(device plugin model)來支持 GPU、高性能NIC,F(xiàn)PGA 等設備。目前 Kubernetes 支持 Nvidia 、AMD 和 Intel 的 GPU 設備。在 Spark + k8s 里面為 task 指定 GPU 的數(shù)量和在 Standalone 或 YARN 模式里面一樣。也是支持 spark.task.gpus 和 spark.executor.gpus 的全局配置,也支持在 RDD stage 中為每個 task 設置。
關于Spark 3.0內置支持GPU調度的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。