Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HttpOptions模式启动,预测失败 #57

Open
T-ze-yu opened this issue Apr 8, 2024 · 39 comments
Open

HttpOptions模式启动,预测失败 #57

T-ze-yu opened this issue Apr 8, 2024 · 39 comments

Comments

@T-ze-yu
Copy link

T-ze-yu commented Apr 8, 2024

尝试使用HttpOptions模式来启动服务并预测,参考文档:https://www.secretflow.org.cn/zh-CN/docs/serving/0.2.0b0/reference/config#featuresourceconfig、https://www.secretflow.org.cn/zh-CN/docs/serving/0.2.0b0/topics/system/feature_service,
创建服务好像成功了,但在预测的时候报错了:

image

具体日志文件如下
ss.log

@huocun-ant
Copy link
Collaborator

我看你的http配的地址是

http://127.0.0.1/BatchFeatureService/BatchFetchFeature

这个的意思是你需要在这个地址处启动一个feature_service的服务,这个服务满足SPI的接口定义,在跑预测的时候,serving会从发请求给这个地址,这个地址会返回对应的数据。

你可以使用serving自带的工具来启动一个简单的feature_service, 源码在这里, https://github.com/secretflow/serving/blob/main/secretflow_serving/tools/simple_feature_service/main.cc

启动的参数包括一个端口号,一个文件名和id的列名,
image

@huocun-ant
Copy link
Collaborator

我看你的http配的地址是

http://127.0.0.1/BatchFeatureService/BatchFetchFeature

这个的意思是你需要在这个地址处启动一个feature_service的服务,这个服务满足SPI的接口定义,在跑预测的时候,serving会从发请求给这个地址,这个地址会返回对应的数据。

你可以使用serving自带的工具来启动一个简单的feature_service, 源码在这里, https://github.com/secretflow/serving/blob/main/secretflow_serving/tools/simple_feature_service/main.cc

启动的参数包括一个端口号,一个文件名和id的列名, image

这个工具应该在serving镜像的tools/simple_feature_service目录下

@T-ze-yu
Copy link
Author

T-ze-yu commented Apr 9, 2024

好的,我学习一下

@T-ze-yu
Copy link
Author

T-ze-yu commented Apr 15, 2024

86fd315761a9c4fc9c932cdb9f8074c9
问下这个参数在按执行顺序传递时,中间的某个组件参数可以不传吗?例如有job WOE--》train-test split--》sgd train ,在模型导出时只传递WOE和sgd的参数OK吗

1 similar comment
@T-ze-yu
Copy link
Author

T-ze-yu commented Apr 15, 2024

86fd315761a9c4fc9c932cdb9f8074c9
问下这个参数在按执行顺序传递时,中间的某个组件参数可以不传吗?例如有job WOE--》train-test split--》sgd train ,在模型导出时只传递WOE和sgd的参数OK吗

@huocun-ant
Copy link
Collaborator

不行,模型导出的设计是要配合SecretPad使用的,不建议自己传参调用

后续应该会补一个模型导出相关的文档

@T-ze-yu
Copy link
Author

T-ze-yu commented Apr 15, 2024

先做WOE,再做数据分割不应该更合理些吗?这样只需要一次WOE,反过来则需要两次WOE

@da-niao-dan
Copy link
Member

你好。按道理是可以的。但是 train_test_split 在serving 没有意义,也就不可能自动转化到serving。我们没有计划做这方面的投入。欢迎贡献。

@huocun-ant
Copy link
Collaborator

先做WOE,再做数据分割不应该更合理些吗?这样只需要一次WOE,反过来则需要两次WOE

应该都可以

@T-ze-yu
Copy link
Author

T-ze-yu commented Apr 18, 2024

我看你的http配的地址是

http://127.0.0.1/BatchFeatureService/BatchFetchFeature

这个的意思是你需要在这个地址处启动一个feature_service的服务,这个服务满足SPI的接口定义,在跑预测的时候,serving会从发请求给这个地址,这个地址会返回对应的数据。

你可以使用serving自带的工具来启动一个简单的feature_service, 源码在这里, https://github.com/secretflow/serving/blob/main/secretflow_serving/tools/simple_feature_service/main.cc

启动的参数包括一个端口号,一个文件名和id的列名, image

