TensorFlow Serving部署串联模型:能否单次请求获取B模型输出?
当然可以!TensorFlow Serving完全支持通过单次请求获取模型B的输出,不用分别发起两次调用。这里给你几个实用的实现思路:
这是最简单高效的方式——把模型A和B的计算图拼接在一起,让A的输出直接作为B的输入,然后导出成一个统一的SavedModel文件部署。这样请求时直接调用这个合并后的模型,一次请求就能拿到最终结果。
举个简单的代码示例(假设你用Keras定义模型):
import tensorflow as tf # 假设你已经有训练好的模型A和B model_a = tf.keras.models.load_model("path/to/model_a") model_b = tf.keras.models.load_model("path/to/model_b") # 创建合并模型:输入给到A,A的输出给到B combined_input = tf.keras.Input(shape=model_a.input_shape[1:]) a_output = model_a(combined_input) b_output = model_b(a_output) combined_model = tf.keras.Model(inputs=combined_input, outputs=b_output) # 导出为SavedModel格式,用于TensorFlow Serving部署 combined_model.save("path/to/combined_model")
部署时直接把这个combined_model目录给到TensorFlow Serving,请求时指定模型名即可,完全不需要额外处理。
如果不想改动原模型的结构或文件,可以利用TensorFlow Serving的**复合模型(Composite Models)**功能,通过配置文件让服务自动完成模型A到B的输入输出传递。
步骤1:编写模型配置文件
创建一个model_config.proto文件,内容如下:
model_config_list { config { name: "model_a" base_path: "/models/model_a" model_platform: "tensorflow" } config { name: "model_b" base_path: "/models/model_b" model_platform: "tensorflow" } } composite_model_config_list { config { name: "a_to_b_pipeline" pipeline { step { model_name: "model_a" # 映射模型A的输出张量到模型B的输入张量 output_tensor_mapping { key: "model_a_output_tensor_name" # 替换成你模型A的实际输出张量名 value: "model_b_input_tensor_name" # 替换成你模型B的实际输入张量名 } } step { model_name: "model_b" } } } }
步骤2:启动TensorFlow Serving时指定配置文件
运行服务时加上--model_config_file参数:
tensorflow_model_server --port=8500 --model_config_file=/path/to/model_config.proto
之后你只需要向a_to_b_pipeline这个复合模型发起请求,服务会自动先执行模型A,把输出传给模型B,最终返回模型B的结果。
如果上面两种方案都满足不了你的特殊逻辑(比如需要在模型间做复杂的数据处理),可以自定义TensorFlow Serving的Servable类,实现模型A和B的串联逻辑。不过这个方式需要你熟悉TensorFlow Serving的底层API,开发成本较高,一般不推荐作为首选。
总结一下:如果没有特殊限制,优先选方案1,操作简单且性能最优;如果不能修改原模型文件,方案2是更合适的选择。
内容的提问来源于stack exchange,提问作者H.Gang

