DL4J 运行(未训练)使用 Apache Spark 的 GPU 上的 LSTM 神经网络?

DL4J running (not training) LSTM neural networks on GPUs with Apache Spark?

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

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

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

非常感谢任何指点,我花了很多时间搜索但找不到任何关于此的内容。只有 material 描述了 GPU 训练。

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

谢谢!

这不是 gpus 的工作方式....您错过了有关设备实际工作方式的大量上下文。

由于与 GPU 通信的开销,GPU 不适用于实时推理。无论你使用什么深度学习框架都是如此。

你可以在这里使用 cpus 并且做的很好。你必须有一个 gpus 的批处理用例才值得。

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

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

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

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

上次我使用 Storm 时,它一次只显示一个东西,因此您必须正确配置它,以便创建可最大化 GPU 使用率的小批量。