Python gRPC客户端调用返回StatusCode.INTERNAL错误求助
问题复现
这是一套Python实现的gRPC服务与客户端程序,开发者刚接触API开发,对gRPC使用经验较少,已完成gRPC及相关依赖库安装。当前服务端运行正常,在本地localhost环境执行客户端脚本时,gRPC通信终止并抛出StatusCode.INTERNAL错误,完整报错栈如下:
return _end_unary_response_blocking(state, call, False, None) File "/home/mark/anaconda3/envs/custom-model-server/lib/python3.8/site-packages/grpc/_channel.py", line 849, in _end_unary_response_blocking raise _InactiveRpcError(state) grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with: status = StatusCode.INTERNAL details = "indices[0,350] = 1650751580 is not in [0, 30522) [[{{node tf_bert_for_sequence_classification/bert/embeddings/Gather}}]]" debug_error_string = "{\"created\":\"@1629922773.170809502\",\"description\":\"Error received from peer ipv4:127.0.0.1:8001\",\"file\":\"src/core/lib/surface/call.cc\",\"file_line\":1066,\"grpc_message\":\"indices[0,350] = 1650751580 is not in [0, 30522)\n\t [[{{node tf_bert_for_sequence_classification/bert/embeddings/Gather}}]]\",\"grpc_status\":13}"
问题根因
该错误和gRPC通信本身无关,gRPC只是透传了服务端的内部运行错误。报错本质是服务端部署的BERT文本分类模型在运行时抛出了参数越界异常:
当前使用的BERT模型词表大小为30522,词嵌入层查询的合法索引范围是0 ~ 30521,但输入模型的索引序列第0个样本的第350位值为1650751580,完全超出合法范围,导致嵌入层Gather操作失败。
排查方向
- 校验分词器一致性:确认客户端做文本分词使用的分词器,和服务端训练模型时用的分词器完全匹配,包括分词器版本、词表文件、特殊标记定义,分词器不匹配会导致OOV词汇被映射到非法索引。
- 检查gRPC序列化逻辑:确认客户端向服务端传输索引序列时,有没有出现类型序列化错误,比如把整形索引误转成字符串后再转整形、数值溢出、大小端编码错误等问题,导致合法索引传到服务端后变成异常超大值。
- 校验服务端入参:服务端收到客户端的请求后,先打印输出索引序列的数值范围,确认异常值是客户端传输错误导致,还是服务端后续预处理逻辑生成的。
- 检查序列截断填充逻辑:报错的异常值出现在第350位,确认你的序列最大长度设置、截断逻辑、填充值设置是否正确,有没有填充时误用了超出词表范围的数值作为填充标记。
内容的提问来源于stack exchange,提问作者Bhuvan Tej Kanigiri
相关产品推荐
相关产品推荐

