建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
温馨提示

抱歉,您需设置社区昵称后才能参与社区互动!

前往修改
我再想想

PyTorch模型部署批量服务,出现输出格式问题

Armeria 2020/4/22 3033

我在使用PyTorch框架部署批量服务时遇到了输出格式问题,提交模型后始终无法正确评分。

以下提到的“输出文件”、“输出格式”都是指batchin.csv_result.txt文件中的内容。


  • baseline的输出文件(baseline评分成功,但我用PyTorch框架做不到这种输出格式):

    {"data": {"resp_data": "{\"wuhe_zhangheng\": [1, 2, 3]}"}}


  • 比赛网页上的要求(没试过,PyTorch框架做不到这种输出格式):  

    {"data":{"resp_data":{"wuhe_zhangheng":[1, 2, 3]}}}


  • 若直接按照如下代码返回

    def _postprocess(self, result_data):      schema = json.loads('{"wuhe_zhangheng":[1,2,3]}')        return json.dumps(schema)

    发现输出文件仅有最里面的一层"{\"wuhe_zhangheng\": [1, 2, 3]}"。用真实预测数据替代[1, 2, 3],评分失败。

    但同样代码,baseline却可以输出完整的可评分的三层JSON文件。请问这是什么原因?


  • 让_postprocess直接返回完整的三层JSON,得到的输出文件(提交评分失败):

    "{"data": {"resp_data": {"wuhe_zhangheng": [1, 2, 3]}}}"


我的config.json完全按照baseline设置,且输入都能正常解析。我的config代码见此: https://paste.ubuntu.com/p/VPTT6ZnrDs/

请问应该如何解决这一问题?官方推荐使用torch,能否提供torch的参考模板?


回复 (8)

Hiroid
0 0
2020/4/22 17:52
# 顶顶顶 # # 同求PyTorch的Baseline #
云上AI
0 0
2020/4/22 22:48

不同的框架,配置文件和推理代码写法不一样的,先研究下模型包规范:

https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0091.html


另外,这几个问题,可以好好看下:https://developer.huaweicloud.com/hero/forum.php?mod=viewthread&tid=51715

