針對多平臺多硬體的場景,飛槳(PaddlePaddle)在今年 8 月份升級釋出了 Paddle Lite 推理引擎。它支援多種硬體、多種平臺,還具備輕量化部署、高效能實現等重要特性。
百度在深度學習推理引擎領域耕耘多年,在 2017 年開始,公司內部就有多個自研推理引擎並各有所長,比如有的主打手機端部署,有的則側重支援多硬體多平臺。2019 年,隨著飛槳整體生態的構建,我們將這些推理引擎的技術積累進行了整合,將 Paddle Mobile 品牌升級為 Paddle Lite,旨在支援更廣泛硬體平臺,在架構和效能上集眾家之長,並融入了對硬體和平臺支援的最新的思考。8月份我們釋出了 Paddle Lite 的 Beta 版本,並於 9 月 22 日釋出了 RC 版本。Paddle Lite 是一個開源專案,其所有專案程式碼在 Github 上維護:
倉庫地址:https://github.com/PaddlePaddle/Paddle-Lite
最新文件地址:https://paddlepaddle.github.io/Paddle-Lite
1. 特性&能力
Paddle Lite 支援如下特性:①多硬體平臺支援;②輕量化部署;③高效能實現;④量化計算支援。下面我們一一介紹。
1.1. 多硬體平臺支援
目前支援如下 7 種硬體:
ARM CPU V7、V8
Mali GPU, Adreno GPU, Metal GPU
Huawei NPU
FPGA
Paddle Lite 自上而下支援兩個層次的多平臺支援,一個是上層的多種訓練平臺支援,除了飛槳訓練出的原生模型,還可以通過 X2Paddle 工具將 Caffe, TensorFlow, ONNX 等第三方平臺的模型轉化為 PaddlePaddle 的模型格式,從而載入進 Paddle Lite 部署。X2Paddle 的使用方法非常簡單,參考上面命令便可完成相應模型的轉化。Paddle Lite 官方測試驗證過的模型列表如下。
除了多種訓練平臺這個層次外,在底層,Paddle Lite 也支援伺服器端和移動端兩種平臺的預測部署。
1.2. 輕量級部署
完善的多硬體平臺支援必須至少有如下支援,比如完整的各類硬體後端支援,多份硬體相關運算元的實現,計算圖詳盡的分析和優化能力。這些能力的支援必然帶來最終部署庫的體積膨脹,難以輕量化部署。
Paddle Lite 針對這個問題,在架構上做了相應的設計:
在具體架構上,由模型載入執行的順序,嚴格拆分為分析和執行兩個階段。分析階段有完整的計算圖分析優化的能力(比如運算元融合,記憶體優化等),由於策略較多,體積較大;執行階段只包含相關運算元,功能簡單,但體積很小。
在體積敏感的場景下,Paddle Lite 可以選擇輕量化部署方案,即可以只部署執行階段,而複雜的分析優化則封裝到了離線工具中。當然,在體積不敏感的場景下,比如伺服器端推理,Paddle Lite 也支援兩個階段合併在一起部署,以支援一些預測前需要針對具體硬體和上下文資訊調整動態圖優化的能力。
Paddle Lite 核心庫(ARM V8)是 1.4M,在主流實現中較有優勢。
1.3. 高效能實現
Paddle Lite 的實現也是比較有優勢的,比如在端側推理非常主流的硬體 ARM CPU 上,MobileNet V1 的效能如上,也是比較有優勢的。
1.4. 量化計算支援
量化計算是神經網路計算的趨勢。神經網路有資訊冗餘的特點,即使使用低精度計算也能保證效果,基於這個優點,各硬體平臺都通過量化計算來提供更快,功耗體積更有優勢的硬體。Paddle Lite 在這方面也有很好的支援。
基於 PaddleSlim 的量化訓練出的模型,結合 Paddle Lite 的 Int8 量化預測能力,可以得到很有競爭力的 Int8 量化效能:
PaddleSlim 專案地址:
https://github.com/PaddlePaddle/FluidDoc/tree/develop/doc/fluid/advanced_usage/paddle_slim
2. 通用的硬體平臺支援架構設計
Paddle Lite 在架構的設計中,重點考慮了相對廣泛的多硬體平臺支援的能力。首先在 Kernel 層,一種演算法可以為多個硬體或者實現方法註冊多個實現。
比如上圖,Operator1 代表的演算法有三種硬體,6 種實現。在具體的硬體平臺上,可能會同時存在多種硬體可用,比如在安卓手機上,除了 ARM CPU 之外,可能還有 Mali GPU 可用,這時就需要混合排程多種硬體的 Kernel,中間涉及的跨裝置拷貝,不同的資料排布等自動轉化會比較複雜。為了較完備地支援這些場景,Paddle Lite 在架構中整合了 TypeSystem 的設計思路,將架構上支援任意硬體、任意量化精度、任意資料排布的 Kernel 實現的混合排程轉化為型別推導的過程。
具體地,每個 Kernel 在註冊時,會同時註冊其自身,以及輸入輸出的型別資訊,比如一個矩陣乘的 Kernel 會有如下注冊邏輯。
其輸入是一個 ARM 上的 Tensor type。
一個複雜的多種不同 Kernel 的排程轉為計算圖中型別推導和對應做型別轉換(type cast)的過程,比如下圖,兩個 Kernel 有不同型別的形參 a, b(紅色和藍色各代表一種型別)。
在第一步型別推導後,我們發現型別不匹配的點(紅色叉處)。
Paddle Lite 的圖分析優化模組(MIR)會自動插入相應種類的 typecast kernel 完成型別的轉化,從而完成不同計算的混合排程。
除了排程之外,為了支援相對廣泛的硬體,Paddle Lite 需要對硬體進行合理的抽象,抽象不能過淺,否則框架會與具體的硬體耦合,影響更多硬體的擴充套件;抽象也不能過高,否則不同硬體的必要支援能力會被削弱。
Paddle Lite 在 Kernel 層和 MIR(圖分析優化模組)均引入了適度的硬體支援,以支援硬體的針對優化,但通過通用的高層 API 來避免框架與具體硬體耦合。要擴充套件新的硬體,只需要擴充套件 Kernel 層(編寫對應的 Kernel)和 MIR 層(編寫對應的 IR Pass)便可輕鬆實現。
3. 應用案例
3.1. 使用方法
Paddle Lite 的使用有如下幾個步驟:
(1) 獲取 PaddlePaddle 模型
用 PaddlePaddle 訓練
可選通過 PaddleSlim 做模型壓縮
或用 X2Paddle 轉換 TF 等第三方模型
(2) model_optimize_tool 優化模型
(3) 編寫預測程式碼,整合到服務中
C++ 介面
Java 介面
獲取模型的方法以下幾種:
參考 PaddlePaddle 文件訓練新的模型
直接使用 Paddle/models 標準模型庫中提供的模型
X2Paddle 模型轉換工具轉化第三方模型
PaddleSlim 模型壓縮工具集二次壓縮 PaddlePaddle 模型
之後是使用模型壓縮工具優化模型,使用方法可以參考如下命令,完整教程可以參考文件。
地址:
https://paddlepaddle.github.io/Paddle-Lite/develop/model_optimize_tool/
使用程式碼大體如下:
3.2. 實驗一:手機端 Demo
Paddle Lite 官方提供了 Android 和 iOS 的演示性 Demo,可以幫助使用者快速的整合和驗證模型的效能和效果。
Paddle-Lite-Demo 地址:https://github.com/PaddlePaddle/Paddle-Lite-Demo
3.2.1. 試驗裝置
iOS 使用者需要 MacOS 系統,安裝 xcode10.1(或以上版本),並登入 iCloud 賬戶
Android 使用者可以使用 MacOS,Ubuntu 或 Centos 系統,安裝 Android Studio3.4
iPhone 手機需要登入 iCloud 賬戶
Android 手機需要開啟手機的「除錯模式」並開啟「USB 安裝」
配置 MacOS 或 Ubuntu 系統的開發環境。具體請參考:https://github.io/Paddle-Lite/develop/source_compile/
3.2.2. 預測庫編譯
手機端 Demo 採用的是無第三方依賴的「tiny_publish」模式。
具體編譯引數可以參考:
https://paddlepaddle.github.io/Paddle-Lite/develop/source_compile/#%E4%BA%8C%E7%BC%96%E8%AF%91paddlelite
下載程式碼庫:
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
git checkout v2.0.0-rc
Android tiny_publish 編譯(gcc,armv8):
./lite/tools/build.sh --arm_os=android --arm_abi=armv8 \
--arm_lang=gcc --android_stl=c++_static tiny_publish
iOS tiny_publish 編譯(armv8, ios64):
./lite/tools/build.sh --arm_os=ios64 --arm_abi=armv8 ios
3.2.3. 模型轉換
為了滿足手機端輕量化部署的需求,我們會在離線階段進行模型結構的分析和優化,並將優化後的模型序列化到 Naive Buffer 的格式,從而減少部署包的體積,並實現無第三方依賴。因此在手機端上部署之前我們需要通過離線優化工具「model_optimize_tool」進行模型的轉換。
原始碼編譯:
./lite/tools/build.sh build_optimize_tool
編譯完成後,離線優化工具位於「build.model_optimize_tool/lite/api/model_optimize_tool」
下載編譯好的執行檔案:
地址:https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.0.0-rc/model_optimize_tool.gz
模型轉換
詳情請參考:https://paddlepaddle.github.io/Paddle-Lite/develop/model_optimize_tool/
3.2.4. APP 整合開發
首先下載 Paddle-Lite-Demo 倉庫。在倉庫中包含 3 個專案:
PaddleLite-android-demo:Android Demo,包含了目標識別和目標檢測
ios-classification_demo:iOS Demo,用於目標識別
ios-detection_demo:iOS Demo,用於目標檢測;
對於 Android 使用者,使用 Android Studio 開啟 Paddle-Lite-android-demo,插入手機,在 Android studio 上可以編譯並在手機上安裝對應的 APP,可以在手機上直接開啟使用;
對於 iOS 使用者,使用 xCode 開啟 ios-classification_demo 或者 ios-detection_demo,在 xcode 中選擇插入的真機(iphone),點選編譯執行即可在手機上安裝對應的 APP,使用者可以直接在手機上體驗視訊流的目標識別和檢測。
使用者可以替換 Demo 中的預測庫到最新的版本或者更換 Demo 中的模型為自己訓練的模型,具體操作請參考文件。
3.3. 實驗二:基於 FPGA 的蔬菜識別應用
3.3.1. 百度大腦 EdgeBoard 嵌入式 AI 解決方案介紹
EdgeBoard 是基於 FPGA 打造的嵌入式 AI 解決方案及基於此方案實現的系列硬體,與 AI Studio/EasyDL 等模型定製平臺深度打通,具有高效能、高通用、低成本、易開發等四大優點,適用於開發驗證、產品整合、科研教學、專案落地等應用方向,以及安防監控、工業質檢、醫療診斷、農作物生長監控、無人駕駛、無人零售等應用場景,本小節主要使用 EdgeBoard 深度學習計算卡進行案例打造。
Edgeboard 可以支援多種資料來源輸入,可以支援 Float 模型和 INT8 量化模型,可以支援 CPU+FPGA OP 混合排程,可以支援自動融合 OP,FPGA 流水操作。
Edgeboard 使用流程包含:模型獲取、接入資料來源、部署模型、結果輸出等四個步驟,就是個簡單的應用開發,不具備深度學習的基礎的同學也能很容易上手。
3.3.2. 蔬菜識別模型訓練
本課程採用了百度 Ai Studio 的公開蔬菜識別專案,首先我們訓練一個 Float 模型,並在 AI Studio 平臺上使用 GPU 評估下效果。
專案地址:
https://aistudio.baidu.com/aistudio/projectdetail/131380
為了進一步提高識別速度和效率,Edgeboard 會在執行時進行動態量化,這樣會有一定的精度損失。我們會基於此模型在 AI Studio 上進行 INT8 量化訓練,訓練一個 INT8 的模型,來彌補精度損失。
3.3.3. 模型的佈署與測試
(1)Paddle Lite 支援 Fpga 硬體原理
Paddle Lite 完整支援從 Mobile 到 Server 多種硬體,這主要得益於對不同硬體的統一抽象,不同的硬體提供統一的介面給上層框架,形成了硬體的可插拔,極大方便了底層硬體的擴充套件與支援。Fpga 作為 Paddle Lite 的 Backends 之一,將自身硬體相關的 kernel、驅動及核心進行了包裝並向 Paddle Lite 提供了統一的 op 呼叫介面,使得 Paddle Lite 能很方便的整合 Fpga 的計算能力。同時通過 Paddle Lite 上層框架對模型的優化能力,包括各種 op 融合、計算剪枝、儲存複用、量化融合的優化 pass, 以及 kernel 的最優排程、混合佈署等功能,進一步實現了模型加速。
(2)EdgeBoard 模型佈署
利用 Paddle Lite 在 EdgeBoard 上進行模型佈署很簡單,只需將 include 下標頭檔案包含到呼叫 Paddle Lite 的程式碼檔案中,將靜態庫檔案與工程檔案聯編成可執行程式,替換模型即可執行。訓練模型效果對比:
3.3.4. 實驗總結
本課程利用 Paddle Lite 推理引擎在 EdgeBoard 計算卡上佈署 Inceptionv4 蔬菜識別模型,實現了邊緣端智慧識別蔬菜品類的功能,可用於多種場景。整個應用藉助 Paddle Lite 的上層框架優化能力與 Fpga 的底層計算加速能力,每秒可識別 30 幀,真正實現實時高效的蔬菜識別。
本課程具有極高的擴充性,由於 Paddle Lite 可以和 PaddlePaddle 模型無縫對接,加上 EdgeBoard 計算卡的軟體可持續迭代、op 持續更新等特點,在模型支援上的數量上和速度上均會有很大優勢,如本文所用模型也可以更換的分類模型或檢測模型。
4. Paddle Lite 專案未來計劃
Paddle Lite 未來計劃如下,10 月釋出正式版,每個月一個版本高效迭代:
框架能力和功能加強,如平臺支援擴充套件,易用性完善,加密,視訊記憶體優化等
硬體支援範圍持續擴大,新硬體評測支援能力提升
整體效能優化,量化部署方案完善和模型覆蓋範圍增加
文件持續優化:更多的 demo,示例程式碼,可讀性加強