使用Keras Model作为广播变量与Apache Spark&亚洲象

时间:2017-09-29 16:16:24

标签: apache-spark keras broadcast

我有一个keras模型,预训练重量[h5df]约为70​​0mb。我想将它与Apache Spark一起用作广播变量。 1.这似乎不可能,因为keras模型本身不是火花感知且不可序列化。 当谷歌搜索一下时,我找到了Elephas图书馆来完成这项工作。因此尝试在ElephasTransformer中包装Keras预训练模型。这会抛出多个错误(我使用python 2.7)。例如,在Elephas的文件ml_model.py中,“来自pyspark.ml.util import keyword_only”,导入不可用。即使我试图对此进行评论并在代码中进行适当修改,它似乎也无法处理keras模型的广播,因为它会在其中一个密集层中引发张量误差。

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

2 个答案:

答案 0 :(得分:2)

我使用SparkFiles

分发模型
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)

答案 1 :(得分:0)

在 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)