Модель Keras: TypeError: невозможно выбрать объекты _thread.lock
У меня проблемы с использованием обученной модели Keras в PySpark. Используются следующие версии библиотек:
tensorflow==1.1.0
h5py==2.7.0
keras==2.0.4
Также я использую Spark 2.4.0.
from pyspark.sql import SparkSession
import pyspark.sql.functions as func
from keras.models import load_model
spark = SparkSession \
.builder \
.appName("Test") \
.master("local[2]") \
.getOrCreate()
my_model = load_model("my_model.h5")
spark.sparkContext.addFile("my_model.h5")
my_model_bcast = spark.sparkContext.broadcast(my_model)
# ...
get_prediction_udf = func.udf(get_prediction, IntegerType())
ds = ds\
.withColumn("predicted_value", get_prediction_udf(my_model_bcast,
func.col("col1"),
func.col("col2"))))
Функция get_prediction
выглядит следующим образом (упрощенный код):
def get_prediction(my_model_bcast, col1, col2):
cur_state = np.array([col1,col2])
state = cur_state.reshape(1,2)
ynew = my_model_bcast.predict(state)
return np.argmax(ynew[0])
Следующая ошибка вызывается строкой my_model_bcast = spark.sparkContext.broadcast(my_model)
:
File "/usr/local/spark-2.4.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/broadcast.py", line 110, in dump
pickle.dump(value, f, 2)
TypeError: can't pickle _thread.lock objects
Я читал похожие темы, чтобы найти решение. Насколько я понимаю, keras
не поддерживает применение pickle
, Но как в этом случае я могу делать прогнозы в PySpark, используя обученную модель?
1 ответ
Не представляется возможным сериализовать модели keras, так что, может быть, просто распространить файл и как файл spark? Таким образом, внутри вашей функции (где вы ожидаете модель в качестве входных данных) вы можете прочитать файл с этого пути и создать модель внутри него?
path = SparkFiles.get("mode_file.h5")
model = load_model(path)