0 概述
模型訓練重點關注的是如何通過訓練政策來得到一個性能更好的模型,其過程似乎包含着各種“玄學”,被戲稱為“煉丹”。整個流程包含從訓練樣本的擷取(包括資料采集與标注),模型結構的确定,損失函數和評價名額的确定,到模型參數的訓練,這部分更多是業務方去承接相關工作。一旦“煉丹”完成(即訓練得到了一個名額不錯的模型),如何将這顆“丹藥”賦能到實際業務中,充分發揮其能力,這就是部署方需要承接的工作。
是以,一般來說,學術界負責各種 SOTA(State of the Art) 模型的訓練和結構探索,而工業界負責将這些 SOTA 模型應用落地,賦能百業。本文将要講述的是,在 CV 場景中,如何實作模型的快速落地,賦能到産業應用中。模型部署一般無需再考慮如何修改訓練方式或者修改網絡結構以提高模型精度,更多的是需要明确部署的場景、部署方式(中心服務化還是本地終端部署)、模型的優化名額,以及如何提高吞吐率和減少延遲等,接下來将逐一進行介紹。
1 模型部署場景
這個問題主要源于中心伺服器雲端部署和邊緣部署兩種方式的差異 雲端部署常見的模式是,模型部署在雲端伺服器,使用者通過網頁通路或者 API 接口調用等形式向雲端伺服器送出請求,雲端收到請求後處理并傳回結果。邊緣部署則主要用于嵌入式裝置,主要通過将模型打包封裝到 SDK,內建到嵌入式裝置,資料的處理和模型推理都在終端裝置上執行。
2 模型部署方式
針對上面提到的兩種場景,分别有兩種不同的部署方案,Service 部署和 SDK 部署。 Service 部署:主要用于中心伺服器雲端部署,一般直接以訓練的引擎庫作為推理服務模式。SDK 部署:主要用于嵌入式端部署場景,以 C++ 等語言實作一套高效的前後處理和推理引擎庫(高效推理模式下的 Operation/Layer/Module 的實作),用于提供高性能推理能力。此種方式一般需要考慮模型轉換(動态圖靜态化)、模型聯合編譯等進行深度優化

