我有一个使用TorchServe服务的模型。我正在使用TorchServe与gRPC服务器进行通信。定义的自定义处理程序的最终postprocess
方法返回一个列表,该列表被转换为字节,以便通过网络进行传输。
后处理法
def postprocess(self, data):
# data type - torch.Tensor
# data shape - [1, 17, 80, 64] and data dtype - torch.float32
return data.tolist()
主要问题是在客户端,通过TorchServe将接收到的字节转换为火炬张量的工作效率不高。
# This takes 0.3 seconds
response = self.inference_stub.Predictions(
inference_pb2.PredictionsRequest(model_name=model_name, input=input_data))
# This takes 0.84 seconds
predictions = torch.as_tensor(literal_eval(
response.prediction.decode('utf-8')))
使用numpy.frombuffer
或torch.frombuffer
返回以下错误。
import numpy as np
np.frombuffer(response.prediction)
Traceback (most recent call last):
File "<string>", line 1, in <module>
ValueError: buffer size must be a multiple of element size
np.frombuffer(response.prediction, dtype=np.float32)
Traceback (most recent call last):
File "<string>", line 1, in <module>
ValueError: buffer size must be a multiple of element size
使用火炬
import torch
torch.frombuffer(response.prediction, dtype = torch.float32)
Traceback (most recent call last):
File "<string>", line 1, in <module>
ValueError: buffer length (2601542 bytes) after offset (0 bytes) must be a multiple of element size (4)
是否有更有效的替代方案将接收到的字节转换为torch.Tensor
?
发布于 2022-09-14 18:10:14
我发现在发送大张量的同时显着地提高了性能的一种方法是返回json列表。
在您的处理程序的后处理函数中:
def postprocess(self, data):
output_data = {}
output_data['data'] = data.tolist()
return [output_data]
在客户端接收grpc响应时,使用json.loads
对其进行解码。
response = self.inference_stub.Predictions(
inference_pb2.PredictionsRequest(model_name=model_name, input=input_data))
decoded_output = response.prediction.decode('utf-8')
preds = torch.as_tensor(json.loads(decoded_output))
preds
应该有输出张量
更新
有一个更快的方法,应该完全解决瓶颈。使用tensorflow中的tf.io.serialize_tensor
序列化postprocess
中的张量
def postprocess(self, data):
return [tf.io.serialize_tensor(data.cpu()).numpy()]
使用tf.io.parse_tensor
解码它
response = self.inference_stub.Predictions(
inference_pb2.PredictionsRequest(model_name=model_name, input=input_data))
prediction = response.prediction
torch.as_tensor(tf.io.parse_tensor(prediction, out_type=tf.float32).numpy())
https://stackoverflow.com/questions/72649228
复制相似问题