天天看點

以 Animated Drawings APP 為例,用 TorchServe 進行模型調優

作者:HyperAI超神經

内容導讀

上節介紹了 TorchServe 模型部署調優的 5 個步驟,本節以 Animated Drawings APP 為例,實際示範 TorchServe 的模型優化效果。

本文首發自微信公衆号:PyTorch 開發者社群

去年,Meta 憑借 Animated Drawings 應用程式,用 AI 讓兒童手工畫「動」了起來,靜态簡筆畫秒變動畫~

以 Animated Drawings APP 為例,用 TorchServe 進行模型調優

Animated Drawings 制作流程

以 Animated Drawings APP 為例,用 TorchServe 進行模型調優

Animated Drawings 動态效果

Demo 傳送門:

https://sketch.metademolab.com/

這對于 AI 來說并不簡單。AI 的設計初衷是為了處理真實世界中的圖像,兒童繪畫與真實圖像相比,形态和風格迥異,更具有複雜性及不可預測性,是以先前的 AI 系統可能并不适用于處理 Animated Drawings 類似的任務。

本文将以 Animated Drawings 為例,詳細講解如何借助 TorchServe,對即将部署到生産環境中的模型進行調優。

4 大因素影響生産環境中的模型調優

下面的工作流程展示用 TorchServe 在生産環境中進行模型部署的總體思路。

以 Animated Drawings APP 為例,用 TorchServe 進行模型調優

用 TorchServe 為生産環境中的模型調優的基本流程

大多數情況下,部署模型到生産環境中是基于吞吐量 (throughput) 或延遲 (latency) 服務級别協定 (SLA) 進行優化的。

通常實時應用程式 (real-time application) 更關心延遲,而離線應用程式 (off-line application) 則更關心吞吐量。

對于部署到生産環境中的模型,影響性能的因素衆多,本文重點介紹 4 個:

1. Model optimizations

這是将模型部署到生産環境的前置步驟,包括量化、剪枝、使用 IR graphs(PyTorch 中的 TorchScript)、融合核心及其他衆多技術。目前,TorchPrep 中提供很多類似技術作為 CLI 工具。

更多關于 Torchprep 的相關簡介,請通路:

https://github.com/msaroufim/torchprep

2. Batch inference

它是指将多個 input 輸入到一個模型中,在訓練過程中會頻繁用到,對于在推理階段控制成本也很有幫助。

硬體加速器對并行進行了優化,batching 有助于充分利用計算能力,這經常導緻更高的吞吐量。推理的主要差別在于無需等待太久,就能從用戶端獲得一個 batch,也就是我們常說的動态批處理 (dynamic batching)。

3. Numbers of Workers

TorchServe 通過 worker 部署模型。TorchServe 中的 worker 屬于 Python 程序,擁有用于推理的模型權重副本。worker 數量太少,無法從足夠的并行性中受益;worker 數量太多,又會導緻 worker contention 及端到端性能降低。

4. Hardware

根據模型、應用程式及延遲、吞吐量預算,從 TorchServe、CPU、GPU、AWS Inferentia 中選擇一個合适的硬體。

有些硬體配置是為了擷取最好的 class 性能,有些是為了更符合預期的成本管控。實驗表明,batch size 較大時更适合選用 GPU;batch size 較小或要求低延遲時,選用 CPU 和 AWS Inferentia 則更具備成本優勢。

Tips 分享:TorchServe 性能調優的注意事項

開始之前,我們先分享一些用 TorchServe 部署模型、獲得最佳性能的 Tips。

* 學習 PyTorch 官方教程:

https://pytorch.org/tutorials/

硬體選擇與模型優化選擇也是緊密聯系的。

* 模型部署的硬體選擇,與延遲、吞吐量預期以及每次推理的成本密切相關。

由于模型大小和應用的不同, CPU 的生産環境通常無法負擔類似計算機視覺模型的部署,大家可以注冊使用 OpenBayes.com,注冊即送 3 小時 RTX3090,每周還贈送 10 小時 RTX3090,滿足一般的 GPU 需求。

此外,最近添加到 TorchServe 中的 IPEX 等優化,使得這類模型的部署成本更低、更能被 CPU 負擔。

IPEX 優化模型部署詳見:

https://pytorch.org/tutorials/intermediate/torchserve_with_ipex.html

* TorchServe 中的 worker 屬于 Python 程序,可以提供并行,應謹慎設定 worker 數量。預設情況下 TorchServe 啟動的 worker 數量等于主機上的 VCPU 或可用 GPU 數量,這可能會給 TorchServe 啟動增加相當長的時間。

TorchServe 公開了一個 config property 來設定 worker 的數量。為了讓多個 worker 提供高效并行并避免它們競争資源,建議在 CPU 和 GPU 上設定以下 baseline:

CPU:在 handler 中設定 torch.set _ num _ thread (1) 。然後将 workers 的數量設定成 num physical cores / 2。但最好的線程配置可以通過利用 Intel CPU launcher script 來實作。

GPU:可用 GPU 的數量可以通過 config.properties 中的 number_gpus 進行設定。TorchServe 使用循環配置設定 worker 到 GPU。建議:Number of worker = (Number of available GPUs) / (Number of Unique Models)。注意, pre-Ampere 的 GPU 不提供任何與 Multi Instance GPU 的資源隔離。

