首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TorchServe:如何将输出的字节转换为张量

TorchServe:如何将输出的字节转换为张量
EN

Stack Overflow用户
提问于 2022-06-16 16:41:55
回答 1查看 268关注 0票数 1

我有一个使用TorchServe服务的模型。我正在使用TorchServe与gRPC服务器进行通信。定义的自定义处理程序的最终postprocess方法返回一个列表,该列表被转换为字节,以便通过网络进行传输。

后处理法

代码语言:javascript
运行
复制
def postprocess(self, data):
    # data type - torch.Tensor
    # data shape - [1, 17, 80, 64] and data dtype - torch.float32
    return data.tolist()

主要问题是在客户端,通过TorchServe将接收到的字节转换为火炬张量的工作效率不高。

代码语言:javascript
运行
复制
# 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.frombuffertorch.frombuffer返回以下错误。

代码语言:javascript
运行
复制
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

使用火炬

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-14 18:10:14

我发现在发送大张量的同时显着地提高了性能的一种方法是返回json列表。

在您的处理程序的后处理函数中:

代码语言:javascript
运行
复制
def postprocess(self, data):
    output_data = {}
    output_data['data'] = data.tolist()
    return [output_data]

在客户端接收grpc响应时,使用json.loads对其进行解码。

代码语言:javascript
运行
复制
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中的张量

代码语言:javascript
运行
复制
def postprocess(self, data):
    return [tf.io.serialize_tensor(data.cpu()).numpy()]

使用tf.io.parse_tensor解码它

代码语言:javascript
运行
复制
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())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72649228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档