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

    文章

    4978

    浏览量

    102987
  • 人工智能
    +关注

    关注

    1791

    文章

    47183

    浏览量

    238255
  • 深度学习
    +关注

    关注

    73

    文章

    5500

    浏览量

    121111
收藏 人收藏

    评论

    相关推荐

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

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

    【大语言模型:原理与工程实践】揭开大语言模型的面纱

    文本生成,根据提示或上下文生成连贯、富有创造性的文本,为故事创作等提供无限可能。大语言模型也面临挑战。一方面,其计算资源需求巨大,训练推理耗时;另一方面,模型高度依赖数据,需要
    发表于 05-04 23:55

    【大语言模型:原理与工程实践】大语言模型的基础技术

    概率推断,利用共现矩阵学习每个词的主题分布,进而将其作为词的表示向量。在大规模语料库中进行模型训练,使语义相似的词具有相似的主题分布。然而,
    发表于 05-05 12:17

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

    针对事件的分布式程序调试过程中,需处理大量的事件消息,如果处理不当,则会影响分布式程序的执行,提出了一种分布式对象中的事件模型,采用这种模型
    发表于 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>机器学习系统分析

    实现 TensorFlow 架构的规模性和灵活性

    TensorFlow 是为了大规模分布式训练推理而设计的,不过它在支持新机器学习模型和系统级优化的实验中的表现也足够灵活。
    的头像 发表于 01-26 14:48 2806次阅读
    实现 TensorFlow 架构的<b class='flag-5'>规模</b>性和灵活性

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

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

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

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

    如何使用TensorFlow进行大规模分布式的QML模拟

    中,我们将逐步带您了解如何使用 TensorFlow 和 TensorFlow Quantum 进行大规模分布式
    的头像 发表于 08-10 17:31 2625次阅读

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

    NVIDIA Megatron 是一个基于 PyTorch 的框架,用于训练基于 Transformer 架构的巨型语言模型。本系列文章将详细介绍Megatron的设计和实践,探索这一框架如何助力
    的头像 发表于 10-11 16:46 2682次阅读
    超大Transformer语言<b class='flag-5'>模型</b>的<b class='flag-5'>分布式</b><b class='flag-5'>训练</b>框架

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

    。 优化的分布式集群架构:NVIDIA DGX SuperPOD 有了高效的分布式训练框架,自然也需要优化的分布式训练集群。 NVIDIA
    的头像 发表于 10-20 09:25 2436次阅读

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

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

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

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

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

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