https://kserve.github.io/website/0.10/modelserving/inference_graph/
推理图
动机
ML推理系统越来越大、越来越复杂,它们通常由许多模型组成来进行单个预测。一些常见的用例是图像分类和自然语言处理管道。例如,人脸识别流水线可能需要首先定位图像中的人脸,然后计算人脸的特征以匹配数据库中的记录。NLP管道需要首先运行文档分类,然后根据之前的分类结果在下游执行命名实体检测。
KServe在构建分布式推理图方面具有独特的优势:自动缩放图路由器、与单个推理服务的本地集成,以及用于链接模型的标准推理协议。KServe利用这些优势构建推理图,并使用户能够以声明性和可扩展的方式将复杂的ML推理管道部署到生产中。
概念

- InferenceGraph推理图:由路由节点列表组成,其中每个节点由一组路由步骤组成。每个步骤都可以路由到推理服务或图上定义的另一个节点,这使得推理图具有高度可组合性。图形路由器部署在HTTP端点后面,可以根据请求量进行动态缩放。推理图支持四种不同类型的路由节点:序列、交换机、集成和拆分器(Sequence, Switch, Ensemble, Splitter)。
- Sequence Node序列节点:允许用户使用推理服务或节点定义多个步骤作为序列中的路由目标。步骤按顺序执行,上一步骤的请求/响应可以作为基于配置的输入传递到下一步骤。
- Switch Node切换节点:使用户可以定义路由条件,并在匹配条件时选择要执行的步骤。一旦找到符合条件的第一步,就会返回响应。如果没有匹配的条件,图形将返回原始请求。
- Ensemble Node集成节点:模型集合需要分别对每个模型进行评分,然后将结果组合为单个预测响应。然后可以使用不同的组合方法来产生最终结果。例如,多个分类树通常使用“多数投票”方法进行组合。多元回归树通常使用各种平均技术进行组合。
- Splitter Node拆分器节点:允许用户使用加权分布将流量拆分到多个目标。
功能
标头传播Headers Propagation
如果您希望推理图的路由器传播头,您将请求传递给推理图,传递给图中的所有步骤,然后您可以使用kserve命名空间中的推理服务配置映射来执行此操作。例如:如果你想传播某个标头,比如“Custom-Header”,那么你可以这样编辑推理服务配置映射的router部分:
{
"image" : "kserve/router:v0.10.0",
"memoryRequest": "100Mi",
"memoryLimit": "1Gi",
"cpuRequest": "100m",
"cpuLimit": "1",
"headers": {
"propagate":[
"Custom-Header"
]
}
}
更新此配置映射后,kserve控制器将自动协调推理图以开始传播标头。
使用推理图部署图像处理推理管道
本教程演示了如何使用推理图部署具有多个阶段的图像处理推理管道。该示例将两个模型链接在一起,第一个模型是对图像是狗还是猫进行分类,如果是狗,则第二个模型进行犬种分类。
推理图流程
在推理图请求流中,图像用base64格式编码,并首先发送到狗-猫分类器模型,然后,如果先前的模型预测是狗,则将狗-猫分类推理服务的图像输入转发到下一阶段的模型,以对品种进行分类。
部署单个推理服务
训练模型
部署推理服务
在使用InferenceGraph自定义资源部署图路由器之前,您需要首先使用上一步中训练的模型部署各个推理服务。
模型应使用以下命令打包,然后随配置一起上传到模型存储:
torch-model-archiver -f --model-name cat_dog_classification --version 1.0 \
--model-file cat_dog_classification_arch.py \
--serialized-file cat_dog_classification.pth \
--handler cat_dog_classification_handler.py \
--extra-files index_to_name.json --export-path model_store
torch-model-archiver -f --model-name dog_breed_classification --version 1.0 \
--model-file dog_breed_classification_arch.py \
--serialized-file dog_breed_classification.pth \
--handler dog_breed_classification_handler.py \
--extra-files index_to_name.json --export-path model_store
然后,您可以使用以下推理服务自定义资源将模型部署到KServe。
InferenceService
kubectl apply -f - <<EOF
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: "cat-dog-classifier"
spec:
predictor:
pytorch:
resources:
requests:
cpu: 100m
storageUri: gs://kfserving-examples/models/torchserve/cat_dog_classification
---
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: "dog-breed-classifier"
spec:
predictor:
pytorch:
resources:
requests:
cpu: 100m
storageUri: gs://kfserving-examples/models/torchserve/dog_breed_classification
EOF
请查看PyTorch教程中的更多详细信息,了解如何打包模型并使用推理服务进行部署。
部署推理图
在推理服务处于就绪状态后,您现在可以部署推理图来链接这两个模型,以产生最终的推理结果。
InferenceGraph
kubectl apply -f - <<EOF
apiVersion: "serving.kserve.io/v1alpha1"
kind: "InferenceGraph"
metadata:
name: "dog-breed-pipeline"
spec:
nodes:
root:
routerType: Sequence
steps:
- serviceName: cat-dog-classifier
name: cat_dog_classifier # step name
- serviceName: dog-breed-classifier
name: dog_breed_classifier
data: $request
condition: "[@this].#(predictions.0==\"dog\")"
EOF
推理图定义了两个步骤,每个步骤都针对上面部署的推理服务。步骤按顺序执行:它首先将图像作为请求发送到猫狗分类器模型,然后如果它从第一个模型被分类为狗,则发送到狗品种分类器。
- 请注意,$request是在数据字段上指定的,表示您希望转发上一步的请求,并将其作为输入发送到下一步。
- 条件是在第二个步骤中指定的,因此只有当响应数据与定义的条件匹配时,才会将请求发送到当前步骤。当条件不匹配时,图形短路并返回上一步的响应。关于如何表达条件,请参阅gjson syntax,目前KServe仅支持REST协议。
测试推理图
在测试推理图之前,首先检查图是否处于就绪状态,然后获取发送请求的路由器url。
kubectl get ig dog-breed-pipeline
NAME URL READY AGE
dog-breed-pipeline http://dog-breed-pipeline.default.example.com True 17h
现在,您可以通过发送猫和狗的图像数据来测试推理图。
SERVICE_HOSTNAME=$(kubectl get inferencegraph dog-breed-pipeline -o jsonpath='{.status.url}' | cut -d "/" -f 3)
curl -v -H "Host: ${SERVICE_HOSTNAME}" http://${INGRESS_HOST}:${INGRESS_PORT} -d @./cat.json
期望输出
{"predictions": ["It's a cat!"]}
curl -v -H "Host: ${SERVICE_HOSTNAME}" http://${INGRESS_HOST}:${INGRESS_PORT} -d @./dog.json
期望输出
{"predictions": [{"Kuvasz": 0.9854059219360352, "American_water_spaniel": 0.006928909569978714, "Glen_of_imaal_terrier": 0.004635687451809645, "Manchester_terrier": 0.0011041086399927735, "American_eskimo_dog": 0.0003261661622673273}]}
您可以看到,如果第一个模型将图像分类为狗,则它会发送到第二个模型,并进一步对狗的品种进行分类,如果图像分类为猫,则推理图路由器会返回第一个模型的响应。

被折叠的 条评论
为什么被折叠?



