java - DL4J 使用 Apache Spark 在 GPU 上运行(非训练)LSTM 神经网络?

标签 java apache-spark deep-learning gpu deeplearning4j

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

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

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

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

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

谢谢!

最佳答案

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

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

假设配置已准备就绪,接下来的问题是模型的剪切数量。通常,在 spark 中使用 DL4J 时,您需要使用 RDD#mapPartitions 以便可以在单个工作线程(应该 = 1 个 GPU)上获取整个分区的数据值(value)。 map 的工作是加载模型(将其缓存在本地线程中),然后将分区分解为小批量并将它们提供给 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 使用率的小批量。

关于java - DL4J 使用 Apache Spark 在 GPU 上运行(非训练)LSTM 神经网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50476137/

相关文章:

opencv - 用于语义分割的 one-hot-labeling

tensorflow - keras 中损失函数的输出形状应该是什么?

java - 将列表类型添加到关联

Javamail, Transport.send() 很慢

java - 覆盖 super 方法时的 ClassCastException (Comparable<T>)

apache-spark - Spark 驱动程序中的内存泄漏

java - 如何封装未经检查的强制转换以仅允许未经检查的泛型类型转换?

java - saveAsTextFile()将最终的RDD作为单个文本文件写入-Apache Spark

scala - 值尾不是(String,String)的成员

machine-learning - 是否可以使用受过一般训练的深度学习分类器对子类进行分类?