模型推理服务AI 应用后端【免费下载链接】serverThe Triton Inference Server provides an optimized cloud and edge inferencing solution.项目地址https://gitcode.com/gh_mirrors/server117/server点击查看免费下载模型仓库Model Repository扩展是 Triton Inference Server 对外提供的核心管理协议之一它允许客户端通过 HTTP/REST 或 gRPC 查询服务器当前托管的全部模型并在运行期动态加载、重载或卸载模型而无需重启服务进程。本文以仓库内 docs/protocol/extension_model_repository.md 为骨架结合 HTTP 服务端实现、gRPC 服务端实现 与 生命周期测试完整讲解该扩展的协议格式、参数语义、底层调用链与工程约束读者读完即可直接编写客户端代码调用这三组 API并理解其内部实现原理。扩展能力概述动态管理模型的生命周期模型仓库扩展让客户端能够查询并控制 Triton 正在服务的一个或多个模型仓库。只要服务端启用了该扩展Server Metadata 的extensions字段中就会报告model_repository字符串。此外该扩展还包含一个可选组件允许 Unload API 携带unload_dependents参数。支持该可选组件的 Triton 版本还会在extensions字段中额外报告model_repository(unload_dependents)客户端可以据此判断服务端是否支持级联卸载依赖模型的能力。从源码角度看该扩展在 HTTP 端与 gRPC 端分别注册了两套入口HTTP 端路由正则定义在 src/http_server.cc匹配形如/v2/repository/...的 URLgRPC 端三个 RPCRepositoryIndex、RepositoryModelLoad、RepositoryModelUnload在 src/grpc/grpc_server.cc 中注册均绑定MODEL_REPOSITORY受限类别restricted category可通过服务端受限 API 配置进行开关控制。HTTP/REST 协议HTTP 版本要求实现 Index、Load、Unload 三组 API暴露在以下 URL 上${MODEL_NAME}为模型名占位符POST v2/repository/index POST v2/repository/models/${MODEL_NAME}/load POST v2/repository/models/${MODEL_NAME}/unload本文所有 JSON schema 中$number、$string、$boolean、$object、$array分别指代 JSON 基础类型#optional表示该字段可选。Index查询仓库中所有可用模型Index API 返回模型仓库中每个模型的信息——即使该模型当前尚未被加载进 Triton。它提供了一种途径让客户端可以判断哪些模型可以被 Load API 加载。请求通过 HTTP POST 发送到 index 端点响应体为 JSON。请求对象$repository_index_request必须出现在 POST 请求的 HTTP body 中$repository_index_request { ready : $boolean #optional, }ready可选默认值为false。若为true则只返回当前已就绪可以执行推理的模型。成功的 Index 请求以 HTTP 200 状态码表示响应对象$repository_index_response为 JSON 数组数组中每个元素描述一个模型$repository_index_response [ { name : $string, version : $string #optional, state : $string, reason : $string }, … ]name模型名称version模型版本state模型当前状态典型的取值包括READY、UNAVAILABLE、LOADING、UNLOADINGreason模型处于当前状态的原因如有。失败的 Index 请求以 HTTP 错误状态码通常为 400表示HTTP body 必须包含$repository_index_error_response对象$repository_index_error_response { error: $string }error错误的描述性信息。在服务端实现中HTTPAPIServer::HandleRepositoryIndex 会先校验请求必须是 POST 方法然后解析 body 中的ready布尔字段类型不合法会返回INVALID_ARG错误将其映射为TRITONSERVER_INDEX_FLAG_READY标志位最终调用底层 C APITRITONSERVER_ServerModelIndex获取模型索引消息并序列化为 JSON 返回。Load加载或重载模型Load API 请求 Triton 加载某个模型若该模型已加载则触发重载。请求通过 HTTP POST 发送到 load 端点HTTP body 可以为空也可以包含加载请求对象$repository_load_request。成功的加载请求以 HTTP 200 状态码表示。$repository_load_request { parameters : $parameters #optional }parameters包含零个或多个键值对形式的请求参数。Load API 支持以下参数config字符串参数内容是模型配置的 JSON 表示必须能够被解析为model_config.proto中定义的ModelConfig消息。该配置将替代模型目录中的config.pbtxt用于加载模型。一旦提供了config就相当于模型元数据被更新会触发一次与元数据更新等价的重载行为。file:version/file-namebase64 编码的序列化模型文件用于指定覆盖override模型目录让 Triton 从请求中携带的文件而非磁盘目录加载模型。例如用户希望加载一个版本号为 2 的 ONNX 模型就把参数名写为file:2/model.onnx值为该文件的 base64 编码内容。注意使用file:参数时必须同时提供config参数作为覆盖模型目录的模型配置。失败的 Load 请求以 HTTP 错误状态码通常为 400表示HTTP body 必须包含$repository_load_error_response$repository_load_error_response { error: $string }error错误的描述性信息。Load 完整请求示例以下请求将加载模型mymodel并同时提供模型配置与模型文件内容POST /v2/repository/models/mymodel/load HTTP/1.1 Host: localhost:8000 { parameters: { config: { name: mymodel, backend: onnxruntime, inputs: [{ name: INPUT0, datatype: FP32, shape: [ 1 ] } ], outputs: [{ name: OUTPUT0, datatype: FP32, shape: [ 1 ] } ] }, file:1/model.onnx : base64-encoded-file-content } }从源码看HTTP 端 HandleRepositoryControl 对action load的分支会遍历parameters对象中的每个成员config被构造为字符串类型参数键名以file:前缀开头的成员见 src/http_server.cc则先经过DecodeBase64解码为二进制内容再构造为字节类型参数。解码后的文件内容会被保存在一个列表中其生命周期覆盖TRITONSERVER_ServerLoadModelWithParameters调用全程确保参数在底层加载完成前始终有效。最终统一调用TRITONSERVER_ServerLoadModelWithParameters完成带参数的模型加载。Unload卸载模型Unload API 请求 Triton 卸载某个模型。请求通过 HTTP POST 发送到 unload 端点HTTP body 可以为空也可以包含卸载请求对象$repository_unload_request。成功的卸载请求以 HTTP 200 状态码表示。$repository_unload_request { parameters : $parameters #optional }parameters包含零个或多个键值对形式的请求参数。Unload API 支持以下参数unload_dependents布尔参数指示除了卸载请求的模型外还要一并卸载随该模型一起加载的所有依赖模型。例如请求卸载构成某个 ensemble模型集成的组成模型时会连带卸载该 ensemble 本身。失败的 Unload 请求以 HTTP 错误状态码通常为 400表示HTTP body 必须包含$repository_unload_error_response$repository_unload_error_response { error: $string }error错误的描述性信息。在 HandleRepositoryControl 的action unload分支中服务端会解析 body 中的unload_dependents布尔字段解析失败会返回包含Unable to parse unload_dependents的错误信息为true时调用TRITONSERVER_ServerUnloadModelAndDependents级联卸载否则调用TRITONSERVER_ServerUnloadModel只卸载指定模型。gRPC 协议gRPC 版本同样要求实现三组 API定义在GRPCInferenceService服务中service GRPCInferenceService { … // Get the index of model repository contents. rpc RepositoryIndex(RepositoryIndexRequest) returns (RepositoryIndexResponse) {} // Load or reload a model from a repository. rpc RepositoryModelLoad(RepositoryModeLoadRequest) returns (RepositoryModelLoadResponse) {} // Unload a model. rpc RepositoryModelUnload(RepositoryModelUnloadRequest) returns (RepositoryModelUnloadResponse) {} }gRPC 的参数通过ModelRepositoryParameter消息承载它使用oneof支持四种取值类型message ModelRepositoryParameter { // The parameter value can be a string, an int64, a boolean // or a message specific to a predefined parameter. oneof parameter_choice { // A boolean parameter value. bool bool_param 1; // An int64 parameter value. int64 int64_param 2; // A string parameter value. string string_param 3; // A bytes parameter value. bytes bytes_param 4; } }错误通过请求返回的google.rpc.Status指示OK表示成功其他状态码表示失败。gRPC 端三个 RPC 的注册与执行逻辑位于 src/grpc/grpc_server.cc其中 RepositoryIndex 是同步执行asyncfalseLoad 与 Unload 则标记为异步执行。RepositoryIndexRepositoryIndexAPI 返回模型仓库中每个模型的信息——即使模型尚未被加载进 Triton。请求与响应消息定义如下message RepositoryIndexRequest { // The name of the repository. If empty the index is returned // for all repositories. string repository_name 1; // If true return only models currently ready for inferencing. bool ready 2; } message RepositoryIndexResponse { // Index entry for a model. message ModelIndex { // The name of the model. string name 1; // The version of the model. string version 2; // The state of the model. string state 3; // The reason, if any, that the model is in the given state. string reason 4; } // An index entry for each model. repeated ModelIndex models 1; }实现上src/grpc/grpc_server.cc服务端先检查repository_name是否为空非空则返回UNSUPPORTED错误原因见下文关键实现约束然后将ready标志映射为TRITONSERVER_INDEX_FLAG_READY调用TRITONSERVER_ServerModelIndex得到 JSON 索引消息逐条解析name、version、state、reason字段填充到响应中的models数组。RepositoryModelLoadRepositoryModelLoadAPI 请求加载或重载模型。请求与响应消息定义如下message RepositoryModelLoadRequest { // The name of the repository to load from. If empty the model // is loaded from any repository. string repository_name 1; // The name of the model to load, or reload. string model_name 2; // Optional parameters. mapstring, ModelRepositoryParameter parameters 3; } message RepositoryModelLoadResponse { }RepositoryModelLoad支持以下参数config字符串参数内容是模型配置的 JSON 表示必须能解析为ModelConfig消息用于替代模型目录中的配置提供后相当于模型元数据更新触发等价的重载行为。file:version/file-name字节参数包含模型文件内容用于指定覆盖模型目录。例如加载一个版本为 2 的 ONNX 模型参数名为file:2/model.onnx值为文件内容。注意同样必须同时提供config参数。gRPC 端对参数做了严格的类型校验src/grpc/grpc_server.ccconfig必须是string_paramfile:前缀的参数必须是bytes_param否则返回INVALID_ARG错误遇到无法识别的参数名同样返回错误。校验通过后统一调用TRITONSERVER_ServerLoadModelWithParameters执行加载。RepositoryModelUnloadRepositoryModelUnloadAPI 请求卸载模型。请求与响应消息定义如下message RepositoryModelUnloadRequest { // The name of the repository from which the model was originally // loaded. If empty the repository is not considered. string repository_name 1; // The name of the model to unload. string model_name 2; // Optional parameters. mapstring, ModelRepositoryParameter parameters 3; } message RepositoryModelUnloadResponse { }RepositoryModelUnload支持以下参数unload_dependents布尔参数指示除卸载请求的模型外还要一并卸载随其加载的所有依赖模型。例如请求卸载组成某个 ensemble 的模型会连带卸载该 ensemble。gRPC 端实现src/grpc/grpc_server.cc遍历参数找到名为unload_dependents的参数并校验其必须是bool_param否则返回INVALID_ARG为true时调用TRITONSERVER_ServerUnloadModelAndDependents否则调用TRITONSERVER_ServerUnloadModel。关键实现约束与注意事项repository_name 目前不被支持无论 HTTP 还是 gRPC 协议请求消息中都定义了repository_name字段但当前版本的服务端实现并不支持指定仓库名。从源码看HTTP 端 HandleRepositoryControl 与 gRPC 端 RepositoryModelLoad、RepositoryModelUnload 以及 RepositoryIndex 都会在repository_name非空时返回repository_name specification is not supported的UNSUPPORTED错误。客户端应始终留空该字段让操作作用于全部仓库。动态加载/卸载需要显式模型控制模式Load 与 Unload API 是否真正生效取决于服务端的模型控制模式配置。若以--model-control-modenone默认启动Triton 会在启动时加载全部模型运行期加载/卸载请求会被拒绝。只有在explicit显式模式下客户端才能通过这两个 API 精确控制模型的加载与卸载。仓库内的生命周期测试 qa/L0_lifecycle/lifecycle_test.py 对此有充分覆盖test_dynamic_model_load_unload、test_dynamic_version_load_unload验证显式模式下动态加载/卸载全流程包括加载后模型状态变为 READY、可执行推理卸载后状态变为不可用而test_dynamic_model_load_unload_disabled则验证了动态加载/卸载被禁用时加载请求不会生效、模型状态保持可用的行为。file: 参数是无目录加载的关键路径file:version/file-name参数使得 Triton 可以不依赖磁盘模型仓库目录直接从请求体中恢复模型文件配合config参数即可完整描述一个模型。这在需要将模型二进制与配置一并下发给服务端、实现无状态模型加载的场景中非常实用。注意 HTTP 端要求 base64 编码gRPC 端直接传原始字节内容bytes_param。与 SageMaker 前端的复用模型仓库索引与级联卸载逻辑不仅在标准 HTTP/gRPC 前端被使用SageMaker 兼容前端同样复用了底层能力src/sagemaker_server.cc 调用TRITONSERVER_ServerModelIndex获取模型索引src/sagemaker_server.cc 调用TRITONSERVER_ServerUnloadModelAndDependents实现卸载。这印证了该扩展协议的底层 C API 是跨前端共享的统一控制面。总结Model Repository 扩展为 Triton Inference Server 提供了运行期模型管理的标准协议Index 用于盘点仓库中所有可加载的模型及其状态Load 支持通过config参数覆盖模型配置、通过file:系列参数携带模型文件实现覆盖目录加载Unload 支持unload_dependents布尔参数实现 ensemble 等依赖关系的级联卸载。HTTP 与 gRPC 两套接口语义完全对齐底层统一收敛到TRITONSERVER_ServerModelIndex、TRITONSERVER_ServerLoadModelWithParameters、TRITONSERVER_ServerUnloadModel(AndDependents)三个核心 C API。实际使用时需注意三点repository_name字段必须留空、服务端需以显式模型控制模式运行、file:参数必须与config参数搭配使用。结合 HTTP 实现、gRPC 实现 与 生命周期测试 阅读本文可完整掌握该扩展从协议到实现的全部细节。赞分享模型推理服务AI 应用后端【免费下载链接】serverThe Triton Inference Server provides an optimized cloud and edge inferencing solution.项目地址https://gitcode.com/gh_mirrors/server117/server点击查看免费下载相关推荐Triton Inference Server 的 KServe 协议扩展全景从 HTTP/REST 到 gRPC 的 11 个扩展机制详解Triton Inference Server 的 KServe 协议扩展全景从 HTTP/REST 到 gRPC 的 11 个扩展机制详解 导读 Trito模型推理服务AI 应用后端Triton Inference Server 序列扩展Sequence Extension协议详解有状态模型推理的 sequence_id 与流式推断Triton Inference Server 序列扩展Sequence Extension协议详解有状态模型推理的 sequence_id 与流式推断模型推理服务AI 应用后端Triton Inference Server 统计扩展Statistics Extension协议深度解析HTTP/REST 与 gRPC 接口全解Triton Inference Server 统计扩展Statistics Extension协议深度解析HTTP/REST 与 gRPC 接口全解 T模型推理服务AI 应用后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