我运行了serving自带的工具示例,运行图片保存在下面链接
http://oss.tzy.gocloudcoder.com/ddd.png
这样算是可以了吗?但在使用curl进行预测时还是显示Service "127.0.0.1" not found.

@T-ze-yu
Copy link
Author

T-ze-yu commented Apr 19, 2024

先做WOE,再做数据分割不应该更合理些吗?这样只需要一次WOE,反过来则需要两次WOE

应该都可以

是的,虽然中间执行了split但并不影响WOE的导出

@T-ze-yu
Copy link
Author

T-ze-yu commented Jul 4, 2024

我在编写好特征服务,启动后进行预测报错返回:
{"header": {"data": {}}, "status": {"code": 7, "msg": "[secretflow_serving/framework/execute_context.cc:29] p207 exec failed: code(7), [Enforce fail at secretflow_serving/feature_adapter/feature_adapter.cc:48] request.fs_param->query_datas().size() == features->num_rows(). query row_num 4 should be equal to fetched row_num 0"}, "service_spec": {"id": "server-w1eq34sfmecksxol"}}

@T-ze-yu
Copy link
Author

T-ze-yu commented Jul 4, 2024

特征服务的返回如下:
{
"status": {
"code": 0,
"msg": "success"
},
"features": [
{
"field": {
"name": "x33",
"type": "FIELD_DOUBLE"
},
"value": {
"fs": [
0.023394115051162182,
0.08442381675454069,
0.7556892308123765,
0.6460884953134338
]
}
},
{
"field": {
"name": "x22",
"type": "FIELD_DOUBLE"
},
"value": {
"fs": [
0.5484697834194532,
0.8589181623543067,
0.3409667611732464,
0.4377646420599991
]
}
},
{
"field": {
"name": "x11",
"type": "FIELD_DOUBLE"
},
"value": {
"fs": [
0.3543849623060429,
0.8829186591078972,
0.5186544383771176,
0.6314780940697121
]
}
}
]
}
格式上和文档对齐的,它要4行,我返回结果的value都有4个值,为什么它好像一行都没收到

@huocun-ant
Copy link
Collaborator

特征服务的返回如下: { "status": { "code": 0, "msg": "success" }, "features": [ { "field": { "name": "x33", "type": "FIELD_DOUBLE" }, "value": { "fs": [ 0.023394115051162182, 0.08442381675454069, 0.7556892308123765, 0.6460884953134338 ] } }, { "field": { "name": "x22", "type": "FIELD_DOUBLE" }, "value": { "fs": [ 0.5484697834194532, 0.8589181623543067, 0.3409667611732464, 0.4377646420599991 ] } }, { "field": { "name": "x11", "type": "FIELD_DOUBLE" }, "value": { "fs": [ 0.3543849623060429, 0.8829186591078972, 0.5186544383771176, 0.6314780940697121 ] } } ] } 格式上和文档对齐的,它要4行,我返回结果的value都有4个值,为什么它好像一行都没收到

啊 我知道为啥了,因为你的typedouble,但是你的数据是fs ,按照约定,结果应该放ds 才对,serving会从 ds 读取,所以读到了0行

@huocun-ant
Copy link
Collaborator

{
"status": {
"code": 0,
"msg": "success"
},
"features": [
{
"field": {
"name": "x33",
"type": "FIELD_DOUBLE"
},
"value": {
"fs": [
0.023394115051162182,
0.08442381675454069,
0.7556892308123765,
0.6460884953134338
]
}
},
{
"field": {
"name": "x22",
"type": "FIELD_DOUBLE"
},
"value": {
"fs": [
0.5484697834194532,
0.8589181623543067,
0.3409667611732464,
0.4377646420599991
]
}
},
{
"field": {
"name": "x11",
"type": "FIELD_DOUBLE"
},
"value": {
"fs": [
0.3543849623060429,
0.8829186591078972,
0.5186544383771176,
0.6314780940697121
]
}
}
]
}

{
"status": {
"code": 0,
"msg": "success"
},
"features": [
{
"field": {
"name": "x33",
"type": "FIELD_DOUBLE"
},
"value": {
"ds": [
0.023394115051162182,
0.08442381675454069,
0.7556892308123765,
0.6460884953134338
]
}
},
{
"field": {
"name": "x22",
"type": "FIELD_DOUBLE"
},
"value": {
"ds": [
0.5484697834194532,
0.8589181623543067,
0.3409667611732464,
0.4377646420599991
]
}
},
{
"field": {
"name": "x11",
"type": "FIELD_DOUBLE"
},
"value": {
"ds": [
0.3543849623060429,
0.8829186591078972,
0.5186544383771176,
0.6314780940697121
]
}
}
]
}