* Batch size 直接影響延遲和吞吐量。為了更好地利用計算資源,需要增加 batch size。在延遲和吞吐量之間存在 tradeoff;較大的 batch size 可以提高吞吐量,但也會導緻較高的延遲。

TorchServe 中有兩種設定 batch size 的方式,一種是通過 config.properties 中 model config 進行,另一種使用 Management API 來 registering model。

下節展示如何用 TorchServe 的 benchmark suite 來決定模型優化中硬體、worker 和 batch size 的最佳組合。

認識 TorchServe Benchmark Suite

要使用 TorchServe benchmark suite,首先需要一個 archived file,即上文提過的 .mar 檔案。該檔案包含模型、handler 和其他所有用來加載和運作推理的其他 artifacts。Animated Drawing APP 使用 Detectron2 的 Mask-rCNN 目标檢測模型

運作 benchmark suite

TorchServe 中的 Automated benchmark suite 可以在不同 batch size 和 worker 設定下,對多個模型進行基準測試,并輸出報告。

了解 Automated benchmark suite:

https://github.com/pytorch/serve/tree/master/benchmarks#auto-benchmarking-with-apache-bench

開始運作:

git clone https://github.com/pytorch/serve.git
cd serve/benchmarks
pip install -r requirements-ab.txt
apt-get install apache2-utils           

在 yaml 檔案中配置模型 level 設定:

Model_name:
    eager_mode:
        benchmark_engine: "ab"
        url: "Path to .mar file"
        workers:
            - 1
            - 4
        batch_delay: 100
        batch_size:
            - 1
            - 2
            - 4
            - 8
        requests: 10000
        concurrency: 10
        input: "Path to model input"
        backend_profiling: False
        exec_env: "local"
        processors:
            - "cpu"
            - "gpus": "all"           

這個 yaml 檔案将被 benchmark_config_template.yaml 引用。Yaml 檔案中包括用于生成報告的其他設定,也可以用 AWS Cloud 檢視 logs。

python benchmarks/auto_benchmark.py --input benchmark_config_template.yaml           

運作 benchmark,結果被儲存在一個 csv 檔案中,可以在 _/tmp/benchmark/ab_report.csv_ 或完整報告 /tmp/ts_benchmark/report.md 中找到。

結果包括 TorchServe 平均延遲、模型 P99 延遲 (model P99 latency)、吞吐量、并發 (concurrency)、請求數、handler time 及其他 metrics。

重點跟蹤以下影響模型調優的因素:并發、模型 P99 延遲、吞吐量 。

這些數字要與 batch size、使用的裝置、worker 數量以及是否做了模型優化結合起來看。

這個模型的 latency SLA 已經設定為 100 ms,這是個實時應用程式,延遲是很重要的問題,在不違反 latency SLA 的情況下,吞吐量最好盡可能高。

通過搜尋空間,在不同的 batch size (1-32)、worker 數量 (1-16) 和裝置 (CPU, GPU) 上運作一系列實驗,總結出最好的實驗結果,見下表:

以 Animated Drawings APP 為例,用 TorchServe 進行模型調優

這個模型在 CPU 上的延遲、batch size、并發和 worker 數量等方面進行的所嘗試,都沒有到 SLA,實際上延遲降低了 13 倍。

将模型部署移動到 GPU 上,可以立即将延遲從 305ms 降到 23.6ms。

可以為模型做的最簡單的優化之一,就是把它的精度降低到 fp16,一行代碼 (model. half ()) ,可以減少 32% 的模型 P99 延遲 ,并增加幾乎相同數量的吞吐量。

模型優化方法還有将模型轉化為 TorchScript 并使用 optimation_for_inference 或其他技巧(包括 onnx 或 tensort runtime optimizations)進行優化,這些優化利用了 aggressive fusions 。

在 CPU 和 GPU 上,設定 number of workers=1 對于本文的 case 效果最好。

* 将模型部署到 GPU,設定 number of workers = 1, batch size = 1,吞吐量增加 12 倍相比于 CPU 上 降低 13 倍延遲。

* 将模型部署到 GPU,設定 model.half()、number of workers = 1 、 batch size = 8,可以獲得吞吐量和可承受的延遲方面的最佳結果。與 CPU 相比,吞吐量增加 25 倍,延遲仍然滿足 SLA (94.4 ms)。

注意: 如果正在運作 benchmark suite,請確定設定了适當的 batch_delay,将并發性的請求設定為與 batch size 成比例的數字。這裡的并發性是指發送到伺服器的并發請求的數量。

總結

本文介紹了 TorchServe 在生産環境中調優模型的注意事項及性能優化方法 TorchServe benchmark suite,使使用者對模型優化、硬體選擇和總體成本的可能選擇有了更深入的了解。

推薦使用者:

擷取 13 小時 RTX3090 算力資源:

https://openbayes.com/

檢視「用 PyTorch 進行深度學習」線上教程:

https://openbayes.com/docs/tutorial-jupyterlab-deep-learning-with-pytorch

關注 PyTorch 開發者社群公衆号,擷取更多 PyTorch 技術更新、最佳實踐及相關資訊!

繼續閱讀