TensorFlow Serving执行器创建内核失败:index_type属性不在Op定义中
解决TensorFlow 1.6.0下gRPC请求TF Serving时的Fill Op 'index_type'属性错误
你遇到的问题核心很明确:TensorFlow 1.6.0中的Fill操作并不支持index_type这个属性,但你的模型NodeDef里却出现了这个属性,导致TF Serving的Executor无法创建对应的Kernel。
问题根源
在TensorFlow 1.6版本中,Fill Op的定义只有T这一个必填属性,index_type是后续版本(比如1.8及以上)才引入的扩展属性。你确认所有环境都是1.6.0,但模型里的rnn/MultiRNNCellZeroState/BasicLSTMCellZeroState/zeros这个Fill节点却带上了index_type=DT_INT32,大概率是以下情况之一:
- 模型构建时,某些代码(比如LSTM相关的辅助逻辑)无意中参考了高版本TF的写法,生成了这个不属于1.6的属性
- 导出模型的环境存在版本混淆(比如虽然表面是1.6,但依赖包中有高版本TF的残留文件)
- TF Serving的二进制实际并非基于1.6.0编译(比如误装了高版本的TF Serving)
解决方案
检查并修正模型构建代码:
定位到生成LSTM ZeroState的代码段,确保没有手动指定index_type参数。在TF1.6中,tf.fill或者LSTM自动生成的Fill节点不需要这个属性,直接移除相关的参数设置即可。重新导出模型:
- 清理Python环境,确保仅保留TensorFlow 1.6.0的依赖,避免版本冲突
- 使用TF1.6原生的
saved_model.builder.SavedModelBuilder重新导出模型,全程不要使用高版本TF的API或工具 - 导出后,可执行
saved_model_cli show --dir <你的模型路径> --all命令检查模型的Op定义,确认Fill节点没有index_type属性
验证TF Serving版本:
执行tensorflow_model_server --version命令,确认输出的版本确实是1.6.0。如果版本不符,重新安装对应版本的TF Serving。手动修复SavedModel(应急方案):
如果上面的方法都无法解决,可以尝试手动修改SavedModel中的节点定义:import tensorflow as tf from tensorflow.python.saved_model import loader from tensorflow.python.saved_model import signature_constants # 加载模型 sess = tf.Session() loader.load(sess, [signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY], "<你的模型路径>") # 找到目标节点并移除index_type属性 for node in sess.graph_def.node: if node.name == "rnn/MultiRNNCellZeroState/BasicLSTMCellZeroState/zeros": del node.attr["index_type"] break # 重新保存模型 builder = tf.saved_model.builder.SavedModelBuilder("<新的模型保存路径>") builder.add_meta_graph_and_variables( sess, [signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY], signature_def_map=sess.graph.get_collection(tf.GraphKeys.SIGNATURE_DEF) ) builder.save()用修复后的模型重新部署到TF Serving即可。
内容的提问来源于stack exchange,提问作者ecJon
相关产品推荐
相关产品推荐

