如何使用已保存TFX Pipeline生成带预处理的模型预测结果
TFX预测阶段预处理逻辑生效问题解答
核心结论
preprocessing_fn 并非仅在训练阶段生效,只要你按照TFX标准流程将Transform生成的预处理逻辑打包进导出的serving模型计算图,所有推理场景都会自动执行预处理,不需要手动重复实现特征变换逻辑。
两个常见推理方案的预处理生效规则
- BulkInferrer组件:只要输入给BulkInferrer的是Trainer导出的标准serving SavedModel,组件读入原始批量数据后,会自动执行模型图内包含的预处理步骤,再输出推理结果,全程不需要手动对输入数据做变换。
- TFX Serving REST/gRPC调用:和BulkInferrer逻辑完全一致,服务端加载的是带预处理层的SavedModel,客户端只需要传原始特征值即可,预处理会在服务端自动完成。
你看到教程里preprocessing_fn同时处理特征和响应变量,是为了适配训练阶段的数据流。Transform在配合Trainer导出serving模型签名时,会自动裁剪掉和标签计算相关的分支,预测阶段不需要传入响应变量,不会触发缺失输入的报错。
本地类sklearn式调用实现方法
你不需要自己手动拼接预处理和模型推理逻辑,直接加载Trainer导出的serving版SavedModel即可,参考实现如下:
import tensorflow as tf def load_tfx_model(serving_model_path): # 注意路径要填Trainer组件输出的serving模型目录,不要填Transform单独输出的产物目录,也不要填训练checkpoint路径 loaded = tf.saved_model.load(serving_model_path) # 取出默认预测签名 return loaded.signatures["serving_default"] # 调用示例 if __name__ == "__main__": model = load_tfx_model("path/to/your/trainer/serving_model/") # 传入原始未预处理的特征,格式为特征名对应tf.Tensor,不需要传入标签列 new_data = { "feature_a": tf.constant([sample1_val, sample2_val]), "feature_b": tf.constant([sample1_val_b, sample2_val_b]) } pred_result = model(**new_data) # 根据你模型导出的输出key取最终结果,转成numpy格式即可使用 final_preds = pred_result["output_0"].numpy()
常见踩坑提示
- 如果你训练时没有把Transform生成的预处理层打包进serving模型(比如手动拆分了预处理和模型的存储逻辑),那所有推理场景都不会自动执行预处理,需要手动调用Transform输出的
transform_preprocessing_fn先处理原始数据,再喂给模型。 - 编写
preprocessing_fn时,不要把依赖标签字段的逻辑放到特征变换的计算分支里,否则导出serving模型时会因为缺失标签输入触发构图错误。
内容的提问来源于stack exchange,提问作者IVR
相关产品推荐
相关产品推荐

