模型部署是 機器學習 生命周期的一個關鍵階段,在此階段,經過培訓的模型將集成到現有的應用程序生態系統中。這往往是最繁瑣的步驟之一,在這些步驟中,目標硬件平臺應滿足各種應用程序和生態系統約束,所有這些都不會影響模型的準確性。
NVIDIA Triton 推理服務器 是一個開源的模型服務工具,它簡化了推理,并具有多個功能以最大限度地提高硬件利用率和推理性能。這包括以下功能:
并發模型執行 ,使同一模型的多個實例能夠在同一系統上并行執行。
Dynamic batching ,其中客戶端請求在服務器上分組,以形成更大的批。
優化模型部署時,需要做出幾個關鍵決策:
為了最大限度地提高利用率, NVIDIA Triton 應在同一 CPU / GPU 上同時運行多少個模型實例?
應將多少傳入的客戶端請求動態批處理在一起?
模型應采用哪種格式?
應以何種精度計算輸出?
這些關鍵決策導致了組合爆炸,每種型號和硬件選擇都有數百種可能的配置。通常,這會導致浪費開發時間或代價高昂的低于標準的服務決策。
在本文中,我們將探討 NVIDIA Triton 型號分析儀 可以自動瀏覽目標硬件平臺的各種服務配置,并根據應用程序的需要找到最佳型號配置。這可以提高開發人員的生產率,同時提高服務硬件的利用率。
NVIDIA Triton 型號分析儀
NVIDIA Triton Model Analyzer 是一個多功能 CLI 工具,有助于更好地了解通過 NVIDIA Triton 推理服務器提供服務的模型的計算和內存需求。這使您能夠描述不同配置之間的權衡,并為您的用例選擇最佳配置。
NVIDIA Triton 模型分析器可用于 NVIDIA Triton 推理服務器支持的所有模型格式: TensorRT 、 TensorFlow 、 PyTorch 、 ONNX 、 OpenVINO 和其他。
您可以指定應用程序約束(延遲、吞吐量或內存),以找到滿足這些約束的服務配置。例如,虛擬助理應用程序可能有一定的延遲預算,以便最終用戶能夠實時感受到交互。脫機處理工作流應針對吞吐量進行優化,以減少所需硬件的數量,并盡可能降低成本。模型服務硬件中的可用內存可能受到限制,并且需要針對內存優化服務配置。
圖 1 :NVIDIA Triton 型號分析器概述。
我們以一個預訓練模型為例,展示了如何使用 NVIDIA Triton 模型分析器,并在 Google 云平臺上的 VM 實例上優化該模型的服務。然而,這里顯示的步驟可以在任何公共云上使用,也可以在具有 NVIDIA Triton 推理服務器支持的任何模型類型的前提下使用。
創建模型
在這篇文章中,我們使用預訓練 BERT Hugging Face 的大型模型,采用 PyTorch 格式。 NVIDIA Triton 推理服務器可以使用其LibTorch后端為TorchScript模型提供服務,也可以使用其 Python 后端為純 PyTorch 模型提供服務。為了獲得最佳性能,我們建議將 PyTorch 模型轉換為TorchScript格式。為此,請使用PyTorch的跟蹤功能。
首先從 NGC 中拉出 PyTorch 容器,然后在容器中安裝transformers包。如果這是您第一次使用 NGC ,請創建一個帳戶。在本文中,我們使用了 22.04 版本的相關工具,這是撰寫本文時的最新版本。 NVIDIA ( NVIDIA ) Triton 每月發布一次 cadence ,并在每個月底發布新版本。
docker pull nvcr.io/nvidia/pytorch:22.04-py3 docker run --rm -it -v $(pwd):/workspace nvcr.io/nvidia/pytorch:22.04-py3 /bin/bash pip install transformers
安裝transformers
包后,運行以下 Python 代碼下載預訓練的 BERT 大型模型,并將其跟蹤為 TorchScript 格式。
from transformers import BertModel, BertTokenizer import torch model_name = "bert-large-uncased" tokenizer = BertTokenizer.from_pretrained(model_name) model = BertModel.from_pretrained(model_name, torchscript=True) max_seq_len = 512 sample = "This is a sample input text" tokenized = tokenizer(sample, return_tensors="pt", max_length=max_seq_len, padding="max_length", truncation=True) inputs = (tokenized.data['input_ids'], tokenized.data['attention_mask'], tokenized.data['token_type_ids']) traced_model = torch.jit.trace(model, inputs) traced_model.save("model.pt")
構建模型存儲庫
使用 NVIDIA Triton 推理服務器為您的模型提供服務的第一步是創建模型存儲庫。在此存儲庫中,您將包括一個模型配置文件,該文件提供有關模型的信息。模型配置文件至少必須指定后端、模型的最大批大小以及輸入/輸出結構。
對于這個模型,下面的代碼示例是模型配置文件。
platform: "pytorch_libtorch" max_batch_size: 64 input [ { name: "INPUT__0" data_type: TYPE_INT64 dims: [ 512 ] }, { name: "INPUT__1" data_type: TYPE_INT64 dims: [ 512 ] }, { name: "INPUT__2" data_type: TYPE_INT64 dims: [ 512 ] } ] output [ { name: "OUTPUT__0" data_type: TYPE_FP32 dims: [ -1, 1024 ] }, { name: "OUTPUT__1" data_type: TYPE_FP32 dims: [ 1024 ] } ]
將模型配置文件命名為config.pbtxt后,按照 存儲庫布局結構 創建模型存儲庫。模型存儲庫的文件夾結構應類似于以下內容:
. └── bert-large ├── 1 │ └── model.pt └── config.pbtxt
運行 NVIDIA Triton 型號分析器
建議使用 Model Analyzer 的方法是自己構建 Docker 映像:
git clone https://github.com/triton-inference-server/model_analyzer.git cd ./model_analyzer git checkout r22.04 docker build --pull -t model-analyzer .
現在已經構建了 Model Analyzer 映像,請旋轉容器:
docker run -it --rm --gpus all \ -v /var/run/docker.sock:/var/run/docker.sock \ -v:/models \ -v :/output \ -v :/config \ --net=host model-analyzer
不同的硬件配置可能會導致不同的最佳服務配置。因此,在最終提供模型的目標硬件平臺上運行模型分析器非常重要。
為了重現我們在這篇文章中給出的結果,我們在公共云中進行了實驗。具體來說,我們在 Google 云平臺上使用了一個 a2-highgpu-1g 實例,并使用了一個 NVIDIA A100 GPU 。
A100 GPU 支持多實例 GPU ( MIG ),它可以通過將單個 A100 GPU 拆分為七個分區來最大限度地提高 GPU 利用率,這些分區具有硬件級隔離,可以獨立運行 NVIDIA Triton 服務器。為了簡單起見,我們在這篇文章中沒有使用 MIG 。
Model Analyzer 支持 NVIDIA Triton 型號的自動和手動掃描不同配置。自動配置搜索是默認行為,并為所有配置啟用 dynamic batching 。在這種模式下,模型分析器將掃描不同的批大小和可以同時處理傳入請求的模型實例數。
掃掠的默認范圍是最多五個模型實例和最多 128 個批次大小。這些 可以更改默認值 。
現在創建一個名為sweep.yaml的配置文件,以分析前面準備的 BERT 大型模型,并自動掃描可能的配置。
model_repository: /models checkpoint_directory: /output/checkpoints/ output-model-repository-path: /output/bert-large profile_models: bert-large perf_analyzer_flags: input-data: "zero"
使用前面的配置,您可以分別獲得模型吞吐量和延遲的頂行號和底行號。
分析時,模型分析器還將收集的測量值寫入檢查點文件。它們位于指定的檢查點目錄中。您可以使用分析的檢查點創建數據表、摘要和結果的詳細報告。
配置文件就緒后,您現在可以運行 Model Analyzer 了:
model-analyzer profile -f /config/sweep.yaml
作為示例,表 1 顯示了結果中的幾行。每一行對應于在假設的客戶端負載下在模型配置上運行的實驗。
要獲得測試的每個模型配置的更詳細報告,請使用model-analyzer report
命令:
model-analyzer report --report-model-configs bert-large_config_default,bert-large_config_1,bert-large_config_2 --export-path /output --config-file /config/sweep.yaml --checkpoint-directory /output/checkpoints/
這將生成一個詳細說明以下內容的報告:
運行分析的硬件
吞吐量與延遲的關系圖
GPU 內存與延遲的關系圖
CLI 中所選配置的報告
對于任何 MLOps 團隊來說,在將模型投入生產之前開始分析都是一個很好的開始。
不同的利益相關者,不同的約束條件
在典型的生產環境中,有多個團隊應該協同工作,以便在生產中大規模部署 AI 模型。例如,可能有一個 MLOps 團隊負責為管道穩定性服務的模型,并處理應用程序強加的服務級別協議( SLA )中的更改。另外,基礎架構團隊通常負責整個 GPU / CPU 場。
假設一個產品團隊要求 MLOps 團隊在 30 毫秒的延遲預算內處理 99% 的請求,為 BERT 大型服務器提供服務。 MLOps 團隊應考慮可用硬件上的各種服務配置,以滿足該要求。使用 Model Analyzer 可以消除執行此操作時的大部分摩擦。
下面的代碼示例是一個名為latency_constraint.yaml的配置文件的示例,其中我們在測得的延遲值的 99% 上添加了一個約束,以滿足給定的 SLA 。
model_repository: /models checkpoint_directory: /output/checkpoints/ analysis_models: bert-large: constraints: perf_latency_p99: max: 30 perf_analyzer_flags: input-data: "zero"
因為您有上一次掃描中的檢查點,所以可以將它們重新用于 SLA 分析。運行以下命令可以提供滿足延遲約束的前三種配置:
model-analyzer analyze -f latency_constraint.yaml
表 2 顯示了前三種配置的測量結果,以及它們與默認配置的比較情況。
在大規模生產中,軟件和硬件約束會影響生產中的 SLA 。
假設應用程序的約束已更改。該團隊現在希望滿足同一型號的 p99 延遲為 50 ms ,吞吐量為每秒 30 多個推斷。還假設基礎設施團隊能夠為其使用留出 5000 MB 的 GPU 內存。隨著約束數量的增加,手動查找服務配置以滿足涉眾變得越來越困難。這就是對模型分析器這樣的解決方案的需求變得更加明顯的地方,因為您現在可以在單個配置文件中同時指定所有約束。
以下名為multiple_constraint.yaml
的示例配置文件結合了吞吐量、延遲和 GPU 內存約束:
model_repository: /models checkpoint_directory: /output/checkpoints/ analysis_models: bert-large-pytorch: constraints: perf_throughput: min: 50 perf_latency_p99: max: 30 gpu_used_memory: max: 5000 perf_analyzer_flags: input-data: "zero"
使用此更新的約束,運行以下命令:
model-analyzer analyze -f multiple_constraint.yaml
Model Analyzer 現在將以下提供的服務配置作為前三個選項,并顯示它們與默認配置的比較情況。
總結
隨著企業發現自己在生產中提供越來越多的模型,手動或基于啟發式做出模型服務決策變得越來越困難。手動執行此操作會導致浪費開發時間或模型服務決策不足,這需要自動化工具。
在本文中,我們探討了 NVIDIA Triton 模型分析器如何能夠找到滿足應用程序 SLA 和各種涉眾需求的模型服務配置。我們展示了如何使用模型分析器掃描各種配置,以及如何使用它來滿足指定的服務約束。
盡管我們在這篇文章中只關注一個模型,但仍有計劃讓模型分析器同時對多個模型執行相同的分析。例如,您可以在相同的 GPU 上運行的不同模型上定義約束,并對每個約束進行優化。
我們希望您能分享我們對 Model Analyzer 將節省多少開發時間的興奮,并使您的 MLOps 團隊能夠做出明智的決策。
關于作者
Arun Raman 是 NVIDIA 的高級解決方案架構師,專門從事消費互聯網行業的 edge 、 cloud 和 on-prem 人工智能應用。在目前的職位上,他致力于端到端 AI 管道,包括預處理、培訓和推理。除了從事人工智能工作外,他還研究了一系列產品,包括網絡路由器和交換機、多云基礎設施和服務。他擁有達拉斯德克薩斯大學電氣工程碩士學位。
Burak Yoldeir 是 NVIDIA 的高級數據科學家,專門為消費互聯網行業生產人工智能應用程序。除了前端和后端企業軟件開發之外, Burak 還從事廣泛的 AI 應用程序開發。他擁有加拿大不列顛哥倫比亞大學電氣和計算機工程博士學位。
審核編輯:郭婷
-
Google
+關注
關注
5文章
1757瀏覽量
57414 -
NVIDIA
+關注
關注
14文章
4940瀏覽量
102816 -
python
+關注
關注
56文章
4782瀏覽量
84453
發布評論請先 登錄
相關推薦
評論