You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用已保存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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:30:43