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

标签 java apache-spark deep-learning gpu deeplearning4j

我需要使用实时数据运行几个(数百个)已经训练好的 LSTM 神经网络(在这些网络上经常输入新的时间步长)。这些 LSTM 神经网络是使用 deeplearining4j 实现的。为了高效地运行所有这些,我希望他们使用 GPU 来执行计算,这样我就可以使用大量实时数据流运行数百个这样的计算。

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

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

非常感谢您的指点,我花了很多时间搜索,但找不到任何相关信息。仅描述 GPU 训练的 Material 。

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

谢谢!

最佳答案

亚当的回答并没有真正讲述整个故事。您可以使用 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 作业中执行奇特的 ReduceByKey 来放大数据。为了减少 killer 洗牌(或者如果模型不是独立的),您需要创建 N 个 Spark 流作业,其执行器的最大数量有限,并监听 Kafka 主题。如果模型有一个更像 DAG 的东西,那么你真的会开始与 Spark 的模型作斗争,而在这种情况下你想要的是更像 Apache Storm 的东西。

上次我使用 Storm 时,它一次只呈现一个内容,因此您必须正确配置它,以便您可以创建最大限度提高 GPU 使用率的小批量。

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

相关文章:

java - 读取具有不同名称但类型相同的元素列表

java - 用于持续测试的代码结构

scala - 将文件从本地移动到 HDFS

java - Spark中通过SWIFT从对象存储获取数据需要什么配置

python - TensorFlow - Tflearning 错误 feed_dict

java - 是否可以在服务器端(Java)的 HTML 页面中调用 JavaScript 代码?

java - tomcat如何知道提供哪个证书

apache-spark - Spark 流 + Kafka 与 Just Kafka

python - LSTM 和 CNN : ValueError: Error when checking target: expected time_distributed_1 to have 3 dimensions, 但得到形状为 (400, 256) 的数组

python-3.x - 如何使用 sklearn.datasets.load_files 加载数据百分比