首页 > 解决方案 > DL4J 使用 Apache Spark 在 GPU 上运行(非训练)LSTM 神经网络?

问题描述

我需要使用实时数据运行几个(数百个)已经训练过的 LSTM 神经网络(在这些神经网络上非常频繁地提供新的时间步长)。这些 LSTM 神经网络是使用 deeplearning4j 实现的。为了有效地运行所有这些,我想让他们使用 GPU 来执行他们的计算,这样我就可以使用大量实时数据来运行数百个这些。

我知道我可以使用 GPU 训练神经网络。

我的问题是:我可以在 GPU 上使用实时数据执行它们吗?rnnTimeStep()

非常感谢任何指针,我花了很多时间搜索但找不到任何东西。仅描述 GPU 训练的材料。

不用担心 GPU 开销,我正在考虑它,而且我知道这是一件不寻常的事情。只需要知道它是否可能以及是否有任何指示如何去做。

谢谢!

标签: javaapache-sparkdeep-learninggpudeeplearning4j

解决方案


亚当的回答并没有真正说明整个故事。您可以使用 Spark Streaming 在 GPU 上进行实时推理,但 Spark 确实让它变得比它可能的困难得多。此外,因为您有一百个模型需要进行推理,所以它变得相当具有挑战性。

一大障碍是,除非您运行最新版本的 YARN,否则它确实没有将 GPU 视为资源的概念。所以你必须使用一个可以控制配置的集群,这样你就可以保持每个节点的执行器数量与 GPU 的数量相匹配。如果您还需要这个集群来做其他事情,那么您将不得不使用放置标签。

假设配置已准备就绪,接下来的问题是模型的剪切数量。一般来说,在 spark 中使用 DL4J 时,您需要使用 RDD#mapPartitions 以便您可以在单个工作线程(应该 = 1 GPU)上获取整个分区的数据价值。地图的工作是加载模型(将其缓存在本地线程中),然后将分区分解为小批量并将它们提供给 Model#output。(DL4J/ND4J 将处理将每个线程映射到 1 个 GPU。)Spark 中的映射默认为“整个集群”,因此所有数据将被平均分割。所以每个节点将加载和卸载串联的一百个模型中的每一个。这将是低效的,而且不完全是实时的。

如果所有 100 个模型都是独立的,则一个(不是很好)选项是通过创建 [ModelId, DataSet] 的 PairRDD(复制 DataSet 100 次)并在单个 Spark Job 中执行精美的 ReduceByKey 来放大数据。为了减少杀手 shuffle(或者如果模型不是独立的),您需要创建 N 个 spark 流作业,其最大执行器数量有限,监听 Kafka 主题。如果模型更像 DAG,那么您将真正开始与 Spark 的模型抗争,而在这种情况下您想要的是更像 Apache Storm 的东西。

上次我使用 Storm 时,它一次只呈现一个东西,所以你必须正确配置它,这样你才能创建最大化 GPU 使用率的小批量。


推荐阅读