服务
服务 Ludwig 模型¶
可以使用 serve 命令来服务 Ludwig 模型。
ludwig serve --model_path=/path/to/model
该命令将使用 FastAPI 库启动一个 REST API。
这个 API 有两个端点:predict
和 predict_batch
。predict
用于获取单个示例的预测结果,而 predict_batch
用于获取批量示例的预测结果。
发送到 REST API 的输入应与用于训练模型的特征名称和类型保持一致。REST API 的输出结构取决于模型的输出特征及其数据类型。
REST 端点¶
predict¶
输入格式¶
对于模型的每个输入,predict 端点需要一个带名称的字段。例如,使用名为 english_text
的输入文本字段训练的模型将期望一个 POST 请求,如下所示:
curl http://0.0.0.0:8000/predict -X POST -F 'english_text=words to be translated'
如果模型是使用输入图像字段训练的,则它将期望一个包含文件的 POST 请求,如下所示:
curl http://0.0.0.0:8000/predict -X POST -F 'image=@path_to_image/example.png'
具有文本字段和图像字段的模型将期望一个 POST 请求,如下所示:
curl http://0.0.0.0:8000/predict -X POST -F 'text=mixed together with' -F 'image=@path_to_image/example.png'
输出格式¶
响应是一个 JSON 字典,其键以模型的输出特征名称为前缀。
对于二元输出,REST API 返回的 JSON 结构如下:
{
"NAME_predictions": false,
"NAME_probabilities_False": 0.76,
"NAME_probabilities_True": 0.24,
"NAME_probability": 0.76
}
对于数字输出,REST API 返回的 JSON 结构如下:
{"NAME_predictions": 0.381}
对于类别输出,REST API 返回的 JSON 结构如下:
{
"NAME_predictions": "CLASSNAMEK",
"NAME_probability": 0.62,
"NAME_probabilities_CLASSNAME1": 0.099,
"NAME_probabilities_CLASSNAME2": 0.095,
...
"NAME_probabilities_CLASSNAMEN": 0.077
}
对于集合输出,REST API 返回的 JSON 结构如下:
{
"NAME_predictions":[
"CLASSNAMEI",
"CLASSNAMEJ",
"CLASSNAMEK"
],
"NAME_probabilities_CLASSNAME1":0.490,
"NAME_probabilities_CLASSNAME2":0.245,
...
"NAME_probabilities_CLASSNAMEN":0.341,
"NAME_probability":[
0.53,
0.62,
0.95
]
}
对于序列输出,REST API 返回的 JSON 结构如下:
{
"NAME_predictions":[
"TOKEN1",
"TOKEN2",
"TOKEN3"
],
"NAME_last_predictions": "TOKEN3",
"NAME_probabilities":[
0.106,
0.122,
0.118,
0.133
],
"NAME_probability": -6.4765729904174805
}
对于文本输出,REST API 返回的 JSON 结构与序列相同。
batch_predict¶
输入格式¶
您也可以在 /batch_predict 端点上发起 POST 请求,一次对多个样本进行推理。
请求必须以表单数据提交,其中一个字段是 dataset
:这是待预测数据的 JSON 编码字符串表示。
数据集 JSON 字符串应采用 Pandas 的 split
格式,以减小负载大小。这种格式将数据集分为三个部分:
columns
:List[str]
index
(可选):List[Union[str, int]]
data
:List[List[object]]
可以使用额外的表单字段来提供文件中引用的资源,例如数据集中引用的图像。
批量预测示例
curl http://0.0.0.0:8000/batch_predict -X POST -F 'dataset={"columns": ["a", "b"], "data": [[1, 2], [3, 4]]}'
输出格式¶
响应是一个 JSON 字典,其键以模型的输出特征名称为前缀。
对于二元输出,REST API 返回的 JSON 结构如下:
{
"index": [0, 1],
"columns": [
"NAME_predictions",
"NAME_probabilities_False",
"NAME_probabilities_True",
"NAME_probability"
],
"data": [
[false, 0.768, 0.231, 0.768],
[true, 0.372, 0.627, 0.627]
]
}
对于数字输出,REST API 返回的 JSON 结构如下:
{"index":[0, 1],"columns":["NAME_predictions"],"data":[[0.381],[0.202]]}
对于类别输出,REST API 返回的 JSON 结构如下:
{
"index": [0, 1],
"columns": [
"NAME_predictions",
"NAME_probabilities_CLASSNAME1",
"NAME_probabilities_CLASSNAME2",
...
"NAME_probabilities_CLASSNAMEN",
"NAME_probability"
],
"data": [
["CLASSNAMEK", 0.099, 0.095, ... 0.077, 0.623],
["CLASSNAMEK", 0.092, 0.061, ... 0.084, 0.541]
]
}
对于集合输出,REST API 返回的 JSON 结构如下:
{
"index": [0, 1],
"columns": [
"NAME_predictions",
"NAME_probabilities_CLASSNAME1",
"NAME_probabilities_CLASSNAME2",
...
"NAME_probabilities_CLASSNAMEK",
"NAME_probability"
],
"data": [
[
["CLASSNAMEI", "CLASSNAMEJ", "CLASSNAMEK"],
0.490,
0.453,
...
0.500,
[0.53, 0.62, 0.95]
],
[
["CLASSNAMEM", "CLASSNAMEN", "CLASSNAMEO"],
0.481,
0.466,
...
0.485,
[0.63, 0.72, 0.81]
]
]
}
对于序列输出,REST API 返回的 JSON 结构如下:
{
"index": [0, 1],
"columns": [
"NAME_predictions",
"NAME_last_predictions",
"NAME_probabilities",
"NAME_probability"
],
"data": [
[
["TOKEN1", "TOKEN1", "TOKEN1"],
"TOKEN3",
[0.106, 0.122, … 0.083],
-6.476
],
[
["TOKEN4", "TOKEN5", "TOKEN6"],
"TOKEN6",
[0.108, 0.127, … 0.083],
-6.482
]
]
}
对于文本输出,REST API 返回的 JSON 结构与序列相同。