我需要运行几个(数百个)已经训练过的LSTM神经网络,其中包含实时数据(非常频繁地输入新的时间步长)。这些LSTM神经网络使用deeplearining4j实现。为了有效地运行所有这些,我希望让他们使用GPU来执行计算,以便我可以使用大量实时数据运行数百个。
我知道我可以使用GPU训练神经网络。
我的问题是:我可以使用GPU上的rnnTimeStep()
在实时数据上执行它们吗?
任何指针都非常感激,我花了很多时间搜索但却无法找到任何相关信息。仅描述GPU培训的材料。
不要担心GPU开销,我会考虑它,我知道这是一件不寻常的事情。只需要知道它是否可行以及是否有任何指示如何去做。
谢谢!
答案 0 :(得分:0)
这并不是gpus的工作方式......你错过了关于设备实际工作方式的大量背景。
由于与gpu通信的开销,GPU不适用于实时推断。无论您使用什么深度学习框架,都是如此。
你可以使用cpus并在这里做得很好。你必须有一个gpus的批处理用例才值得。
答案 1 :(得分:0)
亚当的回答并不能说明整个故事。您可以使用Spark Streaming对GPU进行实时推断,但Spark确实比它更难。另外,因为你有一百个你需要推理的模型,所以它变成了挑战。
一个很大的障碍是,除非您运行最新版本的YARN,否则它确实没有GPU作为资源的概念。因此,您必须使用可以控制配置的群集,以便每个节点的执行程序数量与GPU的数量相匹配。如果您需要此群集来执行其他操作,那么您必须使用展示位置标签。
假设配置准备就绪,下一个问题是模型的剪切数。通常,在spark中使用DL4J时,您将要使用RDD#mapPartitions,这样您就可以在单个工作线程(应该= 1 GPU)上获得整个分区的数据。地图的工作是加载模型(将其缓存在本地线程中),然后将分区分解为小批量并将它们提供给Model#输出。 (DL4J / ND4J将处理将每个线程映射到1个GPU上。)Spark中的映射默认为#34;整个集群"所以所有数据都将被均匀分割。因此,每个节点将加载和卸载100个串联模型中的每一个。这将是低效的,而不是完全实时的。
如果所有100个模型都是独立的,则一个(不太好)选项是通过创建[ModelId,DataSet]的PairRDD(复制DataSet 100次)并在单个Spark作业中执行花哨的ReduceByKey来放大数据。为了减少杀手混乱(或者如果模型不是独立的),您需要创建具有有限最大执行者数量的N个火花流工作,并在Kafka主题上进行收听。如果模型更像DAG,那么你真的会开始与Spark的模型作斗争,在这种情况下你想要的更像Apache Storm。
上次我使用Storm时,它只会一次显示一个,所以你必须正确配置它,以便你可以创建最大化GPU使用量的小批量。