我需要使用实时数据运行几个(数百个)已经训练好的 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/