Armeria
0 0
2020/4/22 23:10
回复:云上AI 发表于 2020-4-22 22:48 不同的框架,配置文件和推理代码写法不一样的,先研究下模型包规范:https://support.huaweicloud.com/engineers-modela
老师好,您发的这些材料我都阅读过,我已经是按照PyTorch模型包规范写了配置文件和推理代码。除了最后的批量输出发生格式问题,之前的所有步骤(包括模型读取、数据预处理、预测等)都能正常跑通。 我认为我的问题集中在[这个表格](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0092.html#modelarts_23_0092__table17521240184711)(response结构)上。我的`_postprocess`函数确实按照`config.json`的设置返回了正确的`schema`(数值型数组),但`batchin.csv_results.txt`并没有遵循我在`config.json`中的设置的输出格式,导致评分失败。 因为还有另一组用PyTorch的选手也出现了完全一样的情况,所以我觉得这可能是一个比较通性的问题,想问下怎么解决。
云上AI
0 0
2020/4/23 09:07

回复:Armeria 发表于 2020-4-22 23:10 老师好,您发的这些材料我都阅读过,我已经是按照PyTorch模型包规范写了配置文件和推理代码。除了最后的批量输出发生格式问题,之前的所有步骤(包括模型读取、数据

这个题之前有同学用pytorch做过,再仔细看下配置文件和推理代码编写规范,也可以多参考示例:

https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0175.html

如果都按照规范写了还是有问题,那应该就是数据后处理代码有问题,你可以根据日志来排查代码。


2020/4/23 10:24

我也是同样的问题阿,,,有没有解决阿,,,,推理代码不停的出错,评分失败,推理代码改了40次,创建模型40个,部署40次,测试40次,每次要花好几分钟,,,,,一天的时间就浪费这在上面了,,,真是鸡肋,啊啊啊啊啊啊啊啊啊啊啊

云上AI

2020-4-24 11:18

点赞,把模型包规范搞明白了。
... 展开
2020/4/23 11:06

回复:云上AI 发表于 2020-4-23 09:07 这个题之前有同学用pytorch做过,再仔细看下配置文件和推理代码编写规范,也可以多参考示例:https://support.huaweicloud.com/e

我也是同样的问题,我按照这个范例编写了推理代码,但是仍然没有解决问题,评分仍然失败。按照赛事介绍中所说,_postprocess方法应该返回这个格式{"data":{"resp_data":{"wuhe_zhangheng":[1,4,5,6,4...]}}} ,类型为字符串。我也是按照这个格式返回的,模型的创建、部署和测试都没有问题,都能成功,就是评分失败,评分失败的原因是“判分作业运行失败。scoring job failed”。没有给出判分作业运行的具体的log,我们也不知道错在哪里,如何去改。。


Armeria
0 0
2020/4/23 11:26
回复:云上AI 发表于 2020-4-23 09:07 这个题之前有同学用pytorch做过,再仔细看下配置文件和推理代码编写规范,也可以多参考示例:https://support.huaweicloud.com/e
这个代码我也参考了。我的`config.json`已经发在顶楼里了,完全按照标准配置的。数据后处理代码`_postprocess`把能试的写法都试了(全写在顶楼里了),但无论按照baseline写,还是按照比赛网页的要求写,全是评分失败,而且找不到哪里能看到评分详情。 请问老师能否提供评分成功的`config.json`和数据后处理代码?不止一组PyTorch的队伍遇到相同问题无法解决了啊(哭
2020/4/23 15:10
摸索了两天,终于判分成功了。这个问题也解决了。先上代码 ```python from model_service.pytorch_model_service import PTServingBaseService import json import pandas as pd from pandas import to_datetime import numpy as np import torch import torch.nn.functional as F import torch.nn as nn import logging logger = logging.getLogger(__name__) class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.layer1 = nn.Linear(in_features=2, out_features=10, bias=True) self.layer2 = nn.Linear(in_features=10, out_features=50, bias=True) self.layer3 = nn.Linear(in_features=50, out_features=100, bias=True) self.layer4 = nn.Linear(in_features=100, out_features=20, bias=True) self.layer5 = nn.Linear(in_features=20, out_features=1, bias=True) def forward(self, inputs): outputs = F.logsigmoid(self.layer1(inputs)) outputs = F.logsigmoid(self.layer2(outputs)) outputs = F.logsigmoid(self.layer3(outputs)) outputs = F.logsigmoid(self.layer4(outputs)) outputs = F.logsigmoid(self.layer5(outputs)) return outputs class user_Service(PTServingBaseService): def __init__(self, model_name, model_path): #print('begin to init') logger.info("begin to init") super(user_Service, self).__init__(model_name, model_path) self.model_name = model_name self.model_path = model_path model = Net() model.load_state_dict(torch.load(self.model_path)) self.model = model print('model_name:', model_name) print('model_path:', model_path) #print('end to init') logger.info("end to init") def _preprocess(self, data): logger.info("begin to pre process") #print('begin to pre process') print('data:',data) days = data["req_data"][0].split(",") df = pd.DataFrame(columns = ["weekday", "timeindex"]) for day in days: timestamp = to_datetime(day, format="%Y-%m-%d") df1 = pd.DataFrame({"weekday":(timestamp.dayofweek/6.0), "timeindex":(np.arange(300, 1256, 5))/(24 * 60.0)}) df = df.append(df1, ignore_index=True) input_data = np.array(df, dtype=np.float32) input_data = torch.tensor(input_data) #print('end to pre process') logger.info("end to pre process") return input_data def _inference(self, data): #print('start to infer') logger.info("start to infer") predict = self.model(data) #print('end to infer') logger.info("end to infer") return predict def _postprocess(self, result_data): predict = result_data.detach().numpy() mean = 23.019272 std = 13.458502 predict = (predict * std) + mean predict = np.reshape(predict, (predict.shape[0])) predict = predict.tolist() tmp = {"wuhe_zhangheng":''} tmp["wuhe_zhangheng"] = predict predict = json.dumps(tmp) output = {"data":{"resp_data":''}} output['data']['resp_data'] = predict #output变量类型是一个dict对象,不是字符串 return output ``` ``` { "model_algorithm": "traffic-prediction", "model_type": "PyTorch", "runtime": "python3.6", "metrics": {}, "apis": [ { "procotol": "http", "url": "/", "method": "post", "request": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { "req_data": { "type": "array", "items": [ { "type": "string" } ] } } } }, "response": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { "resp_data": { "type": "array", "items": [ { "type": "number" } ] } } } } } ], "dependencies": [ { "installer": "pip", "packages": [ { "restraint": "", "package_version": "", "package_name": "numpy" }, { "restraint": "", "package_version": "", "package_name": "pandas" } ] } ] } ``` 这个问题主要的原因是_postprocess方法返回的类型和格式不对。 # 1.类型 _postprocess方法返回的output变量的类型是dict对象。我没有测试过将output转为str的情况,因为今天已经超过的提交评分的次数了,没法测试了,但是output为dict对象时,确实能评分成功。 # 2.格式 官方的赛事介绍里说明_postprocess返回的格式是{"data":{"resp_data":{"wuhe_zhangheng":[1,4,5,6,4...]}}},是一个json格式的字符串,我按照这个格式返回,测试过多次,仍然评分失败。但是实际上的格式应该为{"data":{"resp_data":'{"wuhe_zhangheng":[1,4,5,6,4...]}'}},注意主要的区别就是下划线部分,下划线部分因该是字符串,不是dict对象,将下划线部分用引号包起来就可以了。 # 官方文档没说清楚,真是害死人,在论坛上问,又说代码问题,自行解决。这些东西花了两天时间一点一点猜,一点一点试,最后终于试出来了,如果推理代码能够方便的调试,根本能很快的解决。

Armeria

2020-4-23 15:35

感谢!!
... 展开

Hiroid

2020-4-24 08:07

感谢!!!
... 展开
上划加载中
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

Armeria

角色:成员

话题:1

发消息
发表于2020年04月22日 17:49:41 30338
直达本楼层的链接
楼主
倒序浏览 只看该作者
[热身赛咨询] PyTorch模型部署批量服务,出现输出格式问题

我在使用PyTorch框架部署批量服务时遇到了输出格式问题,提交模型后始终无法正确评分。

以下提到的“输出文件”、“输出格式”都是指batchin.csv_result.txt文件中的内容。


  • baseline的输出文件(baseline评分成功,但我用PyTorch框架做不到这种输出格式):

    {"data": {"resp_data": "{\"wuhe_zhangheng\": [1, 2, 3]}"}}


  • 比赛网页上的要求(没试过,PyTorch框架做不到这种输出格式):  

    {"data":{"resp_data":{"wuhe_zhangheng":[1, 2, 3]}}}


  • 若直接按照如下代码返回

    def _postprocess(self, result_data):      schema = json.loads('{"wuhe_zhangheng":[1,2,3]}')        return json.dumps(schema)

    发现输出文件仅有最里面的一层"{\"wuhe_zhangheng\": [1, 2, 3]}"。用真实预测数据替代[1, 2, 3],评分失败。

    但同样代码,baseline却可以输出完整的可评分的三层JSON文件。请问这是什么原因?


  • 让_postprocess直接返回完整的三层JSON,得到的输出文件(提交评分失败):

    "{"data": {"resp_data": {"wuhe_zhangheng": [1, 2, 3]}}}"


我的config.json完全按照baseline设置,且输入都能正常解析。我的config代码见此: https://paste.ubuntu.com/p/VPTT6ZnrDs/

请问应该如何解决这一问题?官方推荐使用torch,能否提供torch的参考模板?


点赞 举报
分享

分享文章到朋友圈

分享文章到微博

Hiroid

角色:成员

话题:0

发消息
发表于2020年04月22日 17:52:04
直达本楼层的链接
沙发
只看该作者
# 顶顶顶 # # 同求PyTorch的Baseline #
点赞 评论 引用 举报

云上AI

角色:导师

话题:14

发消息
发表于2020年04月22日 22:48:04
直达本楼层的链接
板凳
只看该作者

不同的框架,配置文件和推理代码写法不一样的,先研究下模型包规范:

https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0091.html


另外,这几个问题,可以好好看下:https://developer.huaweicloud.com/hero/forum.php?mod=viewthread&tid=51715

点赞 评论 引用 举报

Armeria

角色:成员

话题:1

发消息
发表于2020年04月22日 23:10:53
直达本楼层的链接
地板
只看该作者
回复:云上AI 发表于 2020-4-22 22:48 不同的框架,配置文件和推理代码写法不一样的,先研究下模型包规范:https://support.huaweicloud.com/engineers-modela
老师好,您发的这些材料我都阅读过,我已经是按照PyTorch模型包规范写了配置文件和推理代码。除了最后的批量输出发生格式问题,之前的所有步骤(包括模型读取、数据预处理、预测等)都能正常跑通。 我认为我的问题集中在[这个表格](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0092.html#modelarts_23_0092__table17521240184711)(response结构)上。我的`_postprocess`函数确实按照`config.json`的设置返回了正确的`schema`(数值型数组),但`batchin.csv_results.txt`并没有遵循我在`config.json`中的设置的输出格式,导致评分失败。 因为还有另一组用PyTorch的选手也出现了完全一样的情况,所以我觉得这可能是一个比较通性的问题,想问下怎么解决。
点赞 评论 引用 举报

云上AI

角色:导师

话题:14

发消息
发表于2020年04月23日 09:07:31
直达本楼层的链接
5#
只看该作者

回复:Armeria 发表于 2020-4-22 23:10 老师好,您发的这些材料我都阅读过,我已经是按照PyTorch模型包规范写了配置文件和推理代码。除了最后的批量输出发生格式问题,之前的所有步骤(包括模型读取、数据

这个题之前有同学用pytorch做过,再仔细看下配置文件和推理代码编写规范,也可以多参考示例:

https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0175.html

如果都按照规范写了还是有问题,那应该就是数据后处理代码有问题,你可以根据日志来排查代码。


点赞 评论 引用 举报

寒冬夜行人

角色:成员

话题:1

发消息
发表于2020年04月23日 10:24:08
直达本楼层的链接
6#
只看该作者

我也是同样的问题阿,,,有没有解决阿,,,,推理代码不停的出错,评分失败,推理代码改了40次,创建模型40个,部署40次,测试40次,每次要花好几分钟,,,,,一天的时间就浪费这在上面了,,,真是鸡肋,啊啊啊啊啊啊啊啊啊啊啊

评论
云上AI 2020-4-24 11:18 评论

点赞,把模型包规范搞明白了。

... 查看全部
点赞 评论 引用 举报

寒冬夜行人

角色:成员

话题:1

发消息
发表于2020年04月23日 11:06:53
直达本楼层的链接
7#
只看该作者

回复:云上AI 发表于 2020-4-23 09:07 这个题之前有同学用pytorch做过,再仔细看下配置文件和推理代码编写规范,也可以多参考示例:https://support.huaweicloud.com/e

我也是同样的问题,我按照这个范例编写了推理代码,但是仍然没有解决问题,评分仍然失败。按照赛事介绍中所说,_postprocess方法应该返回这个格式{"data":{"resp_data":{"wuhe_zhangheng":[1,4,5,6,4...]}}} ,类型为字符串。我也是按照这个格式返回的,模型的创建、部署和测试都没有问题,都能成功,就是评分失败,评分失败的原因是“判分作业运行失败。scoring job failed”。没有给出判分作业运行的具体的log,我们也不知道错在哪里,如何去改。。


点赞1 评论 引用 举报

Armeria

角色:成员

话题:1

发消息
发表于2020年04月23日 11:26:40
直达本楼层的链接
8#
只看该作者
回复:云上AI 发表于 2020-4-23 09:07 这个题之前有同学用pytorch做过,再仔细看下配置文件和推理代码编写规范,也可以多参考示例:https://support.huaweicloud.com/e
这个代码我也参考了。我的`config.json`已经发在顶楼里了,完全按照标准配置的。数据后处理代码`_postprocess`把能试的写法都试了(全写在顶楼里了),但无论按照baseline写,还是按照比赛网页的要求写,全是评分失败,而且找不到哪里能看到评分详情。 请问老师能否提供评分成功的`config.json`和数据后处理代码?不止一组PyTorch的队伍遇到相同问题无法解决了啊(哭
点赞 评论 引用 举报

寒冬夜行人

角色:成员

话题:1

发消息
发表于2020年04月23日 15:10:52
直达本楼层的链接
9#
只看该作者
摸索了两天,终于判分成功了。这个问题也解决了。先上代码 ```python from model_service.pytorch_model_service import PTServingBaseService import json import pandas as pd from pandas import to_datetime import numpy as np import torch import torch.nn.functional as F import torch.nn as nn import logging logger = logging.getLogger(__name__) class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.layer1 = nn.Linear(in_features=2, out_features=10, bias=True) self.layer2 = nn.Linear(in_features=10, out_features=50, bias=True) self.layer3 = nn.Linear(in_features=50, out_features=100, bias=True) self.layer4 = nn.Linear(in_features=100, out_features=20, bias=True) self.layer5 = nn.Linear(in_features=20, out_features=1, bias=True) def forward(self, inputs): outputs = F.logsigmoid(self.layer1(inputs)) outputs = F.logsigmoid(self.layer2(outputs)) outputs = F.logsigmoid(self.layer3(outputs)) outputs = F.logsigmoid(self.layer4(outputs)) outputs = F.logsigmoid(self.layer5(outputs)) return outputs class user_Service(PTServingBaseService): def __init__(self, model_name, model_path): #print('begin to init') logger.info("begin to init") super(user_Service, self).__init__(model_name, model_path) self.model_name = model_name self.model_path = model_path model = Net() model.load_state_dict(torch.load(self.model_path)) self.model = model print('model_name:', model_name) print('model_path:', model_path) #print('end to init') logger.info("end to init") def _preprocess(self, data): logger.info("begin to pre process") #print('begin to pre process') print('data:',data) days = data["req_data"][0].split(",") df = pd.DataFrame(columns = ["weekday", "timeindex"]) for day in days: timestamp = to_datetime(day, format="%Y-%m-%d") df1 = pd.DataFrame({"weekday":(timestamp.dayofweek/6.0), "timeindex":(np.arange(300, 1256, 5))/(24 * 60.0)}) df = df.append(df1, ignore_index=True) input_data = np.array(df, dtype=np.float32) input_data = torch.tensor(input_data) #print('end to pre process') logger.info("end to pre process") return input_data def _inference(self, data): #print('start to infer') logger.info("start to infer") predict = self.model(data) #print('end to infer') logger.info("end to infer") return predict def _postprocess(self, result_data): predict = result_data.detach().numpy() mean = 23.019272 std = 13.458502 predict = (predict * std) + mean predict = np.reshape(predict, (predict.shape[0])) predict = predict.tolist() tmp = {"wuhe_zhangheng":''} tmp["wuhe_zhangheng"] = predict predict = json.dumps(tmp) output = {"data":{"resp_data":''}} output['data']['resp_data'] = predict #output变量类型是一个dict对象,不是字符串 return output ``` ``` { "model_algorithm": "traffic-prediction", "model_type": "PyTorch", "runtime": "python3.6", "metrics": {}, "apis": [ { "procotol": "http", "url": "/", "method": "post", "request": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { "req_data": { "type": "array", "items": [ { "type": "string" } ] } } } }, "response": { "Content-type": "applicaton/json", "data": { "type": "object", "properties": { "resp_data": { "type": "array", "items": [ { "type": "number" } ] } } } } } ], "dependencies": [ { "installer": "pip", "packages": [ { "restraint": "", "package_version": "", "package_name": "numpy" }, { "restraint": "", "package_version": "", "package_name": "pandas" } ] } ] } ``` 这个问题主要的原因是_postprocess方法返回的类型和格式不对。 # 1.类型 _postprocess方法返回的output变量的类型是dict对象。我没有测试过将output转为str的情况,因为今天已经超过的提交评分的次数了,没法测试了,但是output为dict对象时,确实能评分成功。 # 2.格式 官方的赛事介绍里说明_postprocess返回的格式是{"data":{"resp_data":{"wuhe_zhangheng":[1,4,5,6,4...]}}},是一个json格式的字符串,我按照这个格式返回,测试过多次,仍然评分失败。但是实际上的格式应该为{"data":{"resp_data":'{"wuhe_zhangheng":[1,4,5,6,4...]}'}},注意主要的区别就是下划线部分,下划线部分因该是字符串,不是dict对象,将下划线部分用引号包起来就可以了。 # 官方文档没说清楚,真是害死人,在论坛上问,又说代码问题,自行解决。这些东西花了两天时间一点一点猜,一点一点试,最后终于试出来了,如果推理代码能够方便的调试,根本能很快的解决。
评论
Armeria 2020-4-23 15:35 评论

感谢!!

... 查看全部
Hiroid 2020-4-24 08:07 评论

感谢!!!

... 查看全部
点赞 评论 引用 举报

游客

您需要登录后才可以回帖 登录 | 立即注册