通过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灵活控制服务器接受的最大数据量大小。