TIS教程02-模型
簡介
在本系列的上一篇文章中,介紹了TIS(triton inference server)的安裝和運行,但是深度學習模型的服務器部署的核心依然是模型,因此本文將關注于TIS部署時模型相關的內容,包括模型倉庫、模型配置和模型管理。
模型倉庫
使用TIS去部署模型的第一步就是創建一個模型倉庫(model repository),這部分參考自官方教程中的Model Repository部分。
模型倉庫用于存放各種不同的模型,每個模型對應一個文件夾,模型倉庫的文件布局如下所示,其中頂層目錄是模型倉庫的根目錄,該目錄下存放著多個以模型名為文件夾名的文件夾,每個文件夾對應一種模型。
<model-repository-path>/<model-name>/[config.pbtxt][<output-labels-file> ...]<version>/<model-definition-file><version>/<model-definition-file>...<model-name>/[config.pbtxt][<output-labels-file> ...]<version>/<model-definition-file><version>/<model-definition-file>......每個模型文件下包含模型的相關信息文件,比如config.pbtxt則是一個模型配置文件(該文件的格式會在下一節的模型配置中詳細講解),此外對于分類模型還可以有inception_labels.txt這樣的標簽文件,此外,還有必不可少的版本文件夾,這類文件夾每個代表一個版本的模型(后端支持的模型文件,如PyTorch模型),比如下圖表示的就是一個分類模型的部署示例,其中1就表示版本1的模型文件。
當然,上面關于模型版本,其實可以簡單地理解為一個版本放一個模型文件即可,例如上述的TensorFlow模型以如下格式存放。
<model-repository-path>/<model-name>/config.pbtxt1/model.graphdef再比如,TorchScript模型和ONNX模型可以如下格式存放。
<model-repository-path>/<model-name>/config.pbtxt1/model.pt <model-repository-path>/<model-name>/config.pbtxt1/model.onnx/model.onnx<other model files>最后要補充的是,模型倉庫通過tritonserver --model-repository=/models選項指定即可。
模型配置
接下來,我們來看看上面沒有西江的模型配置,這部分可以參考官方文檔中的Model Configuration。需要注意的是,每個模型文件夾必須存在一個模型配置文件,該文件提供一些模型的必選和可選信息,最典型的是手寫一個config.pbtxt文件,我們下面主要講解這個。
該文件至少應當包含運行平臺或后端框架、最大批尺寸、輸入輸出張量的信息。下面以一個TensoRT模型為例,該模型有兩個輸入一個輸出,那么其最簡配置如下。
platform: "tensorrt_plan"max_batch_size: 8input [{name: "input0"data_type: TYPE_FP32dims: [ 16 ]},{name: "input1"data_type: TYPE_FP32dims: [ 16 ]}]output [{name: "output0"data_type: TYPE_FP32dims: [ 16 ]}]下面,我們來一個個看這些必須的配置項。
Name, Platform and Backend
配置文件中,模型名不是必須的,如果不指定,則會按照模型倉庫中該模型所在文件夾的名字作為模型名,如果指定,則必須和該模型所在文件夾名稱一致。關于運行平臺,TIS支持如下情況:
- 對TensorRT, ‘backend’必須設置為tensorrt或者’platform’ 必須設置為tensorrt_plan;
- 對PyTorch, 'backend’必須設置為pytorch或者’platform’必須設置為pytorch_libtorch;
- 對ONNX,'backend’必須設置為onnxruntime或者’platform’必須設置為onnxruntime_onnx;
- 對TensorFlow,'platform’必須設置為tensorflow_graphdef或 tensorflow_savedmodel,‘backend’ 可選擇設置為tensorflow;
- 對其他的模型后端, 'backend’必須設置為后端名且’platform’可選是否設置。
Maximum Batch Size
max_batch_size這一項表示支持批處理的模型最大的批處理尺寸,如果模型的batch維度是第一維,且輸入輸出都有這個維度,那么Triton就可以自動批量運算,這時候最大批處理尺寸設置就是有效的,應當設置大于等于1.如果不需要批處理或者不支持批處理,設置為0即可。
Inputs and Outputs
我們拿到一個項目的模型去部署,其實整體上這個模型是“黑盒”的,我們能看到就是輸入和輸出,因此輸入輸出的配置非常非常關鍵。input和output以列表的形式設置,列表中每一項是一個字典,字典必須包含名稱、數據類型和張量尺寸的設置。
名稱指的是該輸入的變量名,這里務必和模型定義的張量名一致。數據類型指的是該張量的數據類型,這里可以參考類型表。
而shape則用來表示發起請求的輸入張量的尺寸或者服務器反饋的輸出張量的尺寸,這個shape必須不為空(即[]),不過我們自己設置的時候不需要顯式設置完整的shape,只需要設置模型除了batch的維度dims即可。Triton會自動組合為完整的shape,比如當max_batch_size大于0的時候,設置dims為[16]則會變為[-1,16],而當max_batch_size等于0的時候,shape就是dims。此外,對那些可變的維度,設置為-1即可,例如[4 -1]。
此外,官方還有自動生成配置文件、reshape配置、實例組等,這里就先不多贅述,后面用到會提到。
模型管理
所謂模型管理指的就是,當Triton運行時,模型倉庫有了改變,會如何處理這種改變,共有三種模式,分別為NONE、EXPLICIT和POLL,這部分詳細參考官方文檔中的Model Management,我這里篇幅所限,就簡單介紹這三種模式,其中默認為NONE模式。
NONE模式
啟動時,首先,Triton嘗試在啟動時加載模型存儲庫中的所有模型。Triton無法加載的模型將被標記為UNAVAILABLE并且不可用于推理。
啟動后,服務器運行時對模型存儲庫的更改將被忽略。使用模型控制協議的模型加載和卸載請求將沒有影響,并將返回錯誤響應。
這種模型控制模式通過在啟動 Triton 時指定--model-control-mode=none來選擇,這是默認的模型控制模式。參考修改模型倉庫的內容,在Triton運行時必須小心更改模型存儲庫。
EXPLICIT模式
啟動時,Triton 僅加載使用--load-model命令行選項明確指定的那些模型。如果未指定--load-model則啟動時不會加載任何模型。 Triton 無法加載的模型將被標記為 UNAVAILABLE 并且不可用于推理。
啟動后,必須使用模型控制協議顯式啟動所有模型加載和卸載操作。模型控制請求的響應狀態指示加載或卸載動作的成功或失敗。嘗試重新加載已加載的模型時,如果由于任何原因重新加載失敗,則已加載的模型將保持加載狀態。如果重新加載成功,新加載的模型將替換已加載的模型,而不會損失模型的可用性。
通過指定--model-control-mode=explicit啟用此模型控制模式。參考修改模型倉庫的內容,在Triton運行時必須小心更改模型存儲庫。
POLL 模式
啟動時,Triton 嘗試在啟動時加載模型存儲庫中的所有模型。 Triton 無法加載的模型將被標記為 UNAVAILABLE 并且不可用于推理。
啟動后,Triton將檢測對模型存儲庫的更改,Triton 將根據這些更改嘗試加載和卸載模型。 嘗試重新加載已加載的模型時,如果由于任何原因重新加載失敗,則已加載的模型將保持加載狀態。 如果重新加載成功,新加載的模型將替換已加載的模型,而不會損失模型的可用性。
由于 Triton 會定期輪詢存儲庫,因此可能無法立即檢測到對模型存儲庫的更改。 您可以使用--repository-poll-secs選項控制輪詢間隔。 控制臺日志或模型就緒協議或模型控制協議的索引操作可用于確定模型存儲庫更改何時生效。
需要注意的是,Triton 輪詢模型存儲庫和您對存儲庫進行任何更改之間沒有同步。 因此,Triton 可以觀察到導致意外行為的部分和不完整的變化。 因此,不建議在生產環境中使用 POLL 模式。
使用模型控制協議的模型加載和卸載請求將沒有影響,并將返回錯誤響應。 通過指定--model-control-mode=poll 并在啟動 Triton 時將--repository-poll-secs設置為非零值來啟用此模型控制模式。 參考修改模型倉庫的內容,在Triton運行時必須小心更改模型存儲庫。
在 POLL 模式下,Triton 響應以下模型存儲庫更改:
-
通過添加和刪除相應的版本子目錄,可以在模型中添加和刪除版本。即使使用已刪除的模型版本,Triton 也將允許完成inflight的請求。對已刪除模型版本的新請求將失敗。根據模型的版本政策,對可用版本的更改可能會更改默認提供的模型版本。
-
通過刪除相應的模型目錄,可以從存儲庫中刪除現有模型。 Triton 將允許完成對已刪除模型的任何版本的inflight請求。刪除模型的新請求將失敗。
-
可以通過添加新模型目錄將新模型添加到存儲庫中。
-
可以更改模型配置文件 (config.pbtxt),Triton 將卸載并重新加載模型以獲取新的模型配置。
-
可以添加、刪除或修改為代表分類的輸出提供標簽的標簽文件,Triton 將卸載并重新加載模型以獲取新標簽。如果添加或刪除了標簽文件,則必須同時執行對其在模型配置中對應的輸出的label_filename屬性的相應編輯。
模型倉庫修改
上文反復提到的修改模型倉庫具體指的內容如下。
模型存儲庫中的每個模型都駐留在其自己的子目錄中。模型子目錄內容允許的活動因 Triton 使用該模型的方式而異。模型的狀態可以通過使用模型元數據或存儲庫索引 API 來確定。
- 如果模型正在加載或卸載,則不必添加、刪除或修改該子目錄中的任何文件或目錄。
- 如果模型從未加載或已完全卸載,則可以刪除整個模型子目錄,或者可以添加、刪除或修改其任何內容。
- 如果模型已完全加載,則可以添加、刪除或修改該子目錄中的任何文件或目錄;除了實現模型后端的共享庫。 Triton 在加載模型時使用后端共享庫,因此刪除或修改它們可能會導致 Triton 崩潰。要更新模型的后端,您必須首先完全卸載模型,修改后端共享庫,然后重新加載模型。在某些操作系統上,還可以簡單地將現有共享庫移動到模型存儲庫之外的另一個位置,復制到新的共享庫中,然后重新加載模型。
總結
本文主要介紹了Triton Inference Server的模型配置教程,具體可以查看官方文檔。
總結
以上是生活随笔為你收集整理的TIS教程02-模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TIS教程01-安装
- 下一篇: 0007-Reverse Integer