3 部署的核心優化名額
部署的核心目标是合理把控成本、功耗、成本效益三大要素。
成本問題是部署硬體的重中之重,AI 模型部署到硬體上的成本将極大限制使用者的業務承受能力。成本問題主要聚焦于晶片的選型,比如,對比寒武紀 MLU220 和 MLU270,MLU270 主要用作資料中心級的加速卡,其算力和功耗都相對于邊緣端的人工智能加速卡MLU220要低。至于 Nvida 推出的 Jetson 和 Tesla T4 也是類似思路,Tesla T4 是主打資料中心的推理加速卡,而 Jetson 則是嵌入式裝置的加速卡。對于終端場景,還會根據對算力的需求進一步細分,比如表中給出的高通骁龍晶片,除 GPU 的浮點算力外,還會增加 DSP 以增加定點算力,篇幅有限,不再贅述,主要還是根據成本和業務需求來進行權衡。
在資料中心服務場景,對于功耗的限制要求相對較低;在邊緣終端裝置場景,硬體的功耗會影響邊緣裝置的電池使用時長。是以,對于功耗要求相對較高,一般來說,利用 NPU 等專用優化的加速器單元來處理神經網絡等高密度計算,能節省大量功耗。
不同的業務場景對于晶片的選擇有所不同,以達到更高的成本效益。從公司業務來看,雲端相對更加關注是多路的吞吐量優化需求,而終端場景則更關注單路的延時需要。在目前主流的 CV 領域,低比特模型相對成熟,且 INT8/INT4 晶片因成本低,且算力比高的原因已被廣泛使用;但在NLP或者語音等領域,對于精度的要求較高,低比特模型精度可能會存在難以接受的精度損失,是以 FP16 是相對更優的選擇。在 CV 領域的晶片成本效益選型上,在有 INT8/INT4 計算精度的晶片裡,主打低精度算力的産品是追求高成本效益的主要選擇之一,但這也為平衡精度和成本效益提出了巨大的挑戰。
4 部署流程
上面簡要介紹了部署的主要方式和場景,以及部署晶片的選型考量名額,接下來以 SDK 部署為例,給大家概括介紹一下 SenseParrots 在部署中的整體流程。SenseParrots 部署流程大緻分為以下幾個步驟:模型轉換、模型量化壓縮、模型打包封裝 SDK。
4.1 模型轉換
模型轉換主要用于模型在不同架構之間的流轉,常用于訓練和推理場景的連接配接。目前主流的架構都以 ONNX 或者 caffe 為模型的交換格式,SenseParrots 也不例外。SenseParrots 的模型轉換主要分為計算圖生成和計算圖轉換兩大步驟,另外,根據需要,還可以在中間插入計算圖優化,對計算機進行推理加速(諸如常見的 CONV/BN 的算子融合)。
計算圖生成是通過一次 inference 并追蹤記錄的方式,将使用者的模型完整地翻譯成靜态的表達。在模型 inference 的過程中,架構會記錄執行算子的類型、輸入輸出、超參、參數和調用該算子的模型層次,最後把 inference 過程中得到的算子資訊和模型資訊結合得到最終的靜态計算圖。
在計算圖生成之後與計算圖轉換之前,可以進行計算圖優化,例如去除備援 op,計算合并等。SenseParrots 原生實作了一批計算圖的精簡優化 pass,也開放接口鼓勵使用者對計算圖進行自定義的處理和優化操作。
計算圖轉換是指分析靜态計算圖的算子,對應轉換到目标格式。SenseParrots 支援了多後端的轉換,能夠轉換到各個 opset 的 ONNX、原生 caffe 和多種第三方版本的 caffe。架構通過算子轉換器繼承或重寫的方式,讓 ONNX 和 caffe 的不同版本的轉換開發變得更加簡單。同時,架構開放了自定義算子生成和自定義算子轉換器的接口,讓第三方架構開發者也能夠輕松地自主開發實作 SenseParrots 到第三方架構的轉換。
4.2 模型量化壓縮
終端場景中,一般會有記憶體和速度的考慮,是以會要求模型盡量小,同時保證較高的吞吐率。除了人工針對嵌入式裝置設計合适的模型,如 MobileNet 系列,通過 NAS(Neural Architecture Search) 自動搜尋小模型,以及通過蒸餾/剪枝的方式壓縮模型外,一般還會使用量化來達到減小模型規模和加速的目的。
量化的過程主要是将原始浮點 FP32 訓練出來的模型壓縮到定點 INT8(或者 INT4/INT1) 的模型,由于 INT8 隻需要 8 比特來表示,是以相對于 32 比特的浮點,其模型規模理論上可以直接降為原來的 1/4,這種壓縮率是非常直覺的。另外,大部分終端裝置都會有專用的定點計算單元,通過低比特指令實作的低精度算子,速度上會有很大的提升,當然,這部分還依賴協同體系結構和算法來獲得更大的加速。
量化的技術棧主要分為量化訓練(QAT, Quantization Aware Training)和離線量化(PTQ, Post Training Quantization), 兩者的主要差別在于,量化訓練是通過對模型插入僞量化算子(這些算子用來模拟低精度運算的邏輯),通過梯度下降等優化方式在原始浮點模型上進行微調,從來調整參數得到精度符合預期的模型。離線量化主要是通過少量校準資料集(從原始資料集中挑選 100-1000 張圖,不需要訓練樣本的标簽)獲得網絡的 activation 分布,通過統計手段或者優化浮點和定點輸出的分布來獲得量化參數,進而擷取最終部署的模型。兩者各有優劣,量化訓練基于原始浮點模型的訓練邏輯進行訓練,理論上更能保證收斂到原始模型的精度,但需要精細調參且生産周期較長;離線量化隻需要基于少量校準資料,是以生産周期短且更加靈活,缺點是精度可能略遜于量化訓練。實際落地過程中,發現大部分模型通過離線量化就可以獲得不錯的模型精度(1% 以内的精度損失,當然這部分精度的提升也得益于優化政策的加持),剩下少部分模型可能需要通過量化訓練來彌補精度損失,是以實際業務中會結合兩者的優劣來應用。
量化主要有兩大難點:一是如何平衡模型的吞吐率和精度,二是如何結合推理引擎充分挖掘晶片的能力。比特數越低其吞吐率可能會越大,但其精度損失可能也會越大,是以,如何通過算法提升精度至關重要,這也是組内的主要工作之一。另外,壓縮到低比特,某些情況下吞吐率未必會提升,還需要結合推理引擎優化一起對模型進行圖優化,甚至有時候會回報如何進行網絡設計,是以會是一個算法與工程疊代的過程。
4.3 模型打包封裝 SDK
實際業務落地過程中,模型可能隻是産品流程中的一環,用于實作某些特定功能,其輸出可能會用于流程的下一環。是以,模型打包會将模型的前後處理,一個或者多個模型整合到一起,再加入描述性的檔案(前後處理的參數、模型相關參數、模型格式和版本等)來實作一個完整的功能。是以,SDK 除了需要一些通用前後處理的高效實作,對齊訓練時的前後處理邏輯,還需要具有足夠好的擴充性來應對不同的場景,友善業務線同學擴充新的功能。可以看到,模型打包過程更多是模型的進一步組裝,将不同模型組裝在一起,當需要使用的時候将這些内容解析成整個流程(pipeline)的不同階段(stage),進而實作整個産品功能。
另外,考慮到模型很大程度是研究員的研究成果,對外涉及保密問題,是以會對模型進行加密,以保證其安全性。加密算法的選擇需要根據實際業務需求來決定,諸如不同加密算法其加解密效率不一樣,加解密是否有中心驗證伺服器,其核心都是為了保護研究成果。
PS:歡迎大家關注 AI 架構技術分享專欄内容,如果有感興趣的技術内容和難點歡迎随時指出,可以多多評論留言。我們也希望能通過本次技術分享讓大家了解到更多的 AI 架構前沿技術,也期待和大家一起探讨,更歡迎大家加入我們,一同為 AI 架構及 AI 發展貢獻力量!感興趣的小夥伴兒歡迎加入小 P 家,履歷投遞:[email protected]
5 參考文獻
# https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/tesla-t4/t4-tensor-core-datasheet-951643.pdf
# https://www.nvidia.com/en-us/autonomous-machines/embedded-systems/jetson-tx2/
# https://www.cambricon.com/index.php?m=content&c=index&a=lists&catid=57
# https://www.cambricon.com/index.php?m=content&c=index&a=lists&catid=36
# https://www.nvidia.com/en-us/data-center/tesla-t4/
# https://zhuanlan.zhihu.com/p/58864114
# https://www.wikiwand.com/en/List_of_Qualcomm_Snapdragon_processors#/Snapdragon_855/855+(2019)_and_860(2021)