我正在尝试记录一个Tensorflow模型,该模型已经加载了model = tf.saved_model.load(my_model_directory)
。当我调用mlflow.tensorflow.log_model(model, "model")
时,我收到一个错误
在MLFlow FAQ中,他们有一个用Keras模型做同样事情的例子。
import mlflow
import tensorflow as tf
model = tf.keras.models.load_model("tf_keras_model")
with mlflow.start_run() as run:
mlflow.keras.log_model(model, "model")
我用Tensorflow模型试过:
imported: AutoTrackable = tf.saved_model.load(my_model_directory)
inference_function: WrappedFunction = imported.signatures["serving_default"]
mlflow.set_tracking_uri("http://127.0.0.1:5000")
with mlflow.start_run() as run:
#mlflow.tensorflow.log_model(imported, "model")
mlflow.tensorflow.log_model(inference_function, "model")
运行此命令将给出错误
mlflow.exceptions.MlflowException:未知的模型类型:<class 'tensorflow.python.eager.wrap_function.WrappedFunction'>
或
mlflow.exceptions.MlflowException:未知模型类型:<class 'tensorflow.python.trackable.autotrackable. AutoTrackable'>.log_model()
函数的MLFlow文档说明第一个参数应该是“TF2核心模型(继承tf.Module)或MLflow模型格式的Keras模型”。如何从AutoTrackable中获取可以从tf.saved_model.load()
获取的日志?
1条答案
按热度按时间tgabmvqs1#
您看到的错误是因为
tf.saved_model.load()
返回的对象不是直接的TensorFlow 2核心模型(继承tf.Module
)或Keras模型,这是mlflow.tensorflow.log_model()
所期望的。相反,tf.saved_model.load()
返回AutoTrackable
对象,这是序列化TensorFlow对象的更通用表示。要使用MLflow记录模型,可以执行以下步骤:
1.将SavedModel转换为ConcreteFunction:这将允许您从加载的模型中获得可调用的TensorFlow函数,可以用于进行预测。
1.创建自定义tf.Module:TensorFlow 2.x鼓励使用
tf.Module
封装模型。由于MLflow需要tf.Module
或Keras模型,因此您可以创建自定义模块并将ConcreteFunction
添加到其中。1.使用MLflow记录自定义tf.Module:现在您有了一个
tf.Module
,您可以使用MLflow记录它。以下是如何实现这些步骤:
这种方法将ConcreteFunction Package 在自定义tf.Module中,并且应该满足使用MLflow进行日志记录的要求。
参考文献:
TensorFlow 2 SavedModel documentation
MLflow TensorFlow documentation