【问题标题】:How to access Spark DataFrame data in GPU from ML Libraries such as PyTorch or Tensorflow如何从 ML 库(如 PyTorch 或 Tensorflow)访问 GPU 中的 Spark DataFrame 数据
【发布时间】:2021-01-04 16:02:29
【问题描述】:

目前我正在研究使用 Rapids GPU 加速的 Apache Spark 3.0。在官方spark-rapids 文档中,我遇到了this page,其中指出:

在某些情况下,您可能希望访问 GPU 上的原始数据,最好不要复制它。一个用例是在进行特征提取后将数据导出到 ML 框架。

在我看来,这听起来好像可以让来自某些上游 Spark ETL 进程的 GPU 上已经可用的数据直接可用于诸如 Tensorflow 或 PyTorch 之类的框架。如果是这种情况,我如何从这些框架中访问数据?如果我在这里误解了某些东西,那么引用的确切含义是什么?

【问题讨论】:

    标签: tensorflow apache-spark pytorch rapids spark3


    【解决方案1】:

    您引用的链接实际上只允许您访问仍在 GPU 上的数据,但在另一个框架(如 Tensorflow 或 PyTorch)中使用该数据并不是那么简单。

    TL;DR;除非您有明确设置的库以使用 RAPIDS 加速器,否则您可能希望使用 RAPIDS 运行 ETL,然后保存它,并启动一个新作业以使用该数据训练您的模型。

    仍有许多问题需要解决。我们已经在 XGBoost 的情况下解决了这些问题,但我们还没有尝试为 Tensorflow 或 PyTorch 解决这些问题。

    最大的问题是

    1. 将数据传送到正确的进程。即使数据在 GPU 上,出于安全考虑,它也与给定的用户进程相关联。 PyTorch 和 Tensorflow 通常作为 python 进程运行,而不是在运行 Spark 的同一个 JVM 中。这意味着必须将数据发送到另一个进程。有几种方法可以做到这一点,但尝试将其作为零复制操作来做并非易事。
    2. 数据的格式不是 Tensorflow 或 PyTorch 想要的。 RAPID 的数据采用箭头兼容格式。 Tensorflow 和 PyTorch 具有用于从 CPU 以标准格式导入数据的 API,但可能需要一些工作才能将数据转换为框架所需的格式,并找到一个 API 让您直接从 GPU 中提取数据。
    3. 共享 GPU 资源。 Spark 最近才添加了对调度 GPU 的支持。在此之前,人们只需为每个执行程序和一个 python 进程启动一个 spark 任务,以便在进行训练或推理时,python 进程将拥有整个 GPU。使用 RAPIDS 加速器,GPU 不再是免费的,您需要一种共享资源的方法。如果两个库都更新为使用 RMM 并且它们在同一个进程中,则 RMM 会提供其中的一部分,但在 Pytorch 和 Tensoflow 的情况下,它们通常在 python 进程中,因此很难弄清楚如何共享 GPU。

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 2020-05-27
      • 1970-01-01
      • 2021-08-29
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      相关资源
      最近更新 更多