KServe Python SDK 完全指南:Server 端模型服务与 Client 端集群管理实战

发布时间:2026/10/10 8:58:45
KServe Python SDK 完全指南:Server 端模型服务与 Client 端集群管理实战
模型推理服务云原生后端微服务MLOps人工智能【免费下载链接】kserveStandardized Distributed Generative and Predictive AI Inference Platform for Scalable, Multi-Framework Deployment on Kubernetes项目地址https://gitcode.com/gh_mirrors/ks/kserve点击查看免费下载导读KServe Python SDK 是 KServe 项目中面向 Python 开发者的一体化工具箱它同时提供KServe Python Server在推理 Pod 内加载模型、暴露数据面 API 的服务端库与KServe Client通过 Kubernetes 控制面 API 远程管理 InferenceService 等资源的客户端库。本文以仓库中的 python/kserve/README.md 为骨架结合 SDK 源码python/kserve/kserve与配套的 kserve-storage 模块系统讲解安装方式、存储提供商、指标监控、模型生命周期方法以及 Client 的增删改查操作读完即可上手开发一个自定义模型服务并用 Client 在集群中完成部署与运维。一、认识 KServe Python SDKServer 与 Client 两大组件KServe Python SDK 分为两个相互独立、又可组合使用的部分组件职责核心模块仓库路径KServe Python Server在模型服务容器内运行注册模型、启动 HTTP/gRPC 服务、处理预测/解释/预处理/后处理、提供健康检查python/kserve/kserve/model.py、python/kserve/kserve/model_server.py、python/kserve/kserve/protocol/dataplane.pyKServe Client在集群外部或内部通过 Kubernetes API 创建、查询、修补、删除 InferenceService 等自定义资源python/kserve/kserve/api/kserve_client.pyServer 端实现了一套标准化的服务库被 Scikit-Learn、XGBoost、PyTorch 等模型服务框架扩展使用仓库内对应实现见 python/sklearnserver、python/xgbserver、python/huggingfaceserver 等目录。它统一封装了数据平面DataPlaneAPI 定义与模型存储检索由 python/storage 提供能力让不同框架的服务端行为保持一致。二、安装pip 与 uv 两种方式SDK 支持通过pip或uv安装仓库内对应的工程化配置见 python/kserve/pyproject.toml。2.1 使用 pip 安装基础安装pip install kserve如果需要存储storage支持从 GCS/S3/Azure/PVC/HTTP 等来源下载模型安装带 extra 的版本pip install kserve[storage]该 extra 会额外安装kserve-storage0.21.0见 pyproject.toml即仓库中的 python/storage 模块。2.2 使用 uv 安装先安装 uv然后在仓库python/kserve目录下执行make dev_install带存储支持的安装方式uv install --extra storage2.3 版本与 Python 环境要求源码确认根据 python/kserve/pyproject.toml 可以确认当前 SDK 版本为0.21.0要求Python 3.10 且 3.14即 3.10 ~ 3.13 均受支持。核心依赖包括Web 服务栈fastapi、uvicorn[standard]、starlette、timing-asgi推理协议grpcio、grpcio-tools、grpc-interceptor、protobuf、cloudevents数据与序列化numpy、pandas、pydantic、orjson、pyyamlKubernetes 客户端kubernetes可观测性prometheus-client、OpenTelemetry 全家桶opentelemetry-api、opentelemetry-sdk、opentelemetry-exporter-otlp及 fastapi/grpc/logging instrumentationHTTP 客户端httpx、urllib3另有可选 extraloggingasgi-logger、rayray[serve]、llmvllm0.24.0。三、KServe Python Server标准化模型服务库3.1 核心能力清单Server 端库为模型服务框架提供了以下开箱即用的能力注册模型并启动服务器通过ModelServer.start(models)将模型实例注册进ModelRepository并同时拉起 REST 与 gRPC 服务预测处理器Prediction Handlerpredict执行核心推理前/后处理处理器Pre/Post Processing Handlerpreprocess/postprocess用于特征变换与结果变换存活处理器Liveness Handler对应数据面/v1/health/live或/v2/health/live就绪处理器Readiness Handler对应/v1/health/ready或/v2/health/ready。以上处理器全部定义在 python/kserve/kserve/model.py 的BaseKServeModel与Model类中是每个 KServe 模型服务框架如 python/sklearnserver/sklearnserver/model.py 中的SKLearnModel继承扩展的基类。3.2 源码级调用链preprocess → validate → predict/explain → postprocess从 model.py 的实现可以看到Model.__call__是每次推理请求的统一入口其内部调用链为preprocess(body, headers)对原始请求做特征/数据变换v1 端点解码为Dictv2 端点解码为InferRequestvalidate(payload)按协议校验负载——v2 协议要求inputs为列表v1 协议要求instances为列表不合法时抛出InvalidInputmodel.pypredict(payload, headers)或explain(payload, headers)根据InferenceVerbPREDICT或EXPLAIN分发默认的predict实现会调用远端 predictorTransformer 场景支持 v1 / v2 / grpc-v2 三种协议model.pypostprocess(result, headers)对推理结果做响应变换后返回给客户端。每一步的耗时都会通过PRE_HIST_TIME、EXPLAIN_HIST_TIME、PREDICT_HIST_TIME、POST_HIST_TIME这四个 Prometheus 直方图记录详见第五节指标部分。此外从 model.py 可以看到请求头转发机制append_forwardable_headers只会把x-request-id、x-b3-traceid、authorization等白名单头转发给 predictor/explainer避免敏感信息外泄。3.3 模型生命周期与健康检查BaseKServeModelmodel.py定义了每个模型必备的生命周期方法与状态标志方法/属性作用load()从存储加载模型加载完成后将self.ready置为Truestart()执行模型启动前的设置默认将ready置为Truestart_engine()对需要推理引擎如 LLM 场景的模型启动引擎stop()/stop_engine()执行模型销毁/引擎关闭将ready置为Falsehealthy()健康检查默认返回self.readyname/ready/engine模型名、就绪标志、是否需要引擎标志ModelServer._register_and_check_atleast_one_model_is_readymodel_server.py会在启动时遍历传入的模型列表只注册readyTrue的模型并对engineTrue的模型额外启动引擎如果没有任何模型就绪会抛出NoModelReady异常——这保证了服务不会在无模型可服务的状态下对外暴露。3.4 ModelServer 启动参数详解ModelServermodel_server.py通过start(models)一次性完成模型注册、REST 服务单进程或多 worker 多进程与 gRPC 服务的启动。以下是从 model_server.py 的 argparse 定义整理出的核心参数均为真实可用的命令行参数参数默认值说明--http_port8080HTTP 服务监听端口constants.py 中DEFAULT_HTTP_PORT--grpc_port8081gRPC 服务监听端口DEFAULT_GRPC_PORT--workers1uvicorn 多进程 worker 数大于 1 时启用RESTServerMultiProcess--max_threads4gRPC 处理线程最大数--max_asyncio_workersNoneasyncio worker 上限不设置时按min(32, cpu_count 4)自动计算--enable_grpcTrue是否启动 gRPC 服务--enable_docs_urlFalse是否开放/docsSwagger UI--enable_latency_loggingTrue是否逐请求记录 preprocess/predict/postprocess 延迟日志--configure_loggingTrue是否自动配置 KServe 与 uvicorn 日志--log_config_fileNoneuvicorn 日志配置文件路径yaml/json--event-loopauto事件循环实现auto优先 uvloop、asyncio、uvloop--timeout-keep-alive65keep-alive 连接超时秒建议大于代理如 Istio/Envoy的空闲超时以避免间歇性 503--model_namemodel模型名用于端点路径--predictor_hostNoneTransformer 场景下调用 predictor 的主机名--predictor_protocolv1调用 predictor 的协议v1/v2/grpc-v2--protocol为已废弃别名--predictor_use_sslFalse到 predictor 的 HTTP 连接是否启用 SSL--predictor_request_timeout_seconds600到 predictor 的请求超时秒--predictor_request_retries0predictor 请求失败重试次数--enable_predictor_health_check关闭Transformer 额外对 predictor 做就绪检查--grpc_max_send_message_length8388608gRPC 发送消息最大长度字节--grpc_max_receive_message_length8388608gRPC 接收消息最大长度字节--ssl_certfile/--ssl_keyfile环境变量回退HTTPS 证书/私钥路径未设置时回退到KSERVE_TLS_CERT_FILE/KSERVE_TLS_KEY_FILE环境变量两点值得注意的源码细节当同时配置了ssl_certfile与ssl_keyfile且 HTTP 端口仍是默认 8080 时ModelServer会自动把监听端口切换到 HTTPS 默认端口8443model_server.pyPredictorConfigpython/kserve/kserve/predictor_config.py将 predictor 的主机、协议、SSL、超时、重试、健康检查等参数统一封装并通过全局 context 提供给Model与DataPlane使用。3.5 数据面协议与 CloudEvent 支持python/kserve/kserve/protocol/dataplane.py 中的DataPlane类实现了 KServe 数据面 API负责请求解码decode/decode_cloudevent/decode_inference_request与响应编码encode并通过ModelRepository按名称获取模型后调用推理。其关键端点能力live()返回{status: alive}供 Kubernetes liveness 探针使用ready()返回就绪状态若当前是 Transformer 且开启了 predictor 健康检查还会联动检查远端 predictor 的健康v1 用 liveness 端点、v2 用 readiness 端点、grpc-v2 用is_server_readymetadata()返回服务名、版本及扩展列表含model_repository_extensionmodel_metadata(model_name)返回模型元数据name、platform、inputs、outputs其中输入/输出类型由InferenceModel.get_input_types()/get_output_types()提供infer/explain最终调用模型的__call__完成预测/解释。数据面同时支持CloudEvent结构化与二进制两种编码方式当请求头包含ce-contenttype等 CloudEvent 头时会按二进制 CloudEvent 解析当请求体是结构化 CloudEventapplication/cloudeventsjson时解析data字段响应端同样会按请求的 CloudEvent 格式回包dataplane.py。四、模型存储六类存储提供商与鉴权方式KServe Python Server 内置了对以下存储提供商的支持源自 python/kserve/README.md 的原始定义存储检索的具体实现由 python/storage 模块承载存储提供商URI 前缀/格式鉴权方式Google Cloud Storage (GCS)gs://默认读取GOOGLE_APPLICATION_CREDENTIALS环境变量未设置时退化为匿名客户端下载S3 兼容对象存储s3://默认读取S3_ENDPOINT、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY环境变量Azure Blob Storagehttps://{$STORAGE_ACCOUNT_NAME}.blob.core.windows.net/{$CONTAINER}/{$PATH}默认使用匿名客户端示例https://kfserving.blob.core.windows.net/triton/simple_string/本地文件系统无前缀或file://无需鉴权Persistent Volume Claim (PVC)pvc://{$pvcname}/[path]pvcname为存放模型的 PVC 名称[path]为模型在 PVC 上的相对路径示例pvc://mypvcname/model/path/on/pvc通用 HTTP(S) URIhttp:///https://视远端服务而定本地文件系统路径的四种写法示例绝对路径/absolute/path或file:///absolute/path相对路径relative/path或file://relative/path官方建议本地文件系统优先使用不带前缀的相对路径。4.1 存储检索的源码实现Storage.download模型框架在load()中通过Storage.download()将模型下载到本地目录。以 python/sklearnserver/sklearnserver/model.py 的SKLearnModel为例from kserve_storage import Storage def load(self) - bool: model_path pathlib.Path(Storage.download(self.model_dir)) # 在模型目录中查找 .joblib/.pkl/.pickle 文件 for file in os.listdir(model_path): if os.path.isfile(file_path) and file.endswith(MODEL_EXTENSIONS): model_files.append(model_path / file) if len(model_files) 0: raise ModelMissingError(model_path) elif len(model_files) 1: raise RuntimeError(More than one model file is detected ...) self._model joblib.load(model_files[0]) self.ready True return self.ready该实现同时展示了load()的标准模式下载 → 校验 → 加载 → 置readyTrue。另外SKLearn 服务还支持通过环境变量PREDICT_PROBA值为true切换为输出predict_proba概率结果model.py。4.2 kserve-storage 模块的扩展能力python/storage/README.md 进一步说明了存储模块的能力边界——除 README 主文档列出的六类外还支持Azure File Sharehttps://{account}.file.core.windows.net/{share}/...、HDFS/WebHDFShdfs://、webhdfs://、Hugging Face Hubhf://org-name/model-name或带 revision 的hf://org-name/model-name:revision并支持 zip/tar.gz/tgz 压缩包的自动解压。S3 场景下常用的环境变量摘自 python/storage/README.mdAWS_ENDPOINT_URLS3 兼容存储的自定义端点AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY访问密钥AWS_DEFAULT_REGION区域S3_VERIFY_SSL是否校验 SSLS3_MAX_FILE_CONCURRENCY并行下载文件数S3_CONNECT_TIMEOUT默认 15 秒、S3_READ_TIMEOUT默认 30 秒、S3_MAX_ATTEMPTS默认 3 次重试Azure 场景python/storage/README.mdAZURE_STORAGE_ACCESS_KEY、AZ_TENANT_ID/AZURE_TENANT_ID、AZ_CLIENT_ID/AZURE_CLIENT_ID、AZ_CLIENT_SECRET/AZURE_CLIENT_SECRET等。此外还支持STORAGE_CONFIG与STORAGE_OVERRIDE_CONFIG两个 JSON 配置环境变量来批量注入存储配置。五、指标与可观测性5.1 Prometheus 延迟指标向/metrics端点发送请求即可获取延迟指标。Server 端为pre/postprocessing、explain、predict四个阶段分别发射 Prometheus 直方图同时每个请求的阶段延迟也会逐条写入日志。指标定义见 python/kserve/kserve/metrics.py标签为model_name指标名描述类型request_preprocess_seconds预处理请求延迟Histogramrequest_explain_seconds解释请求延迟Histogramrequest_predict_seconds预测请求延迟Histogramrequest_postprocess_seconds后处理请求延迟Histogram说明原文档表格中request_postprocess_seconds的描述标注为 pre-processing request latency依据 metrics.py 的源码定义post-process request latency其正确含义为后处理延迟。5.2 延迟日志与开关控制--enable_latency_loggingTrue默认开启时每次请求会输出一行日志包含requestId、preprocess_ms、explain_ms、predict_ms、postprocess_msmodel.py该开关会由ModelServer在注册模型时同步写入每个模型的enable_latency_logging属性model_server.py。5.3 日志与链路追踪SDK 内置了结构化日志与 OpenTelemetry 集成依赖见 pyproject.toml支持通过--access_log_format覆盖 uvicorn access log 格式输出固定到 stdout并支持 asyncio 事件循环异常处理器自定义register_exception_handler见 model_server.py。六、KServe Client集群控制面操作KServe Client 与 Server 端不同它运行在远程管理侧通过 Kubernetes 客户端库与集群 API Server 交互对 KServe 控制面资源InferenceService、InferenceGraph、TrainedModel、LocalModelCache 等执行创建、查询、修补、删除等操作。完整实现见 python/kserve/kserve/api/kserve_client.py。6.1 初始化与 kubeconfigKServeClient构造函数支持四种配置来源kserve_client.pyconfig_filekubeconfig 文件路径默认~/.kube/configconfig_dict以 dict 形式传入的 kubeconfig 内容context指定 Kubernetes contextclient_configuration直接传入kubernetes的配置对象。若上述参数均未提供且进程运行在 Kubernetes 集群内部utils.is_running_in_k8s()则自动使用load_incluster_config()加载集群内配置。初始化完成后Client 会持有 CoreV1Api、AppsV1Api、CustomObjectsApi、AutoscalingV2Api 四个 API 句柄。单元测试示例python/kserve/test/test_inference_service_client.pyfrom kserve import KServeClient, V1beta1InferenceService, V1beta1InferenceServiceSpec, V1beta1PredictorSpec, V1beta1TFServingSpec kserve_client KServeClient(config_file./kserve/test/kubeconfig) tf_spec V1beta1TFServingSpec(storage_urigs://kfserving-samples/models/tensorflow/flowers) predictor_spec V1beta1PredictorSpec(tensorflowtf_spec) isvc V1beta1InferenceService( api_versionserving.kserve.io/v1beta1, kindInferenceService, metadataclient.V1ObjectMeta(nameflower-sample), specV1beta1InferenceServiceSpec(predictorpredictor_spec), )6.2 核心 CRUD 操作KServeClient针对 InferenceService 提供了完整的增删改查能力全部经由CustomObjectsApiAPI 组为serving.kserve.io方法功能关键参数create(isvc, namespace, watch, timeout_seconds)创建 InferenceServicewatchTrue时阻塞等待服务就绪默认超时 600 秒get(name, namespace, watch, timeout_seconds, version)查询单个或列出全部 InferenceService无name时列出该命名空间下全部资源patch(name, isvc, namespace, watch, timeout_seconds)修补已有 InferenceService适合原地修改部分字段replace(name, isvc, namespace, watch, timeout_seconds)整体替换 InferenceService会自动获取当前resourceVersion再执行替换delete(name, namespace, version)删除 InferenceService默认使用v1beta1版本操作对象既可以是 SDK 生成的类型化对象如V1beta1InferenceService也可以是符合 API 结构的 dictkserve_client.py 内部直接透传给create_namespaced_custom_object。6.3 就绪等待与 watch 机制is_isvc_ready(name, namespace, version, expected_generation)轮询 InferenceService 状态检查status.conditions中type Ready的条件是否为true可配合expected_generation校验观察到的observedGeneration是否达到目标代次避免读到旧状态的假就绪wait_isvc_ready(name, namespace, watch, timeout_seconds, polling_interval, expected_generation)阻塞等待就绪默认轮询间隔 10 秒、超时 600 秒超时后抛出RuntimeError并打印当前 InferenceService 完整对象便于排查watchTrue时则调用 python/kserve/kserve/api/watch.py 的isvc_watch持续 watch 资源事件直至就绪。注意patch在watchTrue时会先 sleep 3 秒再开始 watchkserve_client.py目的是避免短暂窗口内旧状态仍为True造成误判。6.4 存储凭据注入set_credentialsset_credentials(storage_type, namespace, credentials_file, service_account, **kwargs)kserve_client.py可为指定命名空间的 ServiceAccount 注入 GCS / S3 / Azure 三类存储凭据storage_typegcs/s3/azure未指定credentials_file时使用默认路径GCS 为~/.config/gcloud/application_default_credentials.jsonS3 为~/.aws/credentialsAzure 为~/.azure/azure_credentials.json常量见 constants.py默认 ServiceAccount 为kserve-service-credentials凭据最终会被封装进名为kserve-secret-*的 Secret 并挂载到推理 Pod。6.5 更多控制面 API除 InferenceService 外Client 还封装了kserve_client.pyTrainedModelcreate_trained_model/delete_trained_model/wait_model_ready后者会轮询数据面模型健康端点/{protocol}/models/{model}直至返回 200InferenceGraphv1alpha1create_inference_graph/get_inference_graph/delete_inference_graph/is_ig_ready/wait_ig_ready用于编排多步推理路由LocalModel 系列本地模型缓存/节点组create_local_model_cache、create_local_model_node_group、create_local_model_namespace_cache及对应的查询、删除与就绪等待方法用于在节点上预缓存模型。七、SDK 模型对象文档地图KServe Python SDK 通过kserve包导出大量类型化模型对象见 python/kserve/kserve/init.py覆盖 v1alpha1 与 v1beta1 两个 API 版本包括 InferenceService 系列V1beta1InferenceService、V1beta1InferenceServiceSpec、V1beta1InferenceServiceStatus、各框架 Predictor 规格V1beta1SKLearnSpec、V1beta1XGBoostSpec、V1beta1TFServingSpec、V1beta1TorchServeSpec、V1beta1TritonSpec、V1beta1PMMLSpec等、Transformer/Explainer 系列以及 InferenceGraph 系列。每个模型对象的完整属性文档字段名、类型、说明、是否可选都沉淀在 python/kserve/docs 目录下例如V1beta1InferenceService.mdInferenceService 顶层 Schemaapi_version、kind、metadata、spec、statusV1beta1InferenceServiceSpec.mdspec 结构predictor/transformer/explainerV1beta1PredictorSpec.mdpredictor 组件规格V1beta1SKLearnSpec.mdSKLearn 预测器规格包含storage_uri、runtime_version、protocol_versionv1/v2/grpc-v1/grpc-v2以及标准容器字段image、resources、探针等其余框架规格文档同理可用于在编码时精确查询字段约束。八、测试与示例入口8.1 单元测试SDK 的测试覆盖完整python/kserve/test与本文主题直接相关的有test_inference_service_client.pyClient 的 create/get/patch/watch 单元测试使用 mock 与本地 kubeconfig 夹具test_dataplane.py 与 test_rest_server.py、test_grpc_server.py数据面与 REST/gRPC 服务测试test_model_server.py、test_model_repository.py模型注册与仓库管理测试test_header_forwarding.py请求头转发白名单机制测试。8.2 实战示例Client SDK 入门示例仓库中的 docs/samples/client/kfserving_sdk_v1beta1_sample.ipynb 提供了从创建 InferenceService 到等待就绪、发起预测请求的完整 notebook 示例是 README 推荐的 Client 上手起点各框架 Server 示例可在 python/sklearnserver、python/xgbserver、python/huggingfaceserver 等目录中查看基于Model/ModelServer的完整服务实现。结语KServe Python SDK 通过Server与Client两个对称的组件把在集群内跑模型服务与在集群外管模型服务这两件事统一到了同一个 Python 生态里。Server 端以BaseKServeModel/Model为扩展点、以ModelServer为运行框架、以DataPlane为协议面配合 kserve-storage 的多后端下载能力与 Prometheus 指标可以快速构建生产级的自定义推理服务Client 端则以KServeClient提供对 InferenceService、InferenceGraph、TrainedModel、LocalModelCache 等控制面资源的全生命周期管理。希望本文的源码级拆解能帮助你更高效地使用这套 SDK。赞分享模型推理服务云原生后端微服务MLOps人工智能【免费下载链接】kserveStandardized Distributed Generative and Predictive AI Inference Platform for Scalable, Multi-Framework Deployment on Kubernetes项目地址https://gitcode.com/gh_mirrors/ks/kserve点击查看免费下载相关推荐go-micro 客户端/服务端Client/ServerRPC 通信模型完全指南go micro 客户端/服务端Client/ServerRPC 通信模型完全指南 本指南围绕 go micro仓库根目录 README.md https后端微服务AI AgentRPC框架KServe LightGBM 推理服务实战指南从模型训练到 InferenceService 端到端部署KServe LightGBM 推理服务实战指南从模型训练到 InferenceService 端到端部署 本文是一份以 docs/samples/v1bet模型推理服务云原生后端微服务MLOps人工智能KServe Python SDK 详解V1alpha1ClusterServingRuntimeList 模型结构、字段校验与服务端类型对应KServe Python SDK 详解V1alpha1ClusterServingRuntimeList 模型结构、字段校验与服务端类型对应 本文围绕 KS模型推理服务云原生后端微服务MLOps人工智能上一篇Apache Storm 原生依赖安装指南ZeroMQ 与 JZMQ 的编译、安装与排错下一篇HTTP API 设计指南为 JSON 响应定义标准数据类型http-api-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考