0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spark 3.4用于分布式模型训练和大规模模型推理

jf_pJlTbmA9 来源:NVIDIA 作者:NVIDIA 2023-07-05 16:30 次阅读

Apache Spark是一个业界领先的平台,用于大规模数据的分布式提取、转换和加载( ETL )工作负载。随着深度学习( DL )的发展,许多 Spark 从业者试图将 DL 模型添加到他们的数据处理管道中,以涵盖各种用例,如销售预测、内容推荐、情绪分析和欺诈检测

然而,结合 DL 培训和推理,从历史上看,大规模数据一直是 Spark 用户面临的挑战。大多数 DL 框架都是为单节点环境设计的,它们的分布式训练和推理 API 通常是经过深思熟虑后添加的。

为了解决单节点 DL 环境和大规模分布式环境之间的脱节,有多种第三方解决方案,如 Horovod-on-Spark、TensorFlowOnSpark 和 SparkTorch,但由于这些解决方案不是在 Spark 中本地构建的,因此用户必须根据自己的需求评估每个平台。

随着 Spark 3.4 的发布,用户现在可以访问内置的 API,用于分布式模型训练和大规模模型推理,如下所述。

分布式培训

对于分布式培训,有一个新的 TorchDistributor PyTorch 的 API,它遵循 spark-tensorflow-distributorTensorFlow 的 API。这些 API 通过利用 Spark 的屏障执行模式,在 Spark executors 上生成分布式 DL 集群节点,从而简化了将分布式 DL 模型训练代码迁移到 Spark 的过程。

一旦 Spark 启动了 DL 集群,控制权就基本上通过main_fn传递给TorchDistributorAPI

如下面的代码所示,使用这个新的 API 在 Spark 上运行标准的分布式 DL 培训只需要进行最小的代码更改。

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)

一旦启动,运行在执行器上的流程就依赖于其各自 DL 框架的内置分布式训练 API 。将现有的分布式训练代码移植到 Spark 应该很少或不需要修改。然后,这些进程可以在训练期间相互通信,还可以直接访问与 Spark 集群相关的分布式文件系统(图 1 )。

distributed-training-torchdistributor-api-diagram.png 图 1 。分布式培训使用TorchDistributorAPI

然而,这种迁移的方便性也意味着这些 API 不使用 Spark RDD 或 DataFrames 进行数据传输。虽然这消除了在 Spark 和 DL 框架之间转换或序列化数据的任何需要,但它也要求在启动训练作业之前完成任何 Spark 预处理并持久化到存储中。主要训练功能可能还需要适于从分布式文件系统而不是本地存储读取。

分布式推理

对于分布式推理,有一个新的predict_batch_udfAPI ,它建立在Spark Pandas UDF以便为 DL 模型推断提供更简单的接口。 pandas 与基于行的 UDF 相比, UDF 提供了一些优势,包括通过Apache Arrow以及通过Pandas。有关详细信息,请参阅Introducing Pandas UDF for PySpark.

然而,尽管 pandas UDF API 可能是 ETL 用例的一个很好的解决方案,但它仍然不适合 DL 推理用例。首先, pandas UDF API 将数据表示为 pandas 系列或数据帧,这同样适用于执行 ETL 操作,如选择、排序、数学转换和聚合

然而,大多数 DL 框架都期望NumPy数组或标准 Python 数组作为输入,这些数组通常由自定义张量变量包装。因此,pandas UDF 实现至少需要将传入的 pandas 数据转换为 NumPy 数组。不过,根据用例和数据集的不同,准确的转换可能会有很大的差异。

其次, pandas UDF API 通常在数据分区上运行,数据分区的大小由数据集的原始写入者或分布式文件系统决定。因此,很难对传入的数据进行适当的批处理以进行优化计算。

最后,仍然存在在 Spark 执行器和任务之间加载 DL 模型的问题。在正常的 Spark ETL 工作中,工作负载遵循函数编程范式,其中可以对数据应用无状态函数。然而,对于 DL 推理,预测函数通常需要从磁盘加载其 DL 模型权重。

Spark 具有通过任务序列化和广播变量将变量从驱动程序序列化到执行器的能力。然而,这两者都依赖于 Python pickle 序列化,这可能不适用于所有 DL 模型。此外,如果操作不当,加载和序列化非常大的模型可能会带来极高的性能成本。

解决当前限制

为了解决这些问题predict_batch_udf引入了以下方面的标准化代码:

将 Spark 数据帧转换为 NumPy 数组,因此最终用户 DL 推理代码不需要从 pandas 数据帧进行转换。

为 DL 框架批处理传入的 NumPy 数组。

在执行器上加载模型,避免了任何模型序列化问题,同时利用 Sparkspark.python.worker.reuse配置以在 Spark 执行器中缓存模型。

下面的代码演示了这个新的 API 如何隐藏将 DL 推理代码转换为 Spark 的复杂性。用户只需定义make_predict_fn函数,使用标准的 DL API 加载模型并返回predict作用然后predict_batch_udf函数生成一个标准PandasUDF,负责处理幕后的其他一切。

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()

请注意,此 API 使用标准 Spark DataFrame 进行推断,因此执行器将从分布式文件系统读取数据并将该数据传递给predict函数(图 2 )。这也意味着,根据需要,数据的任何处理都可以与模型预测一起进行。

还要注意,这是一个data-parallel体系结构,其中每个执行器加载模型并对数据集的各自部分进行预测,因此模型必须适合执行器内存。

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

Spark 深度学习的端到端示例

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NVIDIA
    +关注

    关注

    14

    文章

    4592

    浏览量

    101717
  • 人工智能
    +关注

    关注

    1776

    文章

    43845

    浏览量

    230601
  • 深度学习
    +关注

    关注

    73

    文章

    5237

    浏览量

    119908
