0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spark 3.4用于分布式模型訓(xùn)練和大規(guī)模模型推理

jf_pJlTbmA9 ? 來(lái)源:NVIDIA ? 作者:NVIDIA ? 2023-07-05 16:30 ? 次閱讀

Apache Spark是一個(gè)業(yè)界領(lǐng)先的平臺(tái),用于大規(guī)模數(shù)據(jù)的分布式提取、轉(zhuǎn)換和加載( ETL )工作負(fù)載。隨著深度學(xué)習(xí)( DL )的發(fā)展,許多 Spark 從業(yè)者試圖將 DL 模型添加到他們的數(shù)據(jù)處理管道中,以涵蓋各種用例,如銷售預(yù)測(cè)、內(nèi)容推薦、情緒分析和欺詐檢測(cè)。

然而,結(jié)合 DL 培訓(xùn)和推理,從歷史上看,大規(guī)模數(shù)據(jù)一直是 Spark 用戶面臨的挑戰(zhàn)。大多數(shù) DL 框架都是為單節(jié)點(diǎn)環(huán)境設(shè)計(jì)的,它們的分布式訓(xùn)練和推理 API 通常是經(jīng)過(guò)深思熟慮后添加的。

為了解決單節(jié)點(diǎn) DL 環(huán)境和大規(guī)模分布式環(huán)境之間的脫節(jié),有多種第三方解決方案,如 Horovod-on-Spark、TensorFlowOnSpark 和 SparkTorch,但由于這些解決方案不是在 Spark 中本地構(gòu)建的,因此用戶必須根據(jù)自己的需求評(píng)估每個(gè)平臺(tái)。

隨著 Spark 3.4 的發(fā)布,用戶現(xiàn)在可以訪問(wèn)內(nèi)置的 API,用于分布式模型訓(xùn)練和大規(guī)模模型推理,如下所述。

分布式培訓(xùn)

對(duì)于分布式培訓(xùn),有一個(gè)新的 TorchDistributor PyTorch 的 API,它遵循 spark-tensorflow-distributorTensorFlow 的 API。這些 API 通過(guò)利用 Spark 的屏障執(zhí)行模式,在 Spark executors 上生成分布式 DL 集群節(jié)點(diǎn),從而簡(jiǎn)化了將分布式 DL 模型訓(xùn)練代碼遷移到 Spark 的過(guò)程。

一旦 Spark 啟動(dòng)了 DL 集群,控制權(quán)就基本上通過(guò)main_fn傳遞給TorchDistributorAPI

如下面的代碼所示,使用這個(gè)新的 API 在 Spark 上運(yùn)行標(biāo)準(zhǔn)的分布式 DL 培訓(xùn)只需要進(jìn)行最小的代碼更改。

from pyspark.ml.torch.distributor import TorchDistributor

def main_fn(checkpoint_dir):
    # standard distributed PyTorch code
    ...

# Set num_processes = NUM_WORKERS * NUM_GPUS_PER_WORKER
output_dist = TorchDistributor(num_processes=2, local_mode=False, use_gpu=True).run(main_fn, checkpoint_dir)

一旦啟動(dòng),運(yùn)行在執(zhí)行器上的流程就依賴于其各自 DL 框架的內(nèi)置分布式訓(xùn)練 API 。將現(xiàn)有的分布式訓(xùn)練代碼移植到 Spark 應(yīng)該很少或不需要修改。然后,這些進(jìn)程可以在訓(xùn)練期間相互通信,還可以直接訪問(wèn)與 Spark 集群相關(guān)的分布式文件系統(tǒng)(圖 1 )。

distributed-training-torchdistributor-api-diagram.png 圖 1 。分布式培訓(xùn)使用TorchDistributorAPI

然而,這種遷移的方便性也意味著這些 API 不使用 Spark RDD 或 DataFrames 進(jìn)行數(shù)據(jù)傳輸。雖然這消除了在 Spark 和 DL 框架之間轉(zhuǎn)換或序列化數(shù)據(jù)的任何需要,但它也要求在啟動(dòng)訓(xùn)練作業(yè)之前完成任何 Spark 預(yù)處理并持久化到存儲(chǔ)中。主要訓(xùn)練功能可能還需要適于從分布式文件系統(tǒng)而不是本地存儲(chǔ)讀取。

分布式推理

對(duì)于分布式推理,有一個(gè)新的predict_batch_udfAPI ,它建立在Spark Pandas UDF以便為 DL 模型推斷提供更簡(jiǎn)單的接口。 pandas 與基于行的 UDF 相比, UDF 提供了一些優(yōu)勢(shì),包括通過(guò)Apache Arrow以及通過(guò)Pandas。有關(guān)詳細(xì)信息,請(qǐng)參閱Introducing Pandas UDF for PySpark.

