目前我正在研究Apache Spark 3.0与Rapids GPU Acceleration的使用。在spark-rapids
的官方文档中,我看到了这个页面,上面写着:
在某些情况下,您可能希望访问GPU上的原始数据,最好不要复制它。其中一个用例是在进行特征提取后将数据导出到ML框架。
对我来说,这听起来好像可以让一些上游Spark ETL过程中GPU上已经可用的数据直接用于Tensorflow或PyTorch等框架。如果是这种情况,我如何从这些框架中访问数据?如果我在这里误解了什么,这句话到底指的是什么?
您引用的链接实际上只允许您访问仍在GPU上的数据,但在Tensorflow或PyTorch等其他框架中使用这些数据并没有那么简单。
TL;DR;除非您有一个明确设置为使用RAPID加速器的库,否则您可能希望使用RAPID运行ETL,然后保存它,并启动一个新作业来使用该数据训练您的模型。
仍然有许多问题需要解决。我们已经在XGBoost的案例中进行了这些工作,但这还不是我们试图为Tensorflow或PyTorch解决的问题。
大问题是
- 将数据发送到正确的进程。即使数据在GPU上,出于安全考虑,它也与给定的用户进程绑定。PyTorch和Tensorflow通常作为python进程运行,而不是在Spark运行的JVM中。这意味着数据必须发送到另一个进程。有几种方法可以做到这一点,但尝试将其作为零复制操作来做是非常重要的
- 数据的格式不是Tensorflow或PyTorch想要的。RAPID的数据采用箭头兼容格式。Tensorflow和PyTorch都有从CPU导入标准格式数据的API,但要将数据转换为框架所需的格式,并找到一个API让您直接从GPU导入数据,可能需要一些工作
- 共享GPU资源。Spark最近才添加了对调度GPU的支持。在此之前,人们只会为每个执行器和一个python进程启动一个spark任务,以便python进程在进行训练或推理时拥有整个GPU。有了RAPID加速器,GPU不再是免费的,您需要一种共享资源的方式。如果两个库都更新为使用RMM,并且它们处于同一进程中,RMM就会提供其中的一些功能,但在Pytorch和Tensoflow的情况下,它们通常处于python进程中,因此很难弄清楚如何共享GPU