亚当的回答并不能说明整个故事。您可以使用Spark Streaming对GPU进行实时推断,但Spark确实比它更难。另外,因为你有一百个你需要做推理的模型,所以它变得非常挑战。
一个很大的障碍是除非你运行最新版本的YARN,否则它确实没有GPU作为资源的概念。因此,您必须使用可以控制配置的群集,以便每个节点的执行程序数量与GPU的数量相匹配。如果您需要此群集来执行其他操作,那么您将不得不使用放置标签。
假设配置准备就绪,下一个问题是模型的剪切数。通常,在spark中使用DL4J时,您需要使用RDD#mapPartitions,以便在单个工作线程(应该= 1 GPU)上获得整个分区的数据。加载模型(将其缓存在本地线程中)然后将分区拆分为小批量并将它们提供给Model#输出是地图的工作。 (DL4J / ND4J将处理将每个线程映射到1个GPU上。)Spark中的映射默认为“整个集群”,因此所有数据将被均匀分割。因此,每个节点将加载和卸载100个串联模型中的每一个。这将是低效的,而不是完全实时的。
如果所有100个模型都是独立的,那么一个(不是很好)选项是通过创建[ModelId,DataSet]的PairRDD(复制DataSet 100次)并在单个Spark作业中做一个花哨的ReduceByKey来放大数据。为了减少杀手混乱(或者如果模型不是独立的),您需要创建具有有限最大执行器数量的N spark spark作业,并在Kafka主题上进行收听。如果模型更像DAG,那么你真的会开始与Spark的模型作斗争,在这种情况下你想要的更像是Apache Storm。
上次我使用Storm时,它一次只显示一个,所以你必须正确配置它,这样你就可以创建最大化GPU使用量的微缩模型。
这不是gpus的工作方式......你错过了关于设备实际工作方式的大量背景。
由于与gpu通信的开销,GPU不用于实时推断。无论您使用什么深度学习框架,都是如此。
你可以使用cpus并在这里做得很好。你必须有一个gpus的批处理用例甚至是值得的。