通过MindSpore Serving gRPC客户端发送超大消息报错

现象:

某同学通过MindSpore Serving gRPC客户端向服务器发送消息时,发生了报错,错误信息如下:

test_serving_client_grpc.py::test_serving_grpc_pressure_big_message E0413 20:03:08.764913058 122601 byte_stream.cc:40] assertion failed: slice_buffer->length <= UINT32_MAX
Fatal Python error: Aborted
Current thread 0x0000ffffb4884010 (most recent call first):
File ".../python3.7/site-packages/grpc/_channel.py", line 909 in _blocking
File ".../python3.7/site-packages/grpc/_channel.py", line 922 in call
File ".../python3.7/site-packages/mindspore_serving/client/python/client.py", line 217 in infer
File .../serving/test_serving_client_grpc.py", line 916 in test_serving_grpc_pressure_big_message

下面还有一些调用堆栈这里就省略了,MindSpore Serving提供Python Client封装gRPC消息通信,这位同学刻意地从客户端构造并发了一个超大的消息,然后gRPC底层校验发现消息大小大于4G(UINT32_MAX)

slice_buffer->length <= UINT32_MAX

所以,遇到这样的错误,就是消息超大了,超过了4G。

进一步的

MindSpore Serving默认设置了服务器接受消息大小为100MB,即下面的max_msg_mb_size参数控制。

def start_grpc_server(address, max_msg_mb_size=100, ssl_config=None):
def start_restful_server(address, max_msg_mb_size=100, ssl_config=None):

max_msg_mb_size接受[1,512]范围的整数数值,即可控制最大接收到的消息大小为1~512MB。

如果超过了服务器的限定值,客户端将报类似以下错误,其中104857600即是服务器默认的限定100MB:

Received message larger than max (419429033 vs. 104857600)
RESOURCE_EXHAUSTED
(8, 'resource exhausted')

客户端已通过参数限定最大发送消息大小为512MB。

如果超过这个数值,客户端将会报类似这个错误:

Sent message larger than max (838858033 vs. 536870912)
RESOURCE_EXHAUSTED
(8, 'resource exhausted')

MindSpore Serving支持在服务器侧定义模型相关的预处理和后处理,所以从客户端发往服务器一般仅需要原始数据,比如jpg等压缩图像或文字即可,数据量大小一般较小。当然,MindSpore Serving支持从客户端发送的数据是模型的直接输入,比如预处理完后的数据,此时数据量一般较大。用户可以通过max_msg_mb_size灵活控制服务器接受的最大数据量大小。

posted @ 2021-12-30 19:29  MS小白  阅读(130)  评论(0)    收藏  举报