改成这样试试呢

@T-ze-yu
Copy link
Author

T-ze-yu commented Jul 5, 2024

嗯嗯,可以了感谢

@sunrh0
Copy link

sunrh0 commented Jul 25, 2024

参考文档:https://www.secretflow.org.cn/zh-CN/docs/serving/0.2.0b0/reference/config#featuresourceconfig、https://www.secretflow.org.cn/zh-CN/docs/serving/0.2.0b0/topics/system/feature_service,,如何启动特征服务?能提供详细的实现步骤吗?以及后续预测推理成功的过程吗?谢谢 @T-ze-yu

@BrainWH
Copy link

BrainWH commented Jul 25, 2024

@sunrh0 如果是想单独部署serving,可以参考文档:https://www.secretflow.org.cn/zhCN/docs/serving/0.2.0b0/topics/deployment/deployment
如果是想在kuscia中部署serving,可以参考文档:
https://www.secretflow.org.cn/zh-CN/docs/serving/0.2.0b0/topics/deployment/deployment

@sunrh0
Copy link

sunrh0 commented Jul 26, 2024

@sunrh0 如果是想单独部署serving,可以参考文档:https://www.secretflow.org.cn/zhCN/docs/serving/0.2.0b0/topics/deployment/deployment 如果是想在kuscia中部署serving,可以参考文档: https://www.secretflow.org.cn/zh-CN/docs/serving/0.2.0b0/topics/deployment/deployment

谢谢,我已经部署成功,但是预测推理的时候,输入的 "query_datas"字段结构是什么,可以在https://www.secretflow.org.cn/zh-CN/docs/serving/0.4.0b0/reference/api 看到定义,但没理解怎么构造?
"alice": {
"query_datas": [
"a"
]
},
"bob": {
"query_datas": [
"a"
]
}

@sunrh0
Copy link

sunrh0 commented Jul 26, 2024

@sunrh0 如果是想单独部署serving,可以参考文档:https://www.secretflow.org.cn/zhCN/docs/serving/0.2.0b0/topics/deployment/deployment 如果是想在kuscia中部署serving,可以参考文档: https://www.secretflow.org.cn/zh-CN/docs/serving/0.2.0b0/topics/deployment/deployment

谢谢,我已经部署成功,但是预测推理的时候,输入的 "query_datas"字段结构是什么,可以在https://www.secretflow.org.cn/zh-CN/docs/serving/0.4.0b0/reference/api 看到定义,但没理解怎么构造? "alice": { "query_datas": [ "a" ] }, "bob": { "query_datas": [ "a" ] }

或者换一种说法,在https://www.secretflow.org.cn/zh-CN/docs/kuscia/v0.10.0b0/tutorial/run_sf_serving_with_api_cn中模型的{\"featureMapping\":{\"v24\":\"x24\",\"v22\":\"x22\",\"v21\":\"x21\",\"v25\":\"x25\",\"v23\":\"x23\"}, 如何和 "query_datas"字段中的“a”对应起来?

@BrainWH
Copy link

BrainWH commented Jul 26, 2024

您好,如果是mock数据源,"query_datas"字段可以是任意的;如果是真实的数据,"query_datas"字段是对应的特征

@sunrh0
Copy link

sunrh0 commented Jul 26, 2024

您好,如果是mock数据源,"query_datas"字段可以是任意的;如果是真实的数据,"query_datas"字段是对应的特征

您好,比如featureMapping建立了5个特征分别是"v24", "v22", "v21", "v25", "v23",假如真实数据为{"v24":1, "v22":2, "v21":3, "v25":4, "v23":5},怎么构造"query_datas"字段,能举个例子吗?谢谢

@huocun-ant
Copy link
Collaborator

您好,如果是mock数据源,"query_datas"字段可以是任意的;如果是真实的数据,"query_datas"字段是对应的特征

您好,比如featureMapping建立了5个特征分别是"v24", "v22", "v21", "v25", "v23",假如真实数据为{"v24":1, "v22":2, "v21":3, "v25":4, "v23":5},怎么构造"query_datas"字段,能举个例子吗?谢谢

