我有一个keras模型,预训练权重h5df约为700mb。我想在Apache Spark中使用它作为广播变量。1.这似乎是不可能的,因为keras模型本身不是spark感知的,也是不可序列化的。2.我在谷歌上搜索了一下,发现了Elephas库。因此,尝试在ElephasTransformer中包装Keras预训练模型。这抛出了多个错误(我使用的是python 2.7 )。例如,在Elephas的ml_model.py文件"from pyspark.ml.util import keyword_only“中,导入不可用。即使我试图注释掉这一点并在代码中进行适当的修改,它似乎也无法处理keras模型的广播,因为它在一个密集的层中抛出了张量错误。
如何在apache spark中使用预先训练好的keras模型作为广播变量?
发布于 2017-09-30 00:24:25
我会使用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)
发布于 2021-01-19 10:47:30
在Elephas中,我处理这个问题的方法是将权重设置为广播变量,将yaml字符串作为参数提供给mapper函数,然后使用加载的yaml文件和权重在mapper函数中创建模型-效果如下:
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)
https://stackoverflow.com/questions/46493013
复制相似问题