【问题标题】:DL4J running (not training) LSTM neural networks on GPUs with Apache Spark?DL4J 使用 Apache Spark 在 GPU 上运行(非训练)LSTM 神经网络?
【发布时间】:2018-05-22 20:40:46
【问题描述】:

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

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

我的问题是:我可以在 GPU 上使用 rnnTimeStep() 处理实时数据吗?

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

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

谢谢!

【问题讨论】:

    标签: java apache-spark deep-learning gpu deeplearning4j


    【解决方案1】:

    Adam 的回答并不能说明全部情况。您可以使用 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 来放大数据。要减少杀手 shuffle(或者如果模型不是独立的),您需要创建 N 个 spark 流作业,其最大执行器数量有限,监听 Kafka 主题。如果模型更像 DAG,那么您将真正开始与 Spark 的模型抗争,而在这种情况下您想要的是更像 Apache Storm 的东西。

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

    【讨论】:

      【解决方案2】:

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

      由于与 gpu 通信的开销,GPU 不适用于实时推理。无论您使用什么深度学习框架,这都是正确的。

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

      【讨论】:

      • 所以,有人对我的问题投了反对票,对你的答案投了反对票(不是我),但不想解释原因。我也看不出有什么问题。即使这不是对 GPU 的适当使用,这仍然是对有效问题的一个很好的回答。话虽如此,我将收到批量数据。那么,考虑到这一点,是否可以在 GPU 中运行实际推理?如果可以,如何实现?
      猜你喜欢
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2012-04-02
      • 2018-08-19
      • 2010-11-20
      相关资源
      最近更新 更多