Apache spark 使用Keras模型作为apachespark&;的广播变量;象属

Apache spark 使用Keras模型作为apachespark&;的广播变量;象属,apache-spark,keras,broadcast,Apache Spark,Keras,Broadcast,我有一个keras模型,预训练重量[h5df]约为700mb。我想将它与apachespark一起用作广播变量。 1.这似乎是不可能的,因为keras模型本身不具备火花感知能力,也不可序列化。 2.在谷歌上搜索一下,我找到了做这项工作的Elephas图书馆。因此,尝试将Keras预训练模型包装在Elephas Transformer中。这会抛出多个错误(我使用Python2.7)。例如,在Elephas的文件ml_model.py“from pyspark.ml.util import keyw

我有一个keras模型,预训练重量[h5df]约为700mb。我想将它与apachespark一起用作广播变量。 1.这似乎是不可能的,因为keras模型本身不具备火花感知能力,也不可序列化。 2.在谷歌上搜索一下,我找到了做这项工作的Elephas图书馆。因此,尝试将Keras预训练模型包装在Elephas Transformer中。这会抛出多个错误(我使用Python2.7)。例如,在Elephas的文件ml_model.py“from pyspark.ml.util import keyword_only”中,导入不可用。即使我试图对此进行注释并在代码中进行适当修改,它似乎无法处理keras模型的广播,因为它在其中一个密集层中抛出了张量错误


如何在ApacheSpark中使用经过预训练的keras模型作为广播变量?

我将使用
SparkFile分发模型

spark.sparkContext.addFile("model_file.h5")
并在本地加载:

from pyspark import SparkFiles
from keras.models import load_model

def f(it):
    path = SparkFiles.get("mode_file.h5")
    model =  load.model(path)

    for i in it:
        yield ... # Do something


rdd.mapPartitions(f)

在Elephas中,我处理此问题的方法是将权重设置为广播变量,将yaml字符串作为映射器函数的参数提供,然后使用加载的yaml文件和权重在映射器函数内创建模型-效果如下:

from tensorflow.keras.models import model_from_yaml

weights = rdd.context.broadcast(model.get_weights())

def mapper_function(yaml_file, ...):
    model = model_from_yaml(yaml_file)
    model.set_weights(weights.value)

我成功地在一个广播变量中共享了900MB的数据。我想,对象作为广播变量的唯一要求是它应该是可序列化的。这可以在Java内部轻松完成,但对python不太确定。是否可以共享一些我们可以研究的代码?您是否找到了解决方案?您是否在实践中实现了这种方法?我很好奇这对你是否有效。顺便说一句,您导入了
load\u model
,但后来调用了
load.model()
。这是唯一适合我的方法。任何库都不支持使用自定义层序列化keras模型(我已经搜索过了),因此我必须遵循此解决方案。