收藏 人收藏

    评论

    相关推荐

    【书籍评测活动NO.30】大规模语言模型:从理论到实践

    更多的自然语言处理研究人员和对大语言模型感兴趣的读者能够快速了解大模型的理论基础,并开展大模型实践,复旦大学张奇教授团队结合他们在自然语言处理领域的研究经验,以及分布式系统和并行计算的
    发表于 03-11 15:16

    山西嵌入系统课程| Spark与Hadoop计算模型Spark比Hadoop更...

    上次我们分享了Spark与Hadoop计算模型的内存问题,今天山西思软嵌入学员为大家分享Spark与Hadoop计算模型
    发表于 11-17 16:44

    大规模特征构建实践总结

    是这部分的工作和业务相关性大,且讲明白了技术亮点不多,属于苦力活,所以没有开源的动力。本文总结了蘑菇街搜索推荐在实践大规模机器学习模型中的特征处理系统的困难点。我们的技术选型是spark,虽然
    发表于 11-19 09:35

    用tflite接口调用tensorflow模型进行推理

    摘要本文为系列博客tensorflow模型部署系列的一部分,用于实现通用模型的部署。本文主要实现用tflite接口调用tensorflow模型进行
    发表于 12-22 06:51

    分布式对象调试中的事件模型

    针对事件的分布式程序调试过程中,需处理大量的事件消息,如果处理不当,则会影响分布式程序的执行,提出了一种分布式对象中的事件模型,采用这种模型
    发表于 12-10 17:29 8次下载

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

    II DDM模型是现有的分布式聚类模型中性能较好的一种个体合作以及串行工作方式固有的不足,在该模型基础上引入分层的思想,提出了一种新的分布式
    发表于 09-16 14:08 0次下载
    基于代理<b class='flag-5'>模型</b>的<b class='flag-5'>分布式</b>聚类算法

    大规模分布式机器学习系统分析

    为例,通过对比三款开源分布式LDA系统-Spark LDA、PLDA+和LightLDA,在系统资源消耗、算法收敛性能和可扩展性等方面的表现,分析各系统在设计、实现和性能上的差异。实验结果表明:面对小规模的样本集和
    发表于 12-05 19:02 0次下载
    <b class='flag-5'>大规模</b><b class='flag-5'>分布式</b>机器学习系统分析

    小米在预训练模型的探索与优化

    导读:预训练模型在NLP大放异彩,并开启了预训练-微调的NLP范式时代。由于工业领域相关业务的复杂性,以及工业应用对推理性能的要求,大规模
    的头像 发表于 12-31 10:17 2261次阅读
    小米在预<b class='flag-5'>训练</b><b class='flag-5'>模型</b>的探索与优化

    如何向大规模训练语言模型中融入知识?

    本文关注于向大规模训练语言模型(如RoBERTa、BERT等)中融入知识。
    的头像 发表于 06-23 15:07 3597次阅读
    如何向<b class='flag-5'>大规模</b>预<b class='flag-5'>训练</b>语言<b class='flag-5'>模型</b>中融入知识?

    Google Brain和DeepMind联手发布可以分布式训练模型的框架

    。 正如吴恩达所言,当代机器学习算法的成功很大程度上是由于模型和数据集大小的增加,在大规模数据下进行分布式训练也逐渐变得普遍,而如何在大规模
    的头像 发表于 06-26 15:42 1999次阅读
    Google Brain和DeepMind联手发布可以<b class='flag-5'>分布式</b><b class='flag-5'>训练</b><b class='flag-5'>模型</b>的框架

    探究超大Transformer语言模型分布式训练框架

    NVIDIA Megatron 是一个基于 PyTorch 的框架,用于训练基于 Transformer 架构的巨型语言模型。本系列文章将详细介绍Megatron的设计和实践,探索这一框架如何助力
    的头像 发表于 10-20 09:25 2129次阅读

    DGX SuperPOD助力助力织女模型的高效训练

      “强悍的织女模型在京东探索研究院建设的全国首个基于 DGX SuperPOD 架构的超大规模计算集群 “天琴α” 上完成训练,该集群具有全球领先的大规模
    的头像 发表于 04-13 15:13 811次阅读

    使用NVIDIA DGX SuperPOD训练SOTA大规模视觉模型

    在这篇文章中,我们展示了在大规模人工智能超级计算机上训练 SOTA 大规模视觉 transformer 模型(如 VOLO \ u D5 )的主要技术和程序,如基于 NVIDIA DG
    的头像 发表于 05-30 10:17 1930次阅读
    使用NVIDIA DGX SuperPOD<b class='flag-5'>训练</b>SOTA<b class='flag-5'>大规模</b>视觉<b class='flag-5'>模型</b>

    NVIDIA联合构建大规模模拟和训练 AI 模型

    Champollion 超级计算机位于格勒诺布尔,由慧与和 NVIDIA 联合构建,它将为全球科学和工业领域的用户创建大规模模拟和训练 AI 模型
    的头像 发表于 06-14 14:56 1565次阅读

    基于PyTorch的模型并行分布式训练Megatron解析

    NVIDIA Megatron 是一个基于 PyTorch 的分布式训练框架,用来训练超大Transformer语言模型,其通过综合应用了数据并行,Tensor并行和Pipeline并
    的头像 发表于 10-23 11:01 1007次阅读
    基于PyTorch的<b class='flag-5'>模型</b>并行<b class='flag-5'>分布式</b><b class='flag-5'>训练</b>Megatron解析