部署TensorFlow读文本程序至TensorFlow Serving时遇tensor proto转换TypeError
解决TensorFlow Serving部署时
tf.contrib.util.make_tensor_proto类型错误问题 我之前帮很多开发者踩过TF Serving部署的这个坑,你的问题核心就是输入数据和模型张量的匹配出了问题,还有部署场景下的逻辑适配没做好,咱们一步步来解决:
错误原因拆解
这个TypeError本质是tf.make_tensor_proto(旧版是tf.contrib.util.make_tensor_proto)没法把你传入的输入转换成TF Serving需要的张量协议格式,常见触发点有两个:
- 输入格式不匹配:比如你传了单个字符串,但模型占位符期望的是批量字符串数组;
- 模型逻辑不适配部署:你代码里的
tf.read...应该是让模型读文件吧?本地运行没问题,但TF Serving部署后,服务器根本访问不到你本地的文件路径。
具体修复方案
1. 修正输入占位符定义
首先要让输入占位符支持批量请求(哪怕是单条数据,TF Serving也期望用数组包装):
# 把原来的占位符改成支持批量的shape x = tf.placeholder(tf.string, shape=[None], name="x")
2. 调整模型的文本处理逻辑
把“让模型读文件”的逻辑移到客户端来做,服务器只负责处理文本内容:
# --- 客户端代码 --- # 先在本地读取文本文件内容 with open("your_input_file.txt", "r", encoding="utf-8") as f: text_content = f.read() # --- 模型代码 --- # 直接处理传入的字符串张量,比如做预处理(转小写、分词等) processed_text = tf.strings.lower(x) # 后续的网络计算逻辑...
3. 客户端发送请求的正确格式
不管用REST还是gRPC,都要确保输入是字符串数组:
- REST API请求体示例:
{ "instances": ["这里是你读取到的文本内容"] } - Python gRPC客户端示例:
import tensorflow as tf from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc # 生成符合要求的张量proto input_tensor = tf.make_tensor_proto([text_content], dtype=tf.string) # 构造预测请求 request = predict_pb2.PredictRequest() request.model_spec.name = "你的模型名称" request.model_spec.version.value = 2 # 对应你定义的model_version request.inputs["x"].CopyFrom(input_tensor)
4. 适配TensorFlow版本
如果用的是TensorFlow 2.x,tf.contrib.util.make_tensor_proto已经被弃用,直接用tf.make_tensor_proto就行。另外尽量保证客户端和服务器端的TF版本一致,避免API差异导致的奇怪问题。
验证步骤
调整完后,先在本地测试模型的输入输出是否正常,确认没问题再部署到TF Serving,这样能提前排除大部分格式问题。
内容的提问来源于stack exchange,提问作者jane1912
相关产品推荐
相关产品推荐