然而,盡管 pandas UDF API 可能是 ETL 用例的一個(gè)很好的解決方案,但它仍然不適合 DL 推理用例。首先, pandas UDF API 將數(shù)據(jù)表示為 pandas 系列或數(shù)據(jù)幀,這同樣適用于執(zhí)行 ETL 操作,如選擇、排序、數(shù)學(xué)轉(zhuǎn)換和聚合。

然而,大多數(shù) DL 框架都期望NumPy數(shù)組或標(biāo)準(zhǔn) Python 數(shù)組作為輸入,這些數(shù)組通常由自定義張量變量包裝。因此,pandas UDF 實(shí)現(xiàn)至少需要將傳入的 pandas 數(shù)據(jù)轉(zhuǎn)換為 NumPy 數(shù)組。不過(guò),根據(jù)用例和數(shù)據(jù)集的不同,準(zhǔn)確的轉(zhuǎn)換可能會(huì)有很大的差異。

其次, pandas UDF API 通常在數(shù)據(jù)分區(qū)上運(yùn)行,數(shù)據(jù)分區(qū)的大小由數(shù)據(jù)集的原始寫入者或分布式文件系統(tǒng)決定。因此,很難對(duì)傳入的數(shù)據(jù)進(jìn)行適當(dāng)?shù)呐幚硪赃M(jìn)行優(yōu)化計(jì)算。

最后,仍然存在在 Spark 執(zhí)行器和任務(wù)之間加載 DL 模型的問(wèn)題。在正常的 Spark ETL 工作中,工作負(fù)載遵循函數(shù)編程范式,其中可以對(duì)數(shù)據(jù)應(yīng)用無(wú)狀態(tài)函數(shù)。然而,對(duì)于 DL 推理,預(yù)測(cè)函數(shù)通常需要從磁盤加載其 DL 模型權(quán)重。

Spark 具有通過(guò)任務(wù)序列化和廣播變量將變量從驅(qū)動(dòng)程序序列化到執(zhí)行器的能力。然而,這兩者都依賴于 Python pickle 序列化,這可能不適用于所有 DL 模型。此外,如果操作不當(dāng),加載和序列化非常大的模型可能會(huì)帶來(lái)極高的性能成本。

解決當(dāng)前限制

為了解決這些問(wèn)題predict_batch_udf引入了以下方面的標(biāo)準(zhǔn)化代碼:

將 Spark 數(shù)據(jù)幀轉(zhuǎn)換為 NumPy 數(shù)組,因此最終用戶 DL 推理代碼不需要從 pandas 數(shù)據(jù)幀進(jìn)行轉(zhuǎn)換。

為 DL 框架批處理傳入的 NumPy 數(shù)組。

在執(zhí)行器上加載模型,避免了任何模型序列化問(wèn)題,同時(shí)利用 Sparkspark.python.worker.reuse配置以在 Spark 執(zhí)行器中緩存模型。

下面的代碼演示了這個(gè)新的 API 如何隱藏將 DL 推理代碼轉(zhuǎn)換為 Spark 的復(fù)雜性。用戶只需定義make_predict_fn函數(shù),使用標(biāo)準(zhǔn)的 DL API 加載模型并返回predict作用然后predict_batch_udf函數(shù)生成一個(gè)標(biāo)準(zhǔn)PandasUDF,負(fù)責(zé)處理幕后的其他一切。

from pyspark.ml.functions import predict_batch_udf

def make_predict_fn():
    # load model from checkpoint
    import torch    
    device = torch.device("cuda")
    model = Net().to(device)
    checkpoint = load_checkpoint(checkpoint_dir)
    model.load_state_dict(checkpoint['model'])

    # define predict function in terms of numpy arrays
    def predict(inputs: np.ndarray) -> np.ndarray:
        torch_inputs = torch.from_numpy(inputs).to(device)
        outputs = model(torch_inputs)
        return outputs.cpu().detach().numpy()
    
    return predict

# create standard PandasUDF from predict function
mnist = predict_batch_udf(make_predict_fn,
                          input_tensor_shapes=[[1,28,28]],
                          return_type=ArrayType(FloatType()),
                          batch_size=1000)

df = spark.read.parquet("/path/to/test/data")
preds = df.withColumn("preds", mnist('data')).collect()

請(qǐng)注意,此 API 使用標(biāo)準(zhǔn) Spark DataFrame 進(jìn)行推斷,因此執(zhí)行器將從分布式文件系統(tǒng)讀取數(shù)據(jù)并將該數(shù)據(jù)傳遞給predict函數(shù)(圖 2 )。這也意味著,根據(jù)需要,數(shù)據(jù)的任何處理都可以與模型預(yù)測(cè)一起進(jìn)行。

