Deeplearning4j 在 Scala 中的线程间共享计算图

Deeplearning4j Sharing Computational Graph between Threads in Scala

我正在尝试进行图像分类。我正在使用 Scala、Akka actor 系统和 deeplearning4j。问题是我必须始终在图像上的相同点或作物上进行检测。我正在考虑在每一帧上为每一幅图像创建一个新演员。问题是,据我所知,为每个演员创建实例化一个新模型是不可行的,但是拥有一个模型实例并传递给每个演员也不可行。我应该有一个实例池吗?我有点被这个问题困住了,因为这是我第一次尝试 deeplearning4j。以前,我会使用 python REST api,但我认为此解决方案的性能应该更好。

提前致谢。

  1. 无需为图像的每一裁剪实例化一个新演员。只需保留一个演员池,要求主节点为他们提供更多图像,以便在他们处理完之前的图像后立即进行分类。我还建议检查它与普通并行集合相比是否真的给你带来了什么(比如 images.par.map(model.classify) 已经可以完成这项工作;它会自己处理一个线程池)。
  2. 无需为每个演员实例化一个新模型。分类不会改变模型,因此您可以简单地在所有参与者之间共享相同的模型。这相当于每个参与者引用模型对象的 8 字节开销,因此可以忽略不计。

也许你可以看看 monix 库,它有异步任务、批处理、容错原语等

将来,请注意:您可以开箱即用地使用并行推理进行多线程服务。 https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/inference/ParallelInferenceExample.java

上述答案的一个问题是,它没有考虑到模型在进行激活时具有内部状态。 ParallelInference 还允许批处理和顺序推理。 例如,当您使用 gpus 时,这很重要。我们在这里也允许多线程推理。