想象如果预测的输入是一个表格,这个表格有ID列,有feature数据列,query_datas可以理解为ID列对应的值,可以通过a这个值定位到对应的一行, v24v22这些就是feature数据的列名,之所以有featureMapping,是考虑到有可能预测的数据源列名和serving的模型中记录的列名不一致,除了Mock数据源query_datas可以随便填,其他数据源应当都是应该能通过query_datas中的行ID定位到一行的。

@sunrh0
Copy link

sunrh0 commented Jul 26, 2024

您好,如果是mock数据源,"query_datas"字段可以是任意的;如果是真实的数据,"query_datas"字段是对应的特征

您好,比如featureMapping建立了5个特征分别是"v24", "v22", "v21", "v25", "v23",假如真实数据为{"v24":1, "v22":2, "v21":3, "v25":4, "v23":5},怎么构造"query_datas"字段,能举个例子吗?谢谢

想象如果预测的输入是一个表格,这个表格有ID列,有feature数据列,query_datas可以理解为ID列对应的值,可以通过a这个值定位到对应的一行, v24v22这些就是feature数据的列名,之所以有featureMapping,是考虑到有可能预测的数据源列名和serving的模型中记录的列名不一致,除了Mock数据源query_datas可以随便填,其他数据源应当都是应该能通过query_datas中的行ID定位到一行的。

好的,理解了,谢谢

@huocun-ant
Copy link
Collaborator

您好,如果是mock数据源,"query_datas"字段可以是任意的;如果是真实的数据,"query_datas"字段是对应的特征

您好,比如featureMapping建立了5个特征分别是"v24", "v22", "v21", "v25", "v23",假如真实数据为{"v24":1, "v22":2, "v21":3, "v25":4, "v23":5},怎么构造"query_datas"字段,能举个例子吗?谢谢

想象如果预测的输入是一个表格,这个表格有ID列,有feature数据列,query_datas可以理解为ID列对应的值,可以通过a这个值定位到对应的一行, v24v22这些就是feature数据的列名,之所以有featureMapping,是考虑到有可能预测的数据源列名和serving的模型中记录的列名不一致,除了Mock数据源query_datas可以随便填,其他数据源应当都是应该能通过query_datas中的行ID定位到一行的。

好的,理解了,谢谢

这部分文档我们后续会补一下,从这个图中可以看出在生产环境中featureService应当是一个单独的服务。另外你可以看看FeatureSourceConfig,除了mock,可以配置csv和http服务作为预测数据源。csv的feature数据源好配置,只需要配置个本地的csv。http的feature数据源需要起一个满足SPI协议的服务,如果觉得自己实现一个http的serving比较麻烦,可以看看secretflow_serving/tools/simple_feature_service这个会编译出一个加载csv作为http服务启动的小工具,serving的docker中也有这个工具,感兴趣可以玩玩。

@sunrh0
Copy link

sunrh0 commented Aug 29, 2024

您好,如果是mock数据源,"query_datas"字段可以是任意的;如果是真实的数据,"query_datas"字段是对应的特征

您好,比如featureMapping建立了5个特征分别是"v24", "v22", "v21", "v25", "v23",假如真实数据为{"v24":1, "v22":2, "v21":3, "v25":4, "v23":5},怎么构造"query_datas"字段,能举个例子吗?谢谢

想象如果预测的输入是一个表格,这个表格有ID列,有feature数据列,query_datas可以理解为ID列对应的值,可以通过a这个值定位到对应的一行, v24v22这些就是feature数据的列名,之所以有featureMapping,是考虑到有可能预测的数据源列名和serving的模型中记录的列名不一致,除了Mock数据源query_datas可以随便填,其他数据源应当都是应该能通过query_datas中的行ID定位到一行的。

好的,理解了,谢谢

这部分文档我们后续会补一下,从这个图中可以看出在生产环境中featureService应当是一个单独的服务。另外你可以看看FeatureSourceConfig,除了mock,可以配置csv和http服务作为预测数据源。csv的feature数据源好配置,只需要配置个本地的csv。http的feature数据源需要起一个满足SPI协议的服务,如果觉得自己实现一个http的serving比较麻烦,可以看看secretflow_serving/tools/simple_feature_service这个会编译出一个加载csv作为http服务启动的小工具,serving的docker中也有这个工具,感兴趣可以玩玩。

