TensorFlow Serving仅支持推理,需用tf.saved_model.save()导出符合协议的SavedModel;签名函数必须返回字符串键的dict,Keras模型推荐用model.signatures["serving_default"];导出路径须为绝对路径、版本号为纯数字子目录;启动时--model_name须与目录名一致,请求需匹配signature_name;input_signature数据类型必须与客户端请求严格一致。

TensorFlow Serving 本身不负责模型训练,只做推理服务;导出模型必须用 tf.saved_model.save() 生成符合其协议的 SavedModel 目录结构,否则服务启动后会报 Failed to load servable 或 Not a valid SavedModel。
导出模型前必须确保签名函数(signature_fn)定义正确
TensorFlow Serving 依赖 tf.saved_model.save() 中的 signatures 参数来识别输入输出格式。没有显式指定,或签名函数返回值不是 dict(键为字符串、值为 tf.Tensor),会导致请求时出现 Expected one signature, but found none 或 Signature key not found。
- 对 Keras 模型,推荐用
model.signatures["serving_default"]自动推导,但需先调用model.predict()或model.__call__()确保计算图已构建 - 自定义模型必须手动构造
@tf.function并标注input_signature,例如:@tf.function(input_signature=[tf.TensorSpec([None, 224, 224, 3], tf.float32)])<br>def serve_fn(x):<br> return {"output": self.model(x)} - 签名函数返回的 dict 键名会成为 gRPC/REST 接口的 output key,务必与客户端请求中
outputs字段一致
导出路径必须是绝对路径且无中文/空格
TensorFlow Serving 启动时通过 --model_base_path 加载模型,它内部用 os.path.join 拼接版本号子目录(如 1/)。若导出路径含相对路径、中文、空格或符号链接,会出现 Failed to get model specification 或静默跳过加载。
- 导出时用
os.path.abspath("my_model")显式转为绝对路径 - 版本号必须是纯数字子目录(如
/models/my_model/1/),不能是latest或v1 - 检查导出后目录是否包含
saved_model.pb和variables/子目录,缺一不可
启动服务时要匹配模型的 signature_name 和 model_name
TensorFlow Serving 默认只加载 serving_default 签名;若导出时用了自定义签名名(如 "predict"),但请求时仍用默认名,就会返回 Signature name "serving_default" not found。
立即学习“Python免费学习笔记(深入)”;
- 启动命令中
--model_name必须与--model_base_path下的目录名一致(如/models/resnet50/→--model_name=resnet50) - gRPC 请求需在
PredictRequest中显式设model_spec.signature_name = "predict" - REST 请求 URL 应为
http://localhost:8501/v1/models/resnet50:predict(注意末尾的:predict) - 可用
curl http://localhost:8501/v1/models/resnet50检查当前加载的签名列表
最容易被忽略的是:SavedModel 导出时的 input_signature 类型必须与实际请求数据完全匹配——比如导出用 tf.float32,但客户端传 float64,服务不会报错,而是返回全零输出或 NaN,调试时极难定位。


