還要注意,這是一個(gè)data-parallel體系結(jié)構(gòu),其中每個(gè)執(zhí)行器加載模型并對(duì)數(shù)據(jù)集的各自部分進(jìn)行預(yù)測(cè),因此模型必須適合執(zhí)行器內(nèi)存。

distributed-inference-predict_batch_udf-api-diagram.png 圖 2 :分布式推理使用predict_batch_udfAPI

Spark 深度學(xué)習(xí)的端到端示例

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4989

    瀏覽量

    103074
  • 人工智能
    +關(guān)注

    關(guān)注

    1791

    文章

    47282

    瀏覽量

    238534
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5503

    瀏覽量

    121175
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    名單公布!【書(shū)籍評(píng)測(cè)活動(dòng)NO.30】大規(guī)模語(yǔ)言模型:從理論到實(shí)踐

    。 為了使更多的自然語(yǔ)言處理研究人員和對(duì)大語(yǔ)言模型感興趣的讀者能夠快速了解大模型的理論基礎(chǔ),并開(kāi)展大模型實(shí)踐,復(fù)旦大學(xué)張奇教授團(tuán)隊(duì)結(jié)合他們?cè)谧匀徽Z(yǔ)言處理領(lǐng)域的研究經(jīng)驗(yàn),以及分布式系統(tǒng)和
    發(fā)表于 03-11 15:16

    【大語(yǔ)言模型:原理與工程實(shí)踐】揭開(kāi)大語(yǔ)言模型的面紗

    文本生成,根據(jù)提示或上下文生成連貫、富有創(chuàng)造性的文本,為故事創(chuàng)作等提供無(wú)限可能。大語(yǔ)言模型也面臨挑戰(zhàn)。一方面,其計(jì)算資源需求巨大,訓(xùn)練推理耗時(shí);另一方面,模型高度依賴數(shù)據(jù),需要
    發(fā)表于 05-04 23:55

    【大語(yǔ)言模型:原理與工程實(shí)踐】大語(yǔ)言模型的基礎(chǔ)技術(shù)

    概率推斷,利用共現(xiàn)矩陣學(xué)習(xí)每個(gè)詞的主題分布,進(jìn)而將其作為詞的表示向量。在大規(guī)模語(yǔ)料庫(kù)中進(jìn)行模型訓(xùn)練,使語(yǔ)義相似的詞具有相似的主題分布。然而,
    發(fā)表于 05-05 12:17

    分布式對(duì)象調(diào)試中的事件模型

    針對(duì)事件的分布式程序調(diào)試過(guò)程中,需處理大量的事件消息,如果處理不當(dāng),則會(huì)影響分布式程序的執(zhí)行,提出了一種分布式對(duì)象中的事件模型,采用這種模型
    發(fā)表于 12-10 17:29 ?8次下載

    基于代理模型分布式聚類算法

    II DDM模型是現(xiàn)有的分布式聚類模型中性能較好的一種個(gè)體合作以及串行工作方式固有的不足,在該模型基礎(chǔ)上引入分層的思想,提出了一種新的分布式
    發(fā)表于 09-16 14:08 ?0次下載
    基于代理<b class='flag-5'>模型</b>的<b class='flag-5'>分布式</b>聚類算法

    大規(guī)模分布式機(jī)器學(xué)習(xí)系統(tǒng)分析

    ,通過(guò)對(duì)比三款開(kāi)源分布式LDA系統(tǒng)-Spark LDA、PLDA+和LightLDA,在系統(tǒng)資源消耗、算法收斂性能和可擴(kuò)展性等方面的表現(xiàn),分析各系統(tǒng)在設(shè)計(jì)、實(shí)現(xiàn)和性能上的差異。實(shí)驗(yàn)結(jié)果表明:面對(duì)小規(guī)模的樣本集和
    發(fā)表于 12-05 19:02 ?0次下載
    <b class='flag-5'>大規(guī)模</b><b class='flag-5'>分布式</b>機(jī)器學(xué)習(xí)系統(tǒng)分析

    實(shí)現(xiàn) TensorFlow 架構(gòu)的規(guī)模性和靈活性

    TensorFlow 是為了大規(guī)模分布式訓(xùn)練推理而設(shè)計(jì)的,不過(guò)它在支持新機(jī)器學(xué)習(xí)模型和系統(tǒng)級(jí)優(yōu)化的實(shí)驗(yàn)中的表現(xiàn)也足夠靈活。
    的頭像 發(fā)表于 01-26 14:48 ?2811次閱讀
    實(shí)現(xiàn) TensorFlow 架構(gòu)的<b class='flag-5'>規(guī)模</b>性和靈活性

    如何向大規(guī)模預(yù)訓(xùn)練語(yǔ)言模型中融入知識(shí)?

    本文關(guān)注于向大規(guī)模預(yù)訓(xùn)練語(yǔ)言模型(如RoBERTa、BERT等)中融入知識(shí)。
    的頭像 發(fā)表于 06-23 15:07 ?4245次閱讀
    如何向<b class='flag-5'>大規(guī)模</b>預(yù)<b class='flag-5'>訓(xùn)練</b>語(yǔ)言<b class='flag-5'>模型</b>中融入知識(shí)?

    Google Brain和DeepMind聯(lián)手發(fā)布可以分布式訓(xùn)練模型的框架

    。 正如吳恩達(dá)所言,當(dāng)代機(jī)器學(xué)習(xí)算法的成功很大程度上是由于模型和數(shù)據(jù)集大小的增加,在大規(guī)模數(shù)據(jù)下進(jìn)行分布式訓(xùn)練也逐漸變得普遍,而如何在大規(guī)模
    的頭像 發(fā)表于 06-26 15:42 ?2250次閱讀
    Google Brain和DeepMind聯(lián)手發(fā)布可以<b class='flag-5'>分布式</b><b class='flag-5'>訓(xùn)練</b><b class='flag-5'>模型</b>的框架

    如何使用TensorFlow進(jìn)行大規(guī)模分布式的QML模擬

    中,我們將逐步帶您了解如何使用 TensorFlow 和 TensorFlow Quantum 進(jìn)行大規(guī)模分布式
    的頭像 發(fā)表于 08-10 17:31 ?2636次閱讀

    超大Transformer語(yǔ)言模型分布式訓(xùn)練框架

    NVIDIA Megatron 是一個(gè)基于 PyTorch 的框架,用于訓(xùn)練基于 Transformer 架構(gòu)的巨型語(yǔ)言模型。本系列文章將詳細(xì)介紹Megatron的設(shè)計(jì)和實(shí)踐,探索這一框架如何助力
    的頭像 發(fā)表于 10-11 16:46 ?2692次閱讀
    超大Transformer語(yǔ)言<b class='flag-5'>模型</b>的<b class='flag-5'>分布式</b><b class='flag-5'>訓(xùn)練</b>框架

    探究超大Transformer語(yǔ)言模型分布式訓(xùn)練框架

    。 優(yōu)化的分布式集群架構(gòu):NVIDIA DGX SuperPOD 有了高效的分布式訓(xùn)練框架,自然也需要優(yōu)化的分布式訓(xùn)練集群。 NVIDIA
    的頭像 發(fā)表于 10-20 09:25 ?2441次閱讀

    DGX SuperPOD助力助力織女模型的高效訓(xùn)練

      “強(qiáng)悍的織女模型在京東探索研究院建設(shè)的全國(guó)首個(gè)基于 DGX SuperPOD 架構(gòu)的超大規(guī)模計(jì)算集群 “天琴α” 上完成訓(xùn)練,該集群具有全球領(lǐng)先的大規(guī)模
    的頭像 發(fā)表于 04-13 15:13 ?1033次閱讀

    使用NVIDIA DGX SuperPOD訓(xùn)練SOTA大規(guī)模視覺(jué)模型

    在這篇文章中,我們展示了在大規(guī)模人工智能超級(jí)計(jì)算機(jī)上訓(xùn)練 SOTA 大規(guī)模視覺(jué) transformer 模型(如 VOLO \ u D5 )的主要技術(shù)和程序,如基于 NVIDIA DG
    的頭像 發(fā)表于 05-30 10:17 ?2385次閱讀
    使用NVIDIA DGX SuperPOD<b class='flag-5'>訓(xùn)練</b>SOTA<b class='flag-5'>大規(guī)模</b>視覺(jué)<b class='flag-5'>模型</b>

    基于PyTorch的模型并行分布式訓(xùn)練Megatron解析

    NVIDIA Megatron 是一個(gè)基于 PyTorch 的分布式訓(xùn)練框架,用來(lái)訓(xùn)練超大Transformer語(yǔ)言模型,其通過(guò)綜合應(yīng)用了數(shù)據(jù)并行,Tensor并行和Pipeline并
    的頭像 發(fā)表于 10-23 11:01 ?3031次閱讀
    基于PyTorch的<b class='flag-5'>模型</b>并行<b class='flag-5'>分布式</b><b class='flag-5'>訓(xùn)練</b>Megatron解析