根据我的研究,TFX 不支持 TFX 管道中的自定义特征转换,因为我的自定义 python 函数无法在图中序列化。因此使所述功能在服务/推理时不可用。
我发现的一种替代方法是通过创建自定义 Servable ( https://www.tensorflow.org/tfx/serving/custom_servable ) 来扩展 TensorFlow Serving,但我还没有找到任何添加特征转换代码的具体示例。
如何围绕 SavedModel 包装特征转换?
根据我的研究,TFX 不支持 TFX 管道中的自定义特征转换,因为我的自定义 python 函数无法在图中序列化。因此使所述功能在服务/推理时不可用。
我发现的一种替代方法是通过创建自定义 Servable ( https://www.tensorflow.org/tfx/serving/custom_servable ) 来扩展 TensorFlow Serving,但我还没有找到任何添加特征转换代码的具体示例。
如何围绕 SavedModel 包装特征转换?
有不同类型的解决方案:
选项 A:您可以使用TensorFlow Serving为您训练和保存的模型提供服务。然后,您可以为请求预处理和准备数据。之后,您可以使用tensorflow-serving-api包PredictRequest
通过 gRPC 向之前启动的服务发送一个:
import tensorflow as tf
from tensorflow_serving.apis.prediction_service_pb2_grpc import (
PredictionServiceStub
)
from tensorflow_serving.apis.predict_pb2 import (
PredictRequest,
PredictResponse,
)
values: List[float] = # ... YOUR PREPROCESSED DATA ...
host, port = '0.0.0.0', 8500
channel = grpc.insecure_channel(f'{host}:{port}')
stub = PredictionServiceStub(channel)
request = PredictRequest()
request.model_spec.name = 'cifar10'
request.model_spec.signature_name = 'serving_default'
tensor_proto = tf.make_tensor_proto(
values=values,
shape=(1, 32, 32, 3),
dtype=float
)
request.inputs['input'].CopyFrom(tensor_proto)
response: PredictResponse = stub.Predict(request)
result = response.outputs['output'].float_val
选项 B:您可以尝试使用LambdaLayers将预处理步骤嵌入到模型中。我从未尝试过,但如果你想使用自定义导入和依赖项,你应该小心,因为如果我们使用常规load_model方法来加载保存的模型,我们必须应用 required custom_objects
。