tfserving 启动后 curl 返回 404 或 503,主因是默认仅暴露 /v1/models/{name} 等路径,不响应 / 或 /healthz;需用带模型名的完整路径(如 /v1/models/my_model),预测须加 :predict 后缀;模型目录必须含版本号子目录(如 1/)及 saved_model.pb 和 variables/,且权限可读;--rest_api_port=0 会关闭 http 接口。

为什么 TFServing 启动后 curl 返回 404 或 503?
不是模型没加载,而是默认只暴露 /v1/models/{name} 这类路径,不响应根路径 / 或 /healthz。TFServing 不提供 Web 页面,也不自动注册健康检查端点(除非显式配置)。
- 必须用带模型名的完整路径请求,例如:
curl http://localhost:8501/v1/models/my_model - 预测接口要加
:predict后缀:curl -X POST http://localhost:8501/v1/models/my_model:predict -d '{"instances": [...]}' - 如果模型目录结构不对(比如多了一层
1/子目录但没放saved_model.pb),tensorflow_model_server日志里会报Failed to load servable,但进程仍可能正常运行——这时所有请求都会返回 503 -
--rest_api_port=0会关闭 HTTP 接口,只留 gRPC;确认启动命令里没这个参数
如何让 TFServing 正确加载 SavedModel?
关键不在模型训练过程,而在导出后的目录层级和权限。TFServing 要求模型路径下直接是版本号子目录(如 1/、2/),每个版本内必须包含 saved_model.pb 和 variables/ 文件夹。
- 导出时用
tf.keras.models.save_model(model, 'my_model/1', save_format='tf'),注意末尾的/1是必需的版本号目录 - 不要手动改名或移动
saved_model.pb到父级;TFServing 不识别my_model/saved_model.pb这种结构 - Linux 下确保模型目录可读:
chmod -R a+r my_model/,否则 worker 进程可能静默跳过加载 - 多个版本共存时,TFServing 默认只加载最新数字版本(如
2/),旧版本不会被卸载也不会响应请求
gRPC 和 REST API 的输入格式到底差在哪?
REST 接口把 tensor 数据转成 JSON 数组,而 gRPC 用 Protocol Buffer 序列化原始二进制数据。同一模型,两种协议对输入 shape、dtype、嵌套层级的要求完全一致,但序列化方式不同,导致错误表现也不同。
- REST 请求体中
instances必须是 list of dict,每个 dict 对应一个样本,key 是 input tensor 名(如"input_1"),value 是 Python list 形式的值;不能传 numpy.ndarray - gRPC 的
PredictRequest需要显式指定signature_name(默认是"serving_default"),REST 则自动使用该签名 - 整数类型在 REST 中容易被误转为 float(JSON 无 int 类型),导致
Invalid argument: input data type doesn't match model;建议在模型导出时用tf.int32显式声明 input spec - 大尺寸图像或 embedding 输入时,REST 因 base64 编码+JSON 解析开销,吞吐比 gRPC 低 30%–50%
并发压测时连接超时或响应延迟飙升,怎么调?
TFServing 默认单进程、单线程处理 gRPC,HTTP 层用的是同步阻塞模型,瓶颈常在 CPU 绑定和线程池配置,而不是网络或模型本身。
- 启动时加
--tensorflow_intra_op_parallelism=0 --tensorflow_inter_op_parallelism=0,让 TF 自动根据 CPU 核数分配线程,避免争抢 - 限制最大并发请求数:通过
--max_num_loaders=1和--model_config_file_poll_wait_seconds=30防止热加载抖动;实际限流建议放在 Nginx 或 API 网关层 - 模型太大(>1GB)时,首次请求延迟高是正常的——TFServing 是 lazy load,第一次
:predict才真正初始化变量和图;可用curl -X POST http://localhost:8501/v1/models/my_model:predict -d '{}'提前触发 - 别用
localhost压测:Docker 容器内访问宿主机127.0.0.1会绕过 host 网络栈,导致性能失真;统一用host.docker.internal或真实 IP
最常被忽略的是模型路径的版本号命名和文件权限——这两个点不出错,90% 的 404/503 就没了。剩下的性能问题,基本都卡在 CPU 线程配比和第一次请求的 lazy load 上。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