您好,有个问题请教一下,下图中csv的feature数据源好配置是否正确,能否给一个csv的示例呢?(主要是mock数据源配置和https://www.secretflow.org.cn/zh-CN/docs/serving/0.5.0b0/reference/config#featuresourceconfig 给定的不一样),还有就是FeatureSourceConfig支不支持多种形式的数据源,如图中给定的mock数据源和csv数据源。

image

@huocun-ant
Copy link
Collaborator

不用写mockOpts, 写csvOpts就可以了

@T-ze-yu
Copy link
Author

T-ze-yu commented Aug 30, 2024

在使用过程碰到一个问题:整型数据训练出来的模型格式是int64,而特征服务需要json序列化来传送数据,但int64不支持序列化。这个有什么办法解决吗

@T-ze-yu
Copy link
Author

T-ze-yu commented Aug 30, 2024

在浮点型数据也遇到问题,其中一个特征服务返回数据是:{'status': {'code': 0, 'msg': 'success'}, 'features': [{'field': {'name': 'x4', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.8331954909367376, 0.6551617580858518, 0.4914635008769847, 0.452637272297438, 0.5530084837837435]}}, {'field': {'name': 'x3', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.30349848436065485, 0.41580141733966997, 0.5420890983051451, 0.9868331101265608, 0.6425192017138739]}}, {'field': {'name': 'x1', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.51496055809575, 0.25841104560731754, 0.6074943235752931, 0.2553390312983149, 0.15287892489704036]}}, {'field': {'name': 'x0', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.8107051572972277, 0.06495183281646077, 0.4881279083806714, 0.4621165711181842, 0.02779285987218849]}}, {'field': {'name': 'x2', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.0038974624302559047, 0.7999695847105199, 0.8178230817179253, 0.7223414317766689, 0.44216349587970416]}}]}
并打印value的type:<class 'numpy.float64'>,这个数据在模型可以正常运行;
当特征服务返回:{'status': {'code': 0, 'msg': 'success'}, 'features': [{'field': {'name': 'x4', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [3.39427, 0.220556, 2.04851]}}, {'field': {'name': 'x3', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.550021, 1.22072, -0.24432]}}, {'field': {'name': 'x1', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.133984, -1.46677, -0.313836]}}, {'field': {'name': 'x0', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.281464, 1.29858, -0.165498]}}, {'field': {'name': 'x2', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.249939, 1.33854, -0.115009]}}]}
并打印value的type:<class 'numpy.float64'>,然而这个数据模型却预测失败,返回:
{"header": {"data": {}}, "status": {"code": 2, "msg": "invalid format string"}, "service_spec": {"id": "server-kf1c4gsijvyi29vo"}}

@neaos
Copy link

neaos commented Aug 30, 2024

不用写mockOpts, 写csvOpts就可以了

可以同时支持mockOpts和csvOpts吗?
我改成这样:
"feature_source_config": {
"mockOpts": {},
"csvOpts": {
"file_path": "/home/kuscia/var/storage/data/model_2024083011060422201.csv",
"id_name": "id1"
}
}

报错日志:[error] [utils.cc:JsonToPb:52] json to pb failed, msg:INVALID_ARGUMENT:(party_configs[1].value.feature_s
ource_config): invalid value oneof field 'options' is already set. Cannot set 'csvOpts' for type oneof,

@neaos
Copy link

neaos commented Aug 30, 2024

不用写mockOpts, 写csvOpts就可以了

如果我改只写csvOpts了,它是不是不能再从原训练数据集里求交查数据来预测了

@neaos
Copy link

neaos commented Aug 30, 2024

不用写mockOpts, 写csvOpts就可以了

如果我改只写csvOpts了,它是不是不能再从原训练数据集里求交查数据来预测了

我改成只填csvOpts,它报[secretflow_serving/framework/execute_context.cc:29] com2023011620063473637 exec failed: code(3), [Enforce fail at secretflow_serving/util/arrow_helper.cc:431] is_in_array->true_count() == is_in_array->length(). query data row ids:9 do not all exists in id column of csv file, match count: 0.

说明是拿id只从csvOpts里的csv文件里找数据预测了

@T-ze-yu
Copy link
Author

T-ze-yu commented Sep 2, 2024

不用写mockOpts, 写csvOpts就可以了

如果我改只写csvOpts了,它是不是不能再从原训练数据集里求交查数据来预测了

