TensorFlow Serving与本地加载同一模型预测结果不一致排查
输出不一致的核心原因
两侧给模型传入的三个输入张量存在完全错位的键值映射,根本没有把同一组数据喂给模型,输出自然存在极大差异。
具体错误的映射细节
本地加载模型的输入错配
你本地构造模型输入的代码存在键值对应错误:
inputs = { 'input_word_ids': tf.convert_to_tensor([encodes['input_ids']]), # 该键值匹配正确 'input_mask': tf.convert_to_tensor([encodes['token_type_ids']]), # 匹配错误 'input_type_ids': tf.convert_to_tensor([encodes['token_type_ids']]) # 该键值匹配正确 }
input_mask是Bert模型要求的注意力掩码,作用是标记序列中哪些位置是有效文本、哪些是填充的[PAD],本该传入tokenizer返回的attention_mask字段,但你错误传入了token_type_ids(段类型id,用于区分拼接的两个句子),二者语义、取值分布完全不同。
TensorFlow Serving端的输入错配
你在构造Serving推理请求时的键值错配更严重,之前尝试调整输入的嵌套结构,但没有修正每个键对应的实际取值,所以问题依然存在:
inputs= {"instances": [{"input_word_ids": encodes['input_ids'], "input_mask": encodes['input_ids'], "input_type_ids": encodes['input_ids']}]}
- 你给三个输入通道全都塞了同一份
input_ids:本该传注意力掩码的input_mask、本该传段类型id的input_type_ids,都直接传了文本转成的字id序列,完全不符合模型输入要求。
正确的输入对应规则
结合Bert模型的输入要求、以及tokenizer encode_plus的返回字段,正确的映射关系应该是:
input_word_ids→ 取tokenizer返回的input_ids(文本转换后的token id序列)input_mask→ 取tokenizer返回的attention_mask(0/1取值的注意力标记)input_type_ids→ 取tokenizer返回的token_type_ids(0/1取值的段类型标记)
快速验证方法
不需要跑模型就能定位问题:把本地构造好的三个输入张量、Serving请求里的三个数组单独打印出来逐元素对比,就能发现两边的input_mask、input_type_ids从根上就不是同一份数据,甚至Serving端传入的掩码、段类型字段是取值为大整数的token id,根本不是0/1的标记值。
内容的提问来源于stack exchange,提问作者ibmxiang2021
相关产品推荐
相关产品推荐

