展協(xié)議詳解:Index / Load / Unload 全流程實(shí)戰(zhàn))
模型推理服務(wù)AI 應(yīng)用后端【免費(fèi)下載鏈接】serverThe Triton Inference Server provides an optimized cloud and edge inferencing solution.項(xiàng)目地址https://gitcode.com/gh_mirrors/server117/server點(diǎn)擊查看免費(fèi)下載模型倉庫Model Repository擴(kuò)展是 Triton Inference Server 對(duì)外提供的核心管理協(xié)議之一它允許客戶端通過 HTTP/REST 或 gRPC 查詢服務(wù)器當(dāng)前托管的全部模型并在運(yùn)行期動(dòng)態(tài)加載、重載或卸載模型而無需重啟服務(wù)進(jìn)程。本文以倉庫內(nèi) docs/protocol/extension_model_repository.md 為骨架結(jié)合 HTTP 服務(wù)端實(shí)現(xiàn)、gRPC 服務(wù)端實(shí)現(xiàn) 與 生命周期測(cè)試完整講解該擴(kuò)展的協(xié)議格式、參數(shù)語義、底層調(diào)用鏈與工程約束讀者讀完即可直接編寫客戶端代碼調(diào)用這三組 API并理解其內(nèi)部實(shí)現(xiàn)原理。擴(kuò)展能力概述動(dòng)態(tài)管理模型的生命周期模型倉庫擴(kuò)展讓客戶端能夠查詢并控制 Triton 正在服務(wù)的一個(gè)或多個(gè)模型倉庫。只要服務(wù)端啟用了該擴(kuò)展Server Metadata 的extensions字段中就會(huì)報(bào)告model_repository字符串。此外該擴(kuò)展還包含一個(gè)可選組件允許 Unload API 攜帶unload_dependents參數(shù)。支持該可選組件的 Triton 版本還會(huì)在extensions字段中額外報(bào)告model_repository(unload_dependents)客戶端可以據(jù)此判斷服務(wù)端是否支持級(jí)聯(lián)卸載依賴模型的能力。從源碼角度看該擴(kuò)展在 HTTP 端與 gRPC 端分別注冊(cè)了兩套入口HTTP 端路由正則定義在 src/http_server.cc匹配形如/v2/repository/...的 URLgRPC 端三個(gè) RPCRepositoryIndex、RepositoryModelLoad、RepositoryModelUnload在 src/grpc/grpc_server.cc 中注冊(cè)均綁定MODEL_REPOSITORY受限類別restricted category可通過服務(wù)端受限 API 配置進(jìn)行開關(guān)控制。HTTP/REST 協(xié)議HTTP 版本要求實(shí)現(xiàn) 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 基礎(chǔ)類型#optional表示該字段可選。Index查詢倉庫中所有可用模型Index API 返回模型倉庫中每個(gè)模型的信息——即使該模型當(dāng)前尚未被加載進(jìn) Triton。它提供了一種途徑讓客戶端可以判斷哪些模型可以被 Load API 加載。請(qǐng)求通過 HTTP POST 發(fā)送到 index 端點(diǎn)響應(yīng)體為 JSON。請(qǐng)求對(duì)象$repository_index_request必須出現(xiàn)在 POST 請(qǐng)求的 HTTP body 中$repository_index_request { ready : $boolean #optional, }ready可選默認(rèn)值為false。若為true則只返回當(dāng)前已就緒可以執(zhí)行推理的模型。成功的 Index 請(qǐng)求以 HTTP 200 狀態(tài)碼表示響應(yīng)對(duì)象$repository_index_response為 JSON 數(shù)組數(shù)組中每個(gè)元素描述一個(gè)模型$repository_index_response [ { name : $string, version : $string #optional, state : $string, reason : $string }, … ]name模型名稱version模型版本state模型當(dāng)前狀態(tài)典型的取值包括READY、UNAVAILABLE、LOADING、UNLOADINGreason模型處于當(dāng)前狀態(tài)的原因如有。失敗的 Index 請(qǐng)求以 HTTP 錯(cuò)誤狀態(tài)碼通常為 400表示HTTP body 必須包含$repository_index_error_response對(duì)象$repository_index_error_response { error: $string }error錯(cuò)誤的描述性信息。在服務(wù)端實(shí)現(xiàn)中HTTPAPIServer::HandleRepositoryIndex 會(huì)先校驗(yàn)請(qǐng)求必須是 POST 方法然后解析 body 中的ready布爾字段類型不合法會(huì)返回INVALID_ARG錯(cuò)誤將其映射為TRITONSERVER_INDEX_FLAG_READY標(biāo)志位最終調(diào)用底層 C APITRITONSERVER_ServerModelIndex獲取模型索引消息并序列化為 JSON 返回。Load加載或重載模型Load API 請(qǐng)求 Triton 加載某個(gè)模型若該模型已加載則觸發(fā)重載。請(qǐng)求通過 HTTP POST 發(fā)送到 load 端點(diǎn)HTTP body 可以為空也可以包含加載請(qǐng)求對(duì)象$repository_load_request。成功的加載請(qǐng)求以 HTTP 200 狀態(tài)碼表示。$repository_load_request { parameters : $parameters #optional }parameters包含零個(gè)或多個(gè)鍵值對(duì)形式的請(qǐng)求參數(shù)。Load API 支持以下參數(shù)config字符串參數(shù)內(nèi)容是模型配置的 JSON 表示必須能夠被解析為model_config.proto中定義的ModelConfig消息。該配置將替代模型目錄中的config.pbtxt用于加載模型。一旦提供了config就相當(dāng)于模型元數(shù)據(jù)被更新會(huì)觸發(fā)一次與元數(shù)據(jù)更新等價(jià)的重載行為。file:version/file-namebase64 編碼的序列化模型文件用于指定覆蓋override模型目錄讓 Triton 從請(qǐng)求中攜帶的文件而非磁盤目錄加載模型。例如用戶希望加載一個(gè)版本號(hào)為 2 的 ONNX 模型就把參數(shù)名寫為file:2/model.onnx值為該文件的 base64 編碼內(nèi)容。注意使用file:參數(shù)時(shí)必須同時(shí)提供config參數(shù)作為覆蓋模型目錄的模型配置。失敗的 Load 請(qǐng)求以 HTTP 錯(cuò)誤狀態(tài)碼通常為 400表示HTTP body 必須包含$repository_load_error_response$repository_load_error_response { error: $string }error錯(cuò)誤的描述性信息。Load 完整請(qǐng)求示例以下請(qǐng)求將加載模型mymodel并同時(shí)提供模型配置與模型文件內(nèi)容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 對(duì)action load的分支會(huì)遍歷parameters對(duì)象中的每個(gè)成員config被構(gòu)造為字符串類型參數(shù)鍵名以file:前綴開頭的成員見 src/http_server.cc則先經(jīng)過DecodeBase64解碼為二進(jìn)制內(nèi)容再構(gòu)造為字節(jié)類型參數(shù)。解碼后的文件內(nèi)容會(huì)被保存在一個(gè)列表中其生命周期覆蓋TRITONSERVER_ServerLoadModelWithParameters調(diào)用全程確保參數(shù)在底層加載完成前始終有效。最終統(tǒng)一調(diào)用TRITONSERVER_ServerLoadModelWithParameters完成帶參數(shù)的模型加載。Unload卸載模型Unload API 請(qǐng)求 Triton 卸載某個(gè)模型。請(qǐng)求通過 HTTP POST 發(fā)送到 unload 端點(diǎn)HTTP body 可以為空也可以包含卸載請(qǐng)求對(duì)象$repository_unload_request。成功的卸載請(qǐng)求以 HTTP 200 狀態(tài)碼表示。$repository_unload_request { parameters : $parameters #optional }parameters包含零個(gè)或多個(gè)鍵值對(duì)形式的請(qǐng)求參數(shù)。Unload API 支持以下參數(shù)unload_dependents布爾參數(shù)指示除了卸載請(qǐng)求的模型外還要一并卸載隨該模型一起加載的所有依賴模型。例如請(qǐng)求卸載構(gòu)成某個(gè) ensemble模型集成的組成模型時(shí)會(huì)連帶卸載該 ensemble 本身。失敗的 Unload 請(qǐng)求以 HTTP 錯(cuò)誤狀態(tài)碼通常為 400表示HTTP body 必須包含$repository_unload_error_response$repository_unload_error_response { error: $string }error錯(cuò)誤的描述性信息。在 HandleRepositoryControl 的action unload分支中服務(wù)端會(huì)解析 body 中的unload_dependents布爾字段解析失敗會(huì)返回包含Unable to parse unload_dependents的錯(cuò)誤信息為true時(shí)調(diào)用TRITONSERVER_ServerUnloadModelAndDependents級(jí)聯(lián)卸載否則調(diào)用TRITONSERVER_ServerUnloadModel只卸載指定模型。gRPC 協(xié)議gRPC 版本同樣要求實(shí)現(xiàn)三組 API定義在GRPCInferenceService服務(wù)中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 的參數(shù)通過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; } }錯(cuò)誤通過請(qǐng)求返回的google.rpc.Status指示OK表示成功其他狀態(tài)碼表示失敗。gRPC 端三個(gè) RPC 的注冊(cè)與執(zhí)行邏輯位于 src/grpc/grpc_server.cc其中 RepositoryIndex 是同步執(zhí)行asyncfalseLoad 與 Unload 則標(biāo)記為異步執(zhí)行。RepositoryIndexRepositoryIndexAPI 返回模型倉庫中每個(gè)模型的信息——即使模型尚未被加載進(jìn) Triton。請(qǐng)求與響應(yīng)消息定義如下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; }實(shí)現(xiàn)上src/grpc/grpc_server.cc服務(wù)端先檢查repository_name是否為空非空則返回UNSUPPORTED錯(cuò)誤原因見下文關(guān)鍵實(shí)現(xiàn)約束然后將ready標(biāo)志映射為TRITONSERVER_INDEX_FLAG_READY調(diào)用TRITONSERVER_ServerModelIndex得到 JSON 索引消息逐條解析name、version、state、reason字段填充到響應(yīng)中的models數(shù)組。RepositoryModelLoadRepositoryModelLoadAPI 請(qǐng)求加載或重載模型。請(qǐng)求與響應(yīng)消息定義如下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支持以下參數(shù)config字符串參數(shù)內(nèi)容是模型配置的 JSON 表示必須能解析為ModelConfig消息用于替代模型目錄中的配置提供后相當(dāng)于模型元數(shù)據(jù)更新觸發(fā)等價(jià)的重載行為。file:version/file-name字節(jié)參數(shù)包含模型文件內(nèi)容用于指定覆蓋模型目錄。例如加載一個(gè)版本為 2 的 ONNX 模型參數(shù)名為file:2/model.onnx值為文件內(nèi)容。注意同樣必須同時(shí)提供config參數(shù)。gRPC 端對(duì)參數(shù)做了嚴(yán)格的類型校驗(yàn)src/grpc/grpc_server.ccconfig必須是string_paramfile:前綴的參數(shù)必須是bytes_param否則返回INVALID_ARG錯(cuò)誤遇到無法識(shí)別的參數(shù)名同樣返回錯(cuò)誤。校驗(yàn)通過后統(tǒng)一調(diào)用TRITONSERVER_ServerLoadModelWithParameters執(zhí)行加載。RepositoryModelUnloadRepositoryModelUnloadAPI 請(qǐng)求卸載模型。請(qǐng)求與響應(yīng)消息定義如下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支持以下參數(shù)unload_dependents布爾參數(shù)指示除卸載請(qǐng)求的模型外還要一并卸載隨其加載的所有依賴模型。例如請(qǐng)求卸載組成某個(gè) ensemble 的模型會(huì)連帶卸載該 ensemble。gRPC 端實(shí)現(xiàn)src/grpc/grpc_server.cc遍歷參數(shù)找到名為unload_dependents的參數(shù)并校驗(yàn)其必須是bool_param否則返回INVALID_ARG為true時(shí)調(diào)用TRITONSERVER_ServerUnloadModelAndDependents否則調(diào)用TRITONSERVER_ServerUnloadModel。關(guān)鍵實(shí)現(xiàn)約束與注意事項(xiàng)repository_name 目前不被支持無論 HTTP 還是 gRPC 協(xié)議請(qǐng)求消息中都定義了repository_name字段但當(dāng)前版本的服務(wù)端實(shí)現(xiàn)并不支持指定倉庫名。從源碼看HTTP 端 HandleRepositoryControl 與 gRPC 端 RepositoryModelLoad、RepositoryModelUnload 以及 RepositoryIndex 都會(huì)在repository_name非空時(shí)返回repository_name specification is not supported的UNSUPPORTED錯(cuò)誤。客戶端應(yīng)始終留空該字段讓操作作用于全部倉庫。動(dòng)態(tài)加載/卸載需要顯式模型控制模式Load 與 Unload API 是否真正生效取決于服務(wù)端的模型控制模式配置。若以--model-control-modenone默認(rèn)啟動(dòng)Triton 會(huì)在啟動(dòng)時(shí)加載全部模型運(yùn)行期加載/卸載請(qǐng)求會(huì)被拒絕。只有在explicit顯式模式下客戶端才能通過這兩個(gè) API 精確控制模型的加載與卸載。倉庫內(nèi)的生命周期測(cè)試 qa/L0_lifecycle/lifecycle_test.py 對(duì)此有充分覆蓋test_dynamic_model_load_unload、test_dynamic_version_load_unload驗(yàn)證顯式模式下動(dòng)態(tài)加載/卸載全流程包括加載后模型狀態(tài)變?yōu)?READY、可執(zhí)行推理卸載后狀態(tài)變?yōu)椴豢捎枚鴗est_dynamic_model_load_unload_disabled則驗(yàn)證了動(dòng)態(tài)加載/卸載被禁用時(shí)加載請(qǐng)求不會(huì)生效、模型狀態(tài)保持可用的行為。file: 參數(shù)是無目錄加載的關(guān)鍵路徑file:version/file-name參數(shù)使得 Triton 可以不依賴磁盤模型倉庫目錄直接從請(qǐng)求體中恢復(fù)模型文件配合config參數(shù)即可完整描述一個(gè)模型。這在需要將模型二進(jìn)制與配置一并下發(fā)給服務(wù)端、實(shí)現(xiàn)無狀態(tài)模型加載的場(chǎng)景中非常實(shí)用。注意 HTTP 端要求 base64 編碼gRPC 端直接傳原始字節(jié)內(nèi)容bytes_param。與 SageMaker 前端的復(fù)用模型倉庫索引與級(jí)聯(lián)卸載邏輯不僅在標(biāo)準(zhǔn) HTTP/gRPC 前端被使用SageMaker 兼容前端同樣復(fù)用了底層能力src/sagemaker_server.cc 調(diào)用TRITONSERVER_ServerModelIndex獲取模型索引src/sagemaker_server.cc 調(diào)用TRITONSERVER_ServerUnloadModelAndDependents實(shí)現(xiàn)卸載。這印證了該擴(kuò)展協(xié)議的底層 C API 是跨前端共享的統(tǒng)一控制面??偨Y(jié)Model Repository 擴(kuò)展為 Triton Inference Server 提供了運(yùn)行期模型管理的標(biāo)準(zhǔn)協(xié)議Index 用于盤點(diǎn)倉庫中所有可加載的模型及其狀態(tài)Load 支持通過config參數(shù)覆蓋模型配置、通過file:系列參數(shù)攜帶模型文件實(shí)現(xiàn)覆蓋目錄加載Unload 支持unload_dependents布爾參數(shù)實(shí)現(xiàn) ensemble 等依賴關(guān)系的級(jí)聯(lián)卸載。HTTP 與 gRPC 兩套接口語義完全對(duì)齊底層統(tǒng)一收斂到TRITONSERVER_ServerModelIndex、TRITONSERVER_ServerLoadModelWithParameters、TRITONSERVER_ServerUnloadModel(AndDependents)三個(gè)核心 C API。實(shí)際使用時(shí)需注意三點(diǎn)repository_name字段必須留空、服務(wù)端需以顯式模型控制模式運(yùn)行、file:參數(shù)必須與config參數(shù)搭配使用。結(jié)合 HTTP 實(shí)現(xiàn)、gRPC 實(shí)現(xiàn) 與 生命周期測(cè)試 閱讀本文可完整掌握該擴(kuò)展從協(xié)議到實(shí)現(xiàn)的全部細(xì)節(jié)。贊分享模型推理服務(wù)AI 應(yīng)用后端【免費(fèi)下載鏈接】serverThe Triton Inference Server provides an optimized cloud and edge inferencing solution.項(xiàng)目地址https://gitcode.com/gh_mirrors/server117/server點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Triton Inference Server 的 KServe 協(xié)議擴(kuò)展全景從 HTTP/REST 到 gRPC 的 11 個(gè)擴(kuò)展機(jī)制詳解Triton Inference Server 的 KServe 協(xié)議擴(kuò)展全景從 HTTP/REST 到 gRPC 的 11 個(gè)擴(kuò)展機(jī)制詳解 導(dǎo)讀 Trito模型推理服務(wù)AI 應(yīng)用后端Triton Inference Server 序列擴(kuò)展Sequence Extension協(xié)議詳解有狀態(tài)模型推理的 sequence_id 與流式推斷Triton Inference Server 序列擴(kuò)展Sequence Extension協(xié)議詳解有狀態(tài)模型推理的 sequence_id 與流式推斷模型推理服務(wù)AI 應(yīng)用后端Triton Inference Server 統(tǒng)計(jì)擴(kuò)展Statistics Extension協(xié)議深度解析HTTP/REST 與 gRPC 接口全解Triton Inference Server 統(tǒng)計(jì)擴(kuò)展Statistics Extension協(xié)議深度解析HTTP/REST 與 gRPC 接口全解 T模型推理服務(wù)AI 應(yīng)用后端創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考