十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Triton Inference Server 的 tritonfrontend Python 绑定:用几行 Python 启动 KServe HTTP、gRPC 与 Metrics 服务

Triton Inference Server 的 tritonfrontend Python 绑定:用几行 Python 启动 KServe HTTP、gRPC 与 Metrics 服务 Triton Inference Server 的 tritonfrontend Python 绑定用几行 Python 启动 KServe HTTP、gRPC 与 Metrics 服务【免费下载链接】serverThe Triton Inference Server provides an optimized cloud and edge inferencing solution.项目地址: https://gitcode.com/gh_mirrors/server117/servertritonfrontend是 Triton Inference Server 提供的一组 Python 绑定Beta它将 Triton 用 C 实现的现有前端Frontend服务封装为可直接调用的 Python 类支持启动KServeHttp与KServeGrpc前端以及独立的 Metrics 服务。结合 Python In-Process APItritonserver包与tritonclient开发者无需修改任何 C 代码、也无需启动独立的tritonserver二进制进程就能在同一个 Python 进程内完成加载模型 → 启动 HTTP/gRPC 服务 → 接收推理请求的完整闭环。读完本文你将掌握tritonfrontend的依赖要求、三步式启动流程、上下文管理器用法以及 HTTP/gRPC/Metrics 三类服务的完整配置参数与底层绑定实现原理。tritonfrontend 是什么对 C 前端的 Python 绑定tritonfrontend的本质是一层薄薄的 Python 绑定它直接对接 Triton 服务端已经用 C 实现并经过生产验证的 HTTP 与 gRPC 服务代码。从源码结构看绑定层位于 src/python/tritonfrontend 目录_api/Python 层的类封装包括KServeHttp、KServeGrpc、Metrics以及错误映射模块_c/通过 pybind11 生成的 C 扩展tritonfrontend_bindings源码见 tritonfrontend_pybind.cc包顶层init.py 按编译开关条件导出类。在init.py 中可以看到条件导入逻辑当 Triton 以TRITON_ENABLE_HTTPOFF编译时KServeHttp的导入会被静默跳过gRPC、Metrics 同理分别对应TRITON_ENABLE_GRPC与TRITON_ENABLE_METRICS编译开关。因此运行时能导入哪些前端类取决于服务端二进制在构建时开启了哪些前端这一点在使用前需要注意。这种绑定架构带来的直接收益是你可以在 Python 进程中通过 Triton 的 Python In-Process APItritonserver参见 Python In-Process API 指南创建服务端对象再把该对象直接交给tritonfrontend启动网络前端最终用tritonclient参见 Python 客户端指南或curl发起请求。整个过程只需几行 Python却能使用 Triton 的完整功能集。运行时依赖为什么必须存在 libtritonserver.sotritonfrontend的一个关键约束是它的 wheel 包不打包libtritonserver.so。原因在于绑定层操作的是由tritonserver包创建的服务端对象二者在运行时必须解析到同一份库拷贝否则对象指针与内部 ABI 将无法对齐。因此在构建阶段libtritonserver.so会在auditwheel repair时被显式排除出 wheel运行时改为从 Triton 安装目录解析该库在 Triton 容器中默认位置是/opt/tritonserver/lib从 CMakeLists.txt 可以看到绑定扩展的BUILD_RPATH被设置为$ORIGIN:/opt/tritonserver/lib直接印证了这一设计。所以tritonfrontend不能脱离 Triton 安装独立使用它要求动态链接器搜索路径上存在由既有 Triton 安装提供的libtritonserver.so没有该库时它无法作为独立的pip install包单独工作tritonserverwheel 出于同样的原因也排除了该库。在实践中这意味着你应当在一个完整的 Triton 运行环境例如 Triton 容器或安装了 Triton 服务端库的主机中安装并使用这两个包。快速上手三步启动一个可服务的推理进程下面以一个最小可运行示例走通完整流程。仓库中已提供可直接运行的参考实现 src/python/examples/example.py其模型仓库为example_model_repository使用identity模型输入等于输出。第 1 步用 tritonserver 加载模型并启动服务端首先构造模型仓库路径用tritonserver.Options配置服务端然后启动并等待就绪import tritonserver # Constructing path to Model Repository model_path fserver/src/python/examples/example_model_repository server_options tritonserver.Options( server_idExampleServer, model_repositorymodel_path, log_errorTrue, log_warnTrue, log_infoTrue, ) server tritonserver.Server(server_options).start(wait_until_readyTrue)注意model_path需要根据你的实际环境调整。示例中identity模型位于example_model_repository/identity其配置为输入张量INPUT0、输出张量OUTPUT0数据副本即输出非常适合验证请求通路。wait_until_readyTrue会阻塞直到模型加载完成、服务端进入就绪状态避免后续启动前端时出现竞态。第 2 步用 tritonfrontend 启动 HTTP / gRPC / Metrics 服务把上一步创建的server对象传给tritonfrontend的各类服务即可分别启动 KServe HTTP默认端口 8000、KServe gRPC默认端口 8001和 Metrics默认端口 8002from tritonfrontend import KServeHttp, KServeGrpc, Metrics http_options KServeHttp.Options(thread_count5) http_service KServeHttp(server, http_options) http_service.start() # Default options (if none provided) grpc_service KServeGrpc(server) grpc_service.start() # Can start metrics service as well metrics_service Metrics(server) metrics_service.start()从 tritonfrontend_pybind.cc 可以看到每个服务类底层对应一个 C 模板实例TritonFrontendHttp→TritonFrontendHTTPServer, HTTPAPIServerKServe HTTPTritonFrontendGrpc→TritonFrontendgrpc::Server, grpc::ServerKServe gRPCTritonFrontendMetrics→TritonFrontendHTTPServer, HTTPMetricsServerMetrics。三个类均暴露start()与stop()两个方法分别对应 C 侧StartService与StopService。第 3 步用 tritonclient 或 curl 发送推理请求服务就绪后即可用tritonclient.http发起推理。以下示例向identity模型发送一条BYTES类型的字符串张量import tritonclient.http as httpclient import numpy as np # Use version numpy 2 model_name identity # output input url localhost:8000 # Create a Triton client client httpclient.InferenceServerClient(urlurl) # Prepare input data input_data np.array([[Roger Roger]], dtypeobject) # Create input and output objects inputs [httpclient.InferInput(INPUT0, input_data.shape, BYTES)] # Set the data for the input tensor inputs[0].set_data_from_numpy(input_data) results client.infer(model_name, inputsinputs) # Get the output data output_data results.as_numpy(OUTPUT0) # Print results print([INFERENCE RESULTS]) print(Output data:, output_data)提示示例中使用numpy构造对象数组需使用numpy 2的版本以避免对象数组行为变化带来的兼容问题。发送请求同样可以使用标准的curl命令请求体遵循 Triton HTTP 推理协议curl -X POST localhost:8000/v2/models/identity/infer \ -d {inputs:[{name:INPUT0,shape:[1,1],datatype:BYTES,data:[Roger Roger]}]}请求完成后按与启动相反的顺序停止各服务并关闭服务端# Stop respective services and server. metrics_service.stop() http_service.stop() grpc_service.stop() server.stop()用上下文管理器自动管理服务生命周期除了手动调用start()/stop()tritonfrontend还提供上下文管理器支持进入with块时自动start()退出时自动stop()从而省去显式停止每个服务的步骤。以下代码等价于上面的第 2、3 步加清理过程from tritonfrontend import KServeHttp import tritonclient.http as httpclient import numpy as np # Use version numpy 2 with KServeHttp(server) as http_service: # The identity model returns an exact duplicate of the input data as output model_name identity url localhost:8000 # Create a Triton client with httpclient.InferenceServerClient(urlurl) as client: # Prepare input data input_data np.array([Roger Roger], dtypeobject) # Create input and output objects inputs [httpclient.InferInput(INPUT0, input_data.shape, BYTES)] # Set the data for the input tensor inputs[0].set_data_from_numpy(input_data) # Perform inference results client.infer(model_name, inputsinputs) # Get the output data output_data results.as_numpy(OUTPUT0) # Print results print([INFERENCE RESULTS]) print(Output data:, output_data) server.stop()从 _kservehttp.py 的实现看__enter__调用self.triton_frontend.start()并返回自身__exit__调用stop()并在存在异常时重新抛出原异常。KServeGrpc与Metrics类具有相同的上下文管理器协议。使用这种写法客户端请求终止后服务自动回收无需再逐一手动停止。Options 配置详解三个服务类都通过各自的Optionsdataclass 接收配置Options可缺省缺省时使用默认值。从实现看dataclass 实例会被转换为 Python 字典再透传为 C 侧的unordered_mapstring, variant...交给底层服务构造。下面分别列出每个类的全部参数与默认值依据 _kservehttp.py、_kservegrpc.py、_metrics.py。KServeHttp.Options参数默认值说明address0.0.0.0HTTP 服务监听地址port8000监听端口范围0~65535reuse_portFalse是否启用端口复用SO_REUSEPORTthread_count8HTTP 工作线程数必须大于 0header_forward_pattern需要转发到模型请求头的 HTTP header 匹配模式正则例如文档示例中的KServeHttp.Options(thread_count5)即显式把 HTTP 工作线程调整为 5仓库示例 example.py 则用KServeHttp.Options(port8005)把服务改到自定义端口。KServeGrpc.OptionsKServe gRPC 服务的参数最为丰富覆盖 Socket、SSL、KeepAlive 与推理执行四组配置分组参数默认值说明Socketaddress0.0.0.0gRPC 监听地址Socketport8001监听端口范围0~65535Socketreuse_portFalse端口复用开关SSLuse_sslFalse是否启用 TLSSSLserver_cert服务端证书路径SSLserver_key服务端私钥路径SSLroot_cert根证书路径SSLuse_mutual_authFalse是否启用双向认证mTLSKeepAlivekeepalive_time_ms7200000无活动连接时的保活探测间隔毫秒KeepAlivekeepalive_timeout_ms20000保活探测超时毫秒KeepAlivekeepalive_permit_without_callsFalse无活动调用时是否允许发送保活 pingKeepAlivehttp2_max_pings_without_data2无数据时最多发送的 ping 次数KeepAlivehttp2_min_recv_ping_interval_without_data_ms300000无数据时接收 ping 的最小间隔毫秒KeepAlivehttp2_max_ping_strikes2违反 ping 策略的累计违规次数上限KeepAlivemax_connection_age_ms0连接最大存活时间毫秒0 表示不限制KeepAlivemax_connection_age_grace_ms0连接到期后的宽限期毫秒推理infer_compression_levelNONEgRPC 压缩级别取值NONE/LOW/MED/HIGH推理infer_thread_count2推理线程数推理infer_allocation_pool_size8推理请求内存分配池大小推理max_response_pool_size2147483647响应内存池上限推理forward_header_pattern转发到模型请求头的 header 匹配模式其中infer_compression_level支持传入Grpc_compression_level枚举镜像自 C 定义取值NONE0、LOW1、MED2、HIGH3、COUNT4__post_init__会自动把枚举转换为整数后再传给底层。Metrics.Options参数默认值说明address0.0.0.0Metrics 监听地址port8002监听端口范围0~65535thread_count1Metrics 服务线程数必须大于 0Metrics 服务暴露 Prometheus 格式的指标端点/metrics可用于监控推理延迟、吞吐等运行指标。底层实现pybind11 绑定与错误映射tritonfrontend的 C 侧通过 pybind11 把前端服务封装为 Python 模块。在 tritonfrontend_pybind.cc 中模块注册了一组与tritonserver风格一致的异常类型TritonError、NotFoundError、InvalidArgumentError、UnavailableError、UnsupportedError、AlreadyExistsError、InternalError、UnknownError并在TRITON_ENABLE_HTTP/TRITON_ENABLE_GRPC/TRITON_ENABLE_METRICS编译宏控制下分别暴露TritonFrontendHttp、TritonFrontendGrpc、TritonFrontendMetrics三个类。Python 层的错误处理由 _error_mapping.py 完成handle_triton_error装饰器捕获绑定层抛出的TritonError子类并通过ERROR_MAPPING字典映射为tritonserver包中对应的异常类型后重新抛出使用raise ... from None屏蔽底层 traceback。这样调用方捕获到的异常类型与 In-Process API 保持一致便于统一处理。从构建层面看CMakeLists.txt 中的pybind11_add_module以_c/tritonfrontend_pybind.cc与_c/tritonfrontend.h为核心源文件链接 HTTP/gRPC 端点库http-endpoint-library、grpc-endpoint-library并根据TRITON_ENABLE_GPU链接 CUDA 运行时、设置BUILD_RPATH指向/opt/tritonserver/lib。这也解释了为什么该绑定必须在一个完整的 Triton 构建产物环境中使用。已知限制与注意事项当前通过tritonfrontendPython 绑定启动前端服务时以下功能尚不支持Tracing链路追踪功能不可用相关文档见 Trace 指南Shared Memory共享内存扩展不可用相关协议见 扩展共享内存Restricted Protocols受限协议/端点访问控制不可用代码中restricted_protocols参数仍处于注释状态见 _kservehttp.py 与 _kservegrpc.py相关设计见 限制端点访问BetaVertexAI前端Sagemaker前端。另外有一个已知的稳定性问题运行中的服务端被停止后如果客户端仍向该服务发送推理请求会发生段错误Segmentation Fault。因此在调用server.stop()之前务必确保所有前端服务均已停止、所有客户端请求已经结束。相关文档Python In-Process API 指南tritonserver包的完整用法是使用tritonfrontend的前置知识Python 客户端指南tritonclient的 HTTP/gRPC 客户端使用说明Trace 指南 与 扩展共享内存当前绑定暂不支持的相关功能文档限制端点访问Beta受限协议设计说明可运行示例example.py演示KServeHttp 上下文管理器 tritonclient的端到端调用绑定源码_kservehttp.py、_kservegrpc.py、_metrics.py、tritonfrontend_pybind.cc。总之tritonfrontend让开发者能够在纯 Python 环境中复用 Triton 久经考验的 C 前端实现以极低的开销完成服务化推理的搭建。使用时请牢记其 Beta 状态、对libtritonserver.so的运行时依赖以及上述功能限制从而避免在生产场景中踩坑。【免费下载链接】serverThe Triton Inference Server provides an optimized cloud and edge inferencing solution.项目地址: https://gitcode.com/gh_mirrors/server117/server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表