是这样,从路径拿了

@T-ze-yu
Copy link
Author

T-ze-yu commented Sep 3, 2024

在浮点型数据也遇到问题,其中一个特征服务返回数据是:{'status': {'code': 0, 'msg': 'success'}, 'features': [{'field': {'name': 'x4', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.8331954909367376, 0.6551617580858518, 0.4914635008769847, 0.452637272297438, 0.5530084837837435]}}, {'field': {'name': 'x3', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.30349848436065485, 0.41580141733966997, 0.5420890983051451, 0.9868331101265608, 0.6425192017138739]}}, {'field': {'name': 'x1', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.51496055809575, 0.25841104560731754, 0.6074943235752931, 0.2553390312983149, 0.15287892489704036]}}, {'field': {'name': 'x0', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.8107051572972277, 0.06495183281646077, 0.4881279083806714, 0.4621165711181842, 0.02779285987218849]}}, {'field': {'name': 'x2', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.0038974624302559047, 0.7999695847105199, 0.8178230817179253, 0.7223414317766689, 0.44216349587970416]}}]} 并打印value的type:<class 'numpy.float64'>,这个数据在模型可以正常运行; 当特征服务返回:{'status': {'code': 0, 'msg': 'success'}, 'features': [{'field': {'name': 'x4', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [3.39427, 0.220556, 2.04851]}}, {'field': {'name': 'x3', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.550021, 1.22072, -0.24432]}}, {'field': {'name': 'x1', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [0.133984, -1.46677, -0.313836]}}, {'field': {'name': 'x0', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.281464, 1.29858, -0.165498]}}, {'field': {'name': 'x2', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.249939, 1.33854, -0.115009]}}]} 并打印value的type:<class 'numpy.float64'>,然而这个数据模型却预测失败,返回: {"header": {"data": {}}, "status": {"code": 2, "msg": "invalid format string"}, "service_spec": {"id": "server-kf1c4gsijvyi29vo"}}

可以告知invalid format string这个错误是在代码哪里报了吗?或者在serving的哪个地方做了格式检查

@sunrh0
Copy link

sunrh0 commented Sep 4, 2024

您好,如果是mock数据源,"query_datas"字段可以是任意的;如果是真实的数据,"query_datas"字段是对应的特征

您好,比如featureMapping建立了5个特征分别是"v24", "v22", "v21", "v25", "v23",假如真实数据为{"v24":1, "v22":2, "v21":3, "v25":4, "v23":5},怎么构造"query_datas"字段,能举个例子吗?谢谢

想象如果预测的输入是一个表格,这个表格有ID列,有feature数据列,query_datas可以理解为ID列对应的值,可以通过a这个值定位到对应的一行, v24v22这些就是feature数据的列名,之所以有featureMapping,是考虑到有可能预测的数据源列名和serving的模型中记录的列名不一致,除了Mock数据源query_datas可以随便填,其他数据源应当都是应该能通过query_datas中的行ID定位到一行的。

好的,理解了,谢谢

这部分文档我们后续会补一下,从这个图中可以看出在生产环境中featureService应当是一个单独的服务。另外你可以看看FeatureSourceConfig,除了mock,可以配置csv和http服务作为预测数据源。csv的feature数据源好配置,只需要配置个本地的csv。http的feature数据源需要起一个满足SPI协议的服务,如果觉得自己实现一个http的serving比较麻烦,可以看看secretflow_serving/tools/simple_feature_service这个会编译出一个加载csv作为http服务启动的小工具,serving的docker中也有这个工具,感兴趣可以玩玩。

您好,再请教一下,我们在隐语组件的基础上简单修改了纵向逻辑回归的训练与预测组件,然后针对训练好的纵向逻辑回归模型,利用serving实现在线推理,现在服务上线都没问题。但数据源选择mock方式,出现了下图的问题,请问具体什么原因导致的,应该去哪里排查这个问题,谢谢!
image

@lixiulan1
Copy link

在浮点型数据也遇到问题,其中一个特征服务返回数据是:{'status': {'code': 0, 'msg': 'success'}, 'features': [{'field': { '名称':'x4','类型':'FIELD_DOUBLE'},'值':{'ds':[0.8331954909367376,0.6551617580858518,0.4914635008769847,0.452637272297438,0.55 30084837837435]}}, {'字段': {'名称': 'x3','类型':'FIELD_DOUBLE'},'值':{'ds': [0.30349848436065485, 0.41580141733966997, 0.5420890983051451, 0.9868331101265608, 0.6425192017138739]}},{'field':{'name':'x1','type':'FIELD_DOUBLE'},'value':{'ds':[0.51496055809575, 0.25841104560731754 ,0.6074943235752931,0.2553390312983149, 0.15287892489704036]}},{'field':{'name':'x0','type':'FIELD_DOUBLE'},'value':{'ds':[0.8107051572972277, 0.06495183281646077, 0.4881279083806714, 0.4621165711181842, 0.02779285987218849]}} ,{'field':{'name':'x2','type':'FIELD_DOUBLE'},'value':{'ds':[0.0038974624302559047, 0.7999695847105199, 0.8178230817179253, 0.7223414317766689, 0.44216349587970416]}}]} 并打印value的类型:<class 'numpy.float64'>,该数据在模型中可以正常运行; 当特征服务返回:{'status ':{'代码': 0,'msg':'成功'},'功能':[{'字段':{'名称':'x4','类型':'FIELD_DOUBLE'},'值':{'ds':[3.39427 , 0.220556, 2.04851]}}, {'字段': {'名称': 'x3', '类型': 'FIELD_DOUBLE'}, '值': {'ds': [-0.550021, 1.22072, -0.24432]}}, {'field': {'name': 'x1', 'type': 'FIELD_DOUBLE'}, '值':{'ds':[0.133984, -1.46677, -0.313836]}},{'field':{'name':'x0','type':'FIELD_DOUBLE'},'值':{'ds ': [-0.281464, 1.29858, -0.165498]}}, {'field': {'name': 'x2', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.249939, 1.33854, -0.115009]}}]} 并打印值的类型:<class 'numpy.float64'>,然而这个数据模型却预测失败,返回: {"header": {"data": {} }, "status": {"code": 2, "msg": "无效的格式字符串"}, "service_spec": {"id": "server-kf1c4gsijvyi29vo"}}

您好,请问您这个问题解决了吗?我也遇到同样的问题。如果解决了,能说明下问题,还有您的服务是怎么部署的,我是本地加载模型,http特征数据源,特征服务起来了,但是请求查询会出现查不到值的情况,问下您是怎么搭建特征服务的?

@T-ze-yu
Copy link
Author

T-ze-yu commented Sep 26, 2024

在浮点型数据也遇到问题,其中一个特征服务返回数据是:{'status': {'code': 0, 'msg': 'success'}, 'features': [{'field': { '名称':'x4','类型':'FIELD_DOUBLE'},'值':{'ds':[0.8331954909367376,0.6551617580858518,0.4914635008769847,0.452637272297438,0.55 30084837837435]}}, {'字段': {'名称': 'x3','类型':'FIELD_DOUBLE'},'值':{'ds': [0.30349848436065485, 0.41580141733966997, 0.5420890983051451, 0.9868331101265608, 0.6425192017138739]}},{'field':{'name':'x1','type':'FIELD_DOUBLE'},'value':{'ds':[0.51496055809575, 0.25841104560731754 ,0.6074943235752931,0.2553390312983149, 0.15287892489704036]}},{'field':{'name':'x0','type':'FIELD_DOUBLE'},'value':{'ds':[0.8107051572972277, 0.06495183281646077, 0.4881279083806714, 0.4621165711181842, 0.02779285987218849]}} ,{'field':{'name':'x2','type':'FIELD_DOUBLE'},'value':{'ds':[0.0038974624302559047, 0.7999695847105199, 0.8178230817179253, 0.7223414317766689, 0.44216349587970416]}}]} 并打印value的类型:<class 'numpy.float64'>,该数据在模型中可以正常运行; 当特征服务返回:{'status ':{'代码': 0,'msg':'成功'},'功能':[{'字段':{'名称':'x4','类型':'FIELD_DOUBLE'},'值':{'ds':[3.39427 , 0.220556, 2.04851]}}, {'字段': {'名称': 'x3', '类型': 'FIELD_DOUBLE'}, '值': {'ds': [-0.550021, 1.22072, -0.24432]}}, {'field': {'name': 'x1', 'type': 'FIELD_DOUBLE'}, '值':{'ds':[0.133984, -1.46677, -0.313836]}},{'field':{'name':'x0','type':'FIELD_DOUBLE'},'值':{'ds ': [-0.281464, 1.29858, -0.165498]}}, {'field': {'name': 'x2', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.249939, 1.33854, -0.115009]}}]} 并打印值的类型:<class 'numpy.float64'>,然而这个数据模型却预测失败,返回: {"header": {"data": {} }, "status": {"code": 2, "msg": "无效的格式字符串"}, "service_spec": {"id": "server-kf1c4gsijvyi29vo"}}

您好,请问您这个问题解决了吗?我也遇到同样的问题。如果解决了,能说明下问题,还有您的服务是怎么部署的,我是本地加载模型,http特征数据源,特征服务起来了,但是请求查询会出现查不到值的情况,问下您是怎么搭建特征服务的?

没有解决,就用Python起的服务

@lixiulan1
Copy link

在浮点型数据也遇到问题,其中一个特征服务返回数据是:{'status': {'code': 0, 'msg': 'success'}, 'features': [{'field': { '名称':'x4','类型':'FIELD_DOUBLE'},'值':{'ds':[0.8331954909367376,0.6551617580858518,0.4914635008769847,0.452637272297438,0.55 30084837837435]}}, {'字段': {'名称': 'x3','类型':'FIELD_DOUBLE'},'值':{'ds': [0.30349848436065485, 0.41580141733966997, 0.5420890983051451, 0.9868331101265608, 0.6425192017138739]}},{'field':{'name':'x1','type':'FIELD_DOUBLE'},'value':{'ds':[0.51496055809575, 0.25841104560731754 ,0.6074943235752931,0.2553390312983149, 0.15287892489704036]}},{'field':{'name':'x0','type':'FIELD_DOUBLE'},'value':{'ds':[0.8107051572972277, 0.06495183281646077, 0.4881279083806714, 0.4621165711181842, 0.02779285987218849]}} ,{'field':{'name':'x2','type':'FIELD_DOUBLE'},'value':{'ds':[0.0038974624302559047, 0.7999695847105199, 0.8178230817179253, 0.7223414317766689, 0.44216349587970416]}}]} 并打印value的类型:<class 'numpy.float64'>,该数据在模型中可以正常运行; 当特征服务返回:{'status ':{'代码': 0,'msg':'成功'},'功能':[{'字段':{'名称':'x4','类型':'FIELD_DOUBLE'},'值':{'ds':[3.39427 , 0.220556, 2.04851]}}, {'字段': {'名称': 'x3', '类型': 'FIELD_DOUBLE'}, '值': {'ds': [-0.550021, 1.22072, -0.24432]}}, {'field': {'name': 'x1', 'type': 'FIELD_DOUBLE'}, '值':{'ds':[0.133984, -1.46677, -0.313836]}},{'field':{'name':'x0','type':'FIELD_DOUBLE'},'值':{'ds ': [-0.281464, 1.29858, -0.165498]}}, {'field': {'name': 'x2', 'type': 'FIELD_DOUBLE'}, 'value': {'ds': [-0.249939, 1.33854, -0.115009]}}]} 并打印值的类型:<class 'numpy.float64'>,然而这个数据模型却预测失败,返回: {"header": {"data": {} }, "status": {"code": 2, "msg": "无效的格式字符串"}, "service_spec": {"id": "server-kf1c4gsijvyi29vo"}}

您好,请问您这个问题解决了吗?我也遇到同样的问题。如果解决了,能说明下问题,还有您的服务是怎么部署的,我是本地加载模型,http特征数据源,特征服务起来了,但是请求查询会出现查不到值的情况,问下您是怎么搭建特征服务的?

没有解决,就用Python起的服务

特征服务不是用工具simple_feature_service执行命令/root/sf_serving/tools/simple_feature_service/simple_feature_service --port=9999 --csv_filename=/root/sf_serving/conf/bob.csv --csv_id_column_name=id_name吗?我看你之前有个图片应该也是这样起的服务。想问下你执行curl --location 'http://127.0.0.1:9999/BatchFeatureService/BatchFetchFeature' \的时候返回特征列对应的值了吗?我的出现提示[info] [simple_feature_service.cc:141] extract 0 rows是怎么回事?

@T-ze-yu
Copy link
Author

T-ze-yu commented Sep 26, 2024

没有,我后面自己按文档写了个

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants