KServe V2预测协议详解:标准化模型推理API规范
2025-07-08 08:05:30作者:何将鹤
概述
KServe项目提出的V2预测协议是一套独立于任何特定机器学习/深度学习框架和模型服务器的标准化推理API规范。该协议旨在为各种推理场景提供统一接口,同时支持易用性和高性能需求。通过实现这一协议,推理客户端和服务器可以无缝对接任何采用该标准的平台,显著提升实用性和可移植性。
协议特点
- 框架无关性:不依赖特定ML/DL框架
- 双协议支持:同时支持HTTP/REST和gRPC接口
- 扩展机制:内置可扩展的API设计
- 生产就绪:提供健康检查、元数据查询等运维接口
HTTP/REST API详解
基础URL结构
所有API端点遵循统一的结构模式:
/v2/[功能路径][/versions/${MODEL_VERSION}]
其中版本部分为可选,允许服务器根据自身策略选择默认版本。
健康检查API
1. 服务器存活检查
GET /v2/health/live
- 作用:检测推理服务是否存活
- 响应:200状态码表示存活,4xx表示不存活
- K8s集成:可直接用于livenessProbe配置
2. 服务器就绪检查
GET /v2/health/ready
- 作用:检测所有模型是否就绪
- 响应:200状态码表示就绪
- K8s集成:可直接用于readinessProbe配置
3. 模型就绪检查
GET /v2/models/${MODEL_NAME}/ready
- 作用:检测特定模型是否就绪
- 版本支持:可通过可选版本参数指定具体版本
元数据查询API
1. 服务器元数据
GET /v2
响应示例:
{
"name": "inference-server",
"version": "1.12.0",
"extensions": ["extension1", "extension2"]
}
2. 模型元数据
GET /v2/models/${MODEL_NAME}
响应示例:
{
"name": "resnet50",
"versions": ["1", "2"],
"platform": "tensorflow",
"inputs": [
{
"name": "input_tensor",
"datatype": "FP32",
"shape": [-1, 224, 224, 3]
}
],
"outputs": [
{
"name": "output_tensor",
"datatype": "FP32",
"shape": [-1, 1000]
}
]
}
推理API
请求结构
POST /v2/models/${MODEL_NAME}/infer
请求体结构:
{
"id": "request-123",
"parameters": {
"priority": 1
},
"inputs": [
{
"name": "input0",
"shape": [2, 2],
"datatype": "UINT32",
"data": [1, 2, 3, 4]
}
],
"outputs": [
{
"name": "output0"
}
]
}
响应结构
成功响应:
{
"model_name": "mymodel",
"model_version": "1",
"id": "request-123",
"outputs": [
{
"name": "output0",
"shape": [3, 2],
"datatype": "FP32",
"data": [1.0, 1.1, 2.0, 2.1, 3.0, 3.1]
}
]
}
错误响应:
{
"error": "invalid input shape"
}
gRPC API详解
gRPC接口与HTTP/REST保持概念一致,提供更高性能的二进制通信方式。
服务定义
service GRPCInferenceService {
rpc ServerLive(ServerLiveRequest) returns (ServerLiveResponse);
rpc ServerReady(ServerReadyRequest) returns (ServerReadyResponse);
rpc ModelReady(ModelReadyRequest) returns (ModelReadyResponse);
rpc ServerMetadata(ServerMetadataRequest) returns (ServerMetadataResponse);
rpc ModelMetadata(ModelMetadataRequest) returns (ModelMetadataResponse);
rpc ModelInfer(ModelInferRequest) returns (ModelInferResponse);
}
核心消息类型
模型推理请求
message ModelInferRequest {
string model_name = 1;
string model_version = 2;
string id = 3;
map<string, InferParameter> parameters = 4;
repeated InferInputTensor inputs = 5;
repeated InferRequestedOutputTensor outputs = 6;
}
模型推理响应
message ModelInferResponse {
string model_name = 1;
string model_version = 2;
string id = 3;
map<string, InferParameter> parameters = 4;
repeated InferOutputTensor outputs = 5;
}
关键技术细节
张量数据类型支持
协议定义了标准化的数据类型表示,包括:
- 布尔型:BOOL
- 整型:INT8, INT16, INT32, INT64
- 无符号整型:UINT8, UINT16, UINT32, UINT64
- 浮点型:FP16, FP32, FP64
- 字节型:BYTES
张量数据布局
数据必须按行优先顺序(ROW-MAJOR)排列:
- 支持多维自然表示和扁平化一维表示
- 示例:2x2矩阵可表示为
[[1,2],[3,4]]
或[1,2,3,4]
参数扩展机制
协议设计了灵活的扩展点:
{
"parameters": {
"custom_param1": "value1",
"custom_param2": 123,
"custom_param3": true
}
}
最佳实践建议
- 版本控制:生产环境建议显式指定模型版本
- 批量处理:充分利用shape参数中的批量维度(-1表示可变)
- 性能优化:
- 大张量数据考虑使用二进制传输扩展
- 高频调用场景优先使用gRPC接口
- 错误处理:
- 检查HTTP状态码和错误消息体
- 实现重试机制处理暂时性错误
总结
KServe V2预测协议为模型推理服务提供了标准化、可扩展的接口规范。通过实现这一协议,开发者可以构建与底层框架无关的推理应用,确保在不同平台间的可移植性。该协议已被多个主流推理服务器实现,成为云原生ML推理领域的事实标准。