Paddle模型部署

一数初、簡介

飛槳(PaddlePaddle)以百度深度學(xué)習(xí)技術(shù)研究和業(yè)務(wù)應(yīng)用為基礎(chǔ),集深度學(xué)習(xí)核心訓(xùn)練和推理框架梗顺、基礎(chǔ)模型庫泡孩、端到端開發(fā)套件和豐富的工具組件于一體的深度學(xué)習(xí)平臺。

飛槳產(chǎn)品全景

1.訓(xùn)練模型庫

PaddleHub旨在為開發(fā)者提供豐富的寺谤、高質(zhì)量的仑鸥、直接可用的預(yù)訓(xùn)練模型。飛槳的產(chǎn)業(yè)級模型庫包含PaddleClas变屁、PaddleDetection眼俊、PaddleSeg、PaddleOCR粟关、PaddleGAN疮胖、PaddleVideo、PaddleNLP等方面闷板。

模型庫下載

1)PaddleDetection

PaddleDetection是一個基于PaddlePaddle的目標(biāo)檢測端到端開發(fā)套件澎灸,在提供豐富的模型組件和測試基準(zhǔn)的同時,注重端到端的產(chǎn)業(yè)落地應(yīng)用遮晚,幫助開發(fā)者實(shí)現(xiàn)數(shù)據(jù)準(zhǔn)備击孩、模型選型、模型訓(xùn)練鹏漆、模型部署的全流程打通巩梢,快速進(jìn)行落地應(yīng)用。

不僅復(fù)現(xiàn)了常見的目標(biāo)檢測模型艺玲,還對模型的進(jìn)行了圖像增強(qiáng)括蝠、骨干網(wǎng)絡(luò)優(yōu)化、DropBlock饭聚,IoU Loss IoUAware等一系列深度優(yōu)化忌警。同時內(nèi)置集成模型壓縮能力,提供了一鍵式剪裁秒梳,蒸餾法绵,量化的腳本,大大提高模型精度和速度酪碘,并減小模型體積朋譬。

優(yōu)勢:

  • 模型豐富:PaddleDetection提供了豐富的模型,包含目標(biāo)檢測兴垦、實(shí)例分割徙赢、人臉檢測等100+個預(yù)訓(xùn)練模型字柠,10+算法,持續(xù)推出針對服務(wù)器端和移動端狡赐、嵌入式等的增強(qiáng)模型窑业,涵蓋多種數(shù)據(jù)集競賽冠軍方案,并提供適合云端/邊緣端設(shè)備部署的檢測方案枕屉。

  • 高靈活度:PaddleDetection通過模塊化設(shè)計(jì)來解耦各個組件常柄,模型網(wǎng)絡(luò)結(jié)構(gòu)和數(shù)據(jù)處理均可定制,基于配置文件可以輕松地搭建各種檢測模型搀擂。

  • 易部署:PaddleDetection的模型中使用的核心算子均通過C++或CUDA實(shí)現(xiàn)西潘,提供跨平臺推理引擎,實(shí)現(xiàn)了模型訓(xùn)練到部署的無縫銜接哥倔,同時內(nèi)置集成了一鍵式壓縮和部署能力秸架。

    • 對于低算力的設(shè)備,推出SSDLite及其量化模型咆蒿,通過模型增強(qiáng)东抹,SSDLite在驍龍845芯片上推理時延達(dá)到41ms。
    • 對于需要兼顧速度和精度的應(yīng)用場景沃测,推出YOLOv3剪裁+蒸餾的壓縮模型缭黔,在100ms左右推理時延上能在COCO數(shù)據(jù)集上達(dá)到25左右的精度。
    • 對于算力比較高的設(shè)備蒂破,推出Cascade Faster RCNN模型馏谨,最高能在COCO數(shù)據(jù)集上達(dá)到30.2的精度。
  • 高性能:基于飛槳框架的高性能內(nèi)核附迷,實(shí)現(xiàn)了模型的高效訓(xùn)練和推理惧互。

2)PaddleClas

PaddleClas是飛槳為工業(yè)界和學(xué)術(shù)界所準(zhǔn)備的一個圖像識別和圖像分類任務(wù)的工具集。支持多種前沿圖像分類喇伯、識別相關(guān)算法喊儡,發(fā)布產(chǎn)業(yè)級特色骨干網(wǎng)絡(luò)PP-HGNetPP-LCNetv2稻据、 PP-LCNetSSLD半監(jiān)督知識蒸餾方案等模型艾猜。

模型簡介 應(yīng)用場景
PULC 超輕量圖像分類方案 固定圖像類別分類方案
PP-ShituV2 輕量圖像識別系統(tǒng) 針對場景數(shù)據(jù)類別頻繁變動、類別數(shù)據(jù)多
PP-LCNet 輕量骨干網(wǎng)絡(luò) 針對Intel CPU設(shè)備及MKLDNN加速庫定制
PP-LCNetV2 輕量骨干網(wǎng)絡(luò) 針對Intel CPU設(shè)備捻悯,適配OpenVINO
PP-HGNet 高精度骨干網(wǎng)絡(luò) GPU設(shè)備上相同推理時間精度更高

3)PaddleOCR

PaddleOCR旨在打造一套豐富匆赃、領(lǐng)先、且實(shí)用的OCR工具庫今缚。最新開源的超輕量PP-OCRv3模型大小僅為16.2M算柳。同時支持中英文識別;支持傾斜荚斯、豎排等多種方向文字識別埠居;支持GPU查牌、CPU預(yù)測事期;

模型簡介 模型名稱 推薦場景
中英文超輕量PP-OCRv3模型(16.2M) ch_PP-OCRv3_xx 移動端&服務(wù)器端
英文超輕量PP-OCRv3模型(13.4M) en_PP-OCRv3_xx 移動端&服務(wù)器端

2.推理部署

1)服務(wù)器部署

方案 硬件 API 語言 模型支持 適用場景
Paddle Inference 服務(wù)器(CPU滥壕、GPU) C++、Python兽泣、C绎橘、Go等 支持飛槳所有模型 適合直接應(yīng)用,既可通過Python API對性能要求不太高的場景快速支持唠倦;也提供C++高性能接口称鳞,可與線上系統(tǒng)聯(lián)編;并通過基礎(chǔ)的C API可擴(kuò)展支持更多語言的生產(chǎn)環(huán)境稠鼻。
Paddle Serving 服務(wù)器(CPU冈止、GPU) C++、Python候齿、Go等 適用于將推理計(jì)算作為一個遠(yuǎn)程調(diào)用服務(wù)的場景熙暴,客戶端發(fā)出請求慌盯,服務(wù)端返回推理結(jié)果〖远瘢可支持多機(jī)部署位衩。

Paddle Inference特點(diǎn)

  • 內(nèi)存/顯存復(fù)用提升服務(wù)吞吐量

    在推理初始化階段裆蒸,對模型中的OP輸出Tensor 進(jìn)行依賴分析,將兩兩互不依賴的Tensor在內(nèi)存/顯存空間上進(jìn)行復(fù)用糖驴,進(jìn)而增大計(jì)算并行量僚祷,提升服務(wù)吞吐量。

  • 細(xì)粒度OP橫向縱向融合減少計(jì)算量

    在推理初始化階段遂赠,按照已有的融合模式將模型中的多個OP融合成一個OP久妆,減少了模型的計(jì)算量的同時,也減少了 Kernel Launch的次數(shù)跷睦,從而能提升推理性能筷弦。目前Paddle Inference支持的融合模式多達(dá)幾十個。

  • 內(nèi)置高性能的CPU/GPU Kernel

    內(nèi)置同Intel抑诸、Nvidia共同打造的高性能kernel烂琴,保證了模型推理高性能的執(zhí)行。

  • 子圖集成TensorRT加快GPU推理速度

    Paddle Inference采用子圖的形式集成TensorRT蜕乡,針對GPU推理場景奸绷,TensorRT可對一些子圖進(jìn)行優(yōu)化,包括OP的橫向和縱向融合层玲,過濾冗余的OP号醉,并為OP自動選擇最優(yōu)的kernel,加快推理速度辛块。

  • 子圖集成Paddle Lite輕量化推理引擎

    Paddle Lite 是飛槳深度學(xué)習(xí)框架的一款輕量級畔派、低框架開銷的推理引擎,除了在移動端應(yīng)用外润绵,還可以使用服務(wù)器進(jìn)行 Paddle Lite 推理线椰。Paddle Inference采用子圖的形式集成 Paddle Lite,以方便用戶在服務(wù)器推理原有方式上稍加改動尘盼,即可開啟 Paddle Lite 的推理能力憨愉,得到更快的推理速度烦绳。

  • 支持加載PaddleSlim量化壓縮后的模型

    PaddleSlim是飛槳深度學(xué)習(xí)模型壓縮工具,Paddle Inference可聯(lián)動PaddleSlim配紫,支持加載量化径密、裁剪和蒸餾后的模型并部署,由此減小模型存儲空間笨蚁、減少計(jì)算占用內(nèi)存睹晒、加快模型推理速度趟庄。其中在模型量化方面括细,Paddle Inference在X86 CPU上做了深度優(yōu)化,常見分類模型的單線程性能可提升近3倍戚啥,ERNIE模型的單線程性能可提升2.68倍奋单。

Paddle Inference推理部署流程

  1. 導(dǎo)出模型文件。
    • 對于動態(tài)圖模型猫十,可以通過paddle.jit.save 接口來導(dǎo)出用于部署的標(biāo)準(zhǔn)化模型文件览濒。
    • 對于靜態(tài)圖模型,可以使用paddle.static.save_inference_model保存模型拖云。
  2. 配置推理選項(xiàng)贷笛。Config是飛槳提供的配置管理器API。在使用Paddle Inference進(jìn)行推理部署過程中宙项,需要使用Config詳細(xì)地配置推理引擎參數(shù)乏苦,包括但不限于在何種設(shè)備(CPU/GPU)上部署、加載模型路徑尤筐、開啟/關(guān)閉計(jì)算圖分析優(yōu)化汇荐、使用MKLDNN/TensorRT進(jìn)行部署的加速等。參數(shù)的具體設(shè)置需要根據(jù)實(shí)際需求來定盆繁。
  3. 創(chuàng)建Predictor掀淘。Predictor是飛槳提供的推理引擎API。根據(jù)設(shè)定好的推理配置Config創(chuàng)建推理引擎Predictor油昂,也就是推理引擎的一個實(shí)例革娄。創(chuàng)建期間會進(jìn)行模型加載、分析和優(yōu)化等工作冕碟。
  4. 準(zhǔn)備輸入數(shù)據(jù)拦惋。準(zhǔn)備好待輸入推理引擎的數(shù)據(jù),首先獲得模型中每個輸入的名稱以及指向該數(shù)據(jù)塊(CPU或GPU上)的指針鸣哀,再根據(jù)名稱將對應(yīng)的數(shù)據(jù)塊拷貝進(jìn)Tensor架忌。飛槳采用Tensor作為輸入/輸出數(shù)據(jù)結(jié)構(gòu),可以減少額外的拷貝我衬,提升推理性能叹放。
  5. 調(diào)用Predictor.Run()執(zhí)行推理饰恕。
  6. 獲取推理輸出。與輸入數(shù)據(jù)類似井仰,根據(jù)輸出名稱將輸出的數(shù)據(jù)(矩陣向量)由Tensor拷貝至(CPU或GPU上)以進(jìn)行后續(xù)的處理埋嵌。

Paddle Serving特點(diǎn)

  • 集成高性能服務(wù)端推理引擎 Paddle Inference 和端側(cè)引擎 Paddle Lite,其他機(jī)器學(xué)習(xí)平臺(Caffe/TensorFlow/ONNX/PyTorch)可通過 x2paddle 工具遷移模型俱恶。
  • 具有高性能 C++ Serving 和高易用 Python Pipeline 兩套框架雹嗦。
    • C++ Serving 基于高性能 bRPC 網(wǎng)絡(luò)框架打造高吞吐、低延遲的推理服務(wù)合是。
    • Python Pipeline 基于 gRPC/gRPC-Gateway 網(wǎng)絡(luò)框架和 Python 語言構(gòu)建高易用了罪、高吞吐推理服務(wù)框架。
  • 支持 HTTP聪全、gRPC泊藕、bRPC 等多種協(xié)議;提供 C++难礼、Python娃圆、Java 語言 SDK。
  • 設(shè)計(jì)并實(shí)現(xiàn)基于有向無環(huán)圖(DAG) 的異步流水線高性能推理框架蛾茉,具有多模型組合讼呢、異步調(diào)度、并發(fā)推理谦炬、動態(tài)批量悦屏、多卡多流推理、請求緩存等特性
  • 適配 x86(Intel) CPU吧寺、ARM CPU窜管、Nvidia GPU、昆侖 XPU稚机、華為昇騰310/910幕帆、海光 DCU、Nvidia Jetson 等多種硬件赖条。
  • 集成 Intel MKLDNN失乾、Nvidia TensorRT 加速庫,以及低精度量化推理纬乍。
  • 提供一套模型安全部署解決方案碱茁,包括加密模型部署、鑒權(quán)校驗(yàn)仿贬、HTTPs 安全網(wǎng)關(guān)纽竣,并在實(shí)際項(xiàng)目中應(yīng)用。
  • 支持云端部署,提供百度云智能云 kubernetes 集群部署 Paddle Serving 蜓氨。
  • 支持大規(guī)模稀疏參數(shù)索引模型分布式部署聋袋,具有多表、多分片穴吹、多副本幽勒、本地高頻 cache 等特性、可單機(jī)或云端部署
  • 支持服務(wù)監(jiān)控港令,提供基于普羅米修斯的性能數(shù)據(jù)統(tǒng)計(jì)及端口訪問啥容。

2)端側(cè)部署

方案 硬件 API 語言 適用場景
Paddle Lite 移動終端、嵌入式終端廣泛硬件 C++顷霹、Python咪惠、Java等 適用于移動端/嵌入式芯片等端側(cè)硬件中的高性能、輕量化部署泼返。

Paddle Lite是飛槳自研的新一代端側(cè)推理推理框架硝逢,支持PaddlePaddle/TensorFlow/Caffe/ONNX模型的推理部署,目前已經(jīng)支持ARM CPU, Mali GPU, Adreno GPU, Huawei NPU等多種硬件绅喉,正在逐步增加X86 CPU, Nvidia GPU 等多款硬件。

Paddle Lite推理流程

  • 獲取模型:
    • 可以直接使用飛槳訓(xùn)練出的模型進(jìn)行部署叫乌;
    • 也可以使用Caffe, TensorFlow或ONNX平臺訓(xùn)練的模型柴罐,但是需要使用X2Paddle工具將其它框架訓(xùn)練的模型轉(zhuǎn)換到Paddle格式。
  • (可選) 模型壓縮:主要優(yōu)化模型大小憨奸,借助PaddleSlim提供的剪枝革屠、量化等手段降低模型大小,以便在端上使用排宰。
  • 通過Model Optimize Tool將模型轉(zhuǎn)換為Paddle lite的nb模型似芝,然后開始部署。
  • 在終端上通過調(diào)用Paddle Lite提供的API接口(提供C++板甘、Java党瓮、Python等API接口),完成推理相關(guān)的所有計(jì)算盐类。


Paddle Lite支持的模型

類別 類別細(xì)分 模型 支持平臺
CV 分類 MobileNetV1 ARM寞奸,X86郁岩,NPU耀石,RKNPU疏叨,APU
CV 分類 MobileNetV2 ARM寡喝,X86踊沸,NPU
CV 分類 ResNet18 ARM干像,NPU
CV 分類 ResNet50 ARM赖歌,X86构资,NPU,XPU
CV 分類 MnasNet ARM齐帚,NPU
CV 分類 EfficientNet* ARM
CV 分類 SqueezeNet ARM元践,NPU
CV 分類 ShufflenetV2* ARM
CV 分類 ShuffleNet ARM
CV 分類 InceptionV4 ARM,X86童谒,NPU
CV 分類 VGG16 ARM
CV 分類 VGG19 XPU
CV 分類 GoogleNet ARM单旁,X86,XPU
CV 檢測 MobileNet-SSD ARM饥伊,NPU*
CV 檢測 YOLOv3-MobileNetV3 ARM象浑,NPU*
CV 檢測 Faster RCNN ARM
CV 檢測 Mask RCNN* ARM
CV 分割 Deeplabv3 ARM
CV 分割 UNet ARM
CV 人臉 FaceDetection ARM
CV 人臉 FaceBoxes* ARM
CV 人臉 BlazeFace* ARM
CV 人臉 MTCNN ARM
CV OCR OCR-Attention ARM
CV GAN CycleGAN* NPU
NLP 機(jī)器翻譯 Transformer* ARM,NPU*
NLP 機(jī)器翻譯 BERT XPU
NLP 語義表示 ERNIE XPU

二琅豆、安裝PaddlePaddle

飛槳支持的GPU架構(gòu)型號

快速安裝

1.通過pip安裝

# 根據(jù)CUDA版本選擇安裝

# cuda 11.2
python -m pip install paddlepaddle-gpu==2.4.2.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
# CPU
python -m pip install paddlepaddle==2.4.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

2.通過docker安裝

docker hub paddlepaddle/paddle

# 拉取預(yù)安裝 PaddlePaddle 的鏡像
$ sudo docker pull registry.baidubce.com/paddlepaddle/paddle:2.4.2-gpu-cuda11.7-cudnn8.4-trt8.4
# $ sudo docker pull registry.baidubce.com/paddlepaddle/paddle:2.4.2-gpu-cuda11.2-cudnn8.2-trt8.0

# 進(jìn)入Docker容器
$ nvidia-docker run --name paddle -it -v $PWD:/paddle registry.baidubce.com/paddlepaddle/paddle:2.4.2-gpu-cuda11.7-cudnn8.4-trt8.4 /bin/bash

# 測試paddle
$ paddle --version
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
PaddlePaddle 2.4.2.post117, compiled with
    with_avx: ON
    with_gpu: ON
    with_mkl: ON
    with_mkldnn: ON
    with_python: ON

# 容器中安裝paddle2onnx
$ pip install paddle2onnx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
$ paddle2onnx --version
[INFO]  paddle2onnx-1.0.6 with python>=3.6, paddlepaddle>=2.0.0

# 容器中安裝paddleslim
$ pip install paddleslim  -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
$ pip list |grep paddleslim
paddleslim          2.4.1

三愉豺、模型部署SDK FastDeploy

隨著人工智能的發(fā)展,新的算法模型層出不窮茫因,各種AI硬件芯片也不斷涌現(xiàn)蚪拦。在實(shí)際算法落地中,也需要處理不同場景(服務(wù)器部署冻押、服務(wù)化部署驰贷、嵌入式部署、手機(jī)端部署等)洛巢,不同操作系統(tǒng)(Linux括袒、Windows、Android稿茉、iOS等)锹锰,不同編程語言(Python、C++等)漓库。

為了解決AI部署落地難題恃慧,百度發(fā)布了新一代面向產(chǎn)業(yè)實(shí)踐的推理部署工具FastDeploy,它是一款全場景渺蒿、易用靈活痢士、極致高效的AI推理部署工具,支持云端蘸嘶、移動端和邊緣端部署良瞧。

特點(diǎn)

  • 簡單易用

    • 多語言統(tǒng)一部署API
    • 預(yù)置多種熱門模型
    • 多種端到端部署demo
  • 全場景

    • 支持多種推理引擎部署
      • 原生推理庫Paddle Inference、輕量化推理引擎Paddle Lite训唱、前端推理引擎Paddle js褥蚯;
      • TensorRT、OpenVINO况增、ONNX Runtime
      • RKNN Toolkit赞庶、Poros等
    • 多框架支持,實(shí)現(xiàn)模型協(xié)議互轉(zhuǎn)
      • FastDeploy中內(nèi)置了X2Paddle和Paddle2ONNX模型轉(zhuǎn)換工具。
    • 多硬件適配歧强,快速實(shí)現(xiàn)多硬件跨平臺部署
      • 目前與Intel澜薄、NVIDA、瑞芯微摊册、芯原肤京、Graphcore、昆侖芯茅特、飛騰忘分、算能、昇騰等硬件廠商完成了硬件適配白修。
  • 極致高效

    • 軟硬聯(lián)合自動壓縮優(yōu)化妒峦,減少部署資源消耗。
      • 內(nèi)置PaddleSlim模型量化壓縮工具兵睛。
    • 端到端前后預(yù)處理優(yōu)化肯骇,減少部署資源消耗
      • 在CPU上,對預(yù)處理操作進(jìn)行融合祖很,減少數(shù)據(jù)預(yù)處理過程中內(nèi)存創(chuàng)建笛丙、拷貝和計(jì)算量。
      • 在GPU上突琳,引入了CV-CUDA預(yù)處理算子優(yōu)化若债。
      • 在移動端,引入高性能圖像預(yù)處理庫FlyCV拆融,顯著提升圖像數(shù)據(jù)預(yù)處理的性能。

推理后端及能力

1.編譯安裝

https://github.com/PaddlePaddle/FastDeploy/tree/develop/docs/cn/build_and_install

1)python 預(yù)編譯庫安裝

fastdeploy whl包

# 環(huán)境要求
CUDA >= 11.2
cuDNN >= 8.0
python >= 3.6

# gpu版本
pip install numpy opencv-python fastdeploy-gpu-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html
# cpu版本
pip install numpy opencv-python fastdeploy-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html

2)python sdk編譯安裝

# 環(huán)境要求
gcc/g++ >= 5.4(推薦8.2)
cmake >= 3.18.0
python >= 3.6
cuda >= 11.2
cudnn >= 8.2

git clone https://github.com/PaddlePaddle/FastDeploy.git
cd FastDeploy/python
export ENABLE_ORT_BACKEND=ON
export ENABLE_PADDLE_BACKEND=ON
export ENABLE_OPENVINO_BACKEND=ON
export ENABLE_VISION=ON
export ENABLE_TEXT=ON
export ENABLE_TRT_BACKEND=ON
export WITH_GPU=ON
export TRT_DIRECTORY=/Paddle/TensorRT-8.4.1.5
export CUDA_DIRECTORY=/usr/local/cuda
# OPENCV_DIRECTORY可選啊终,不指定會在編譯過程下載FastDeploy預(yù)編譯的OpenCV庫
export OPENCV_DIRECTORY=/usr/lib/x86_64-linux-gnu/cmake/opencv4 \

python setup.py build
python setup.py bdist_wheel

3)c++ 預(yù)編譯庫安裝

# g++ 8.2, CUDA 11.2, cuDNN 8.2編譯產(chǎn)出
$ wget https://bj.bcebos.com/fastdeploy/release/cpp/fastdeploy-linux-x64-gpu-1.0.6.tgz
$ tar -zxvf fastdeploy-linux-x64-gpu-1.0.6.tgz

$ tree -L 3 fastdeploy-linux-x64-gpu-1.0.6
├── FastDeploy.cmake
├── FastDeployConfig.cmake
├── FastDeployCSharp.cmake
├── fastdeploy_init.sh
├── include # 頭文件
│   ├── fastdeploy
│   │   ├── benchmark
│   │   ├── core
│   │   ├── encryption
│   │   │   ├── include
│   │   │   │   ├── decrypt.h
│   │   │   │   ├── encrypt.h
│   │   │   │   └── model_code.h
│   │   │   ├── src
│   │   │   └── util
│   │   ├── encryption.h
│   │   ├── fastdeploy_model.h
│   │   ├── function
│   │   │   ├── cast.h
│   │   │   ├── concat.h
│   │   │   ├── cuda_cast.h
│   │   │   ├── cumprod.h
│   │   │   ├── eigen.h
│   │   │   ├── ....
│   │   │   └── transpose.h
│   │   ├── pipeline
│   │   ├── pipeline.h
│   │   ├── pybind
│   │   ├── runtime
│   │   │   ├── backends
│   │   │   │   ├── backend.h
│   │   │   │   ├── common
│   │   │   │   ├── lite
│   │   │   │   ├── openvino
│   │   │   │   ├── ort
│   │   │   │   ├── paddle
│   │   │   │   ├── poros
│   │   │   │   ├── rknpu2
│   │   │   │   ├── sophgo
│   │   │   │   └── tensorrt
│   │   │   ├── enum_variables.h
│   │   │   ├── runtime.h
│   │   │   └── runtime_option.h
│   │   ├── runtime.h
│   │   ├── text
│   │   ├── text.h
│   │   ├── utils
│   │   ├── vision
│   │   │   ├── classification
│   │   │   ├── common
│   │   │   ├── detection
│   │   │   ├── facealign
│   │   │   ├── facedet
│   │   │   ├── faceid
│   │   │   ├── generation
│   │   │   ├── headpose
│   │   │   ├── keypointdet
│   │   │   ├── matting
│   │   │   ├── ocr
│   │   │   ├── segmentation
│   │   │   ├── sr
│   │   │   ├── tracking
│   │   │   ├── utils
│   │   │   └── visualize
│   │   └── vision.h
│   ├── fastdeploy_capi
│   │   ├── core
│   │   ├── internal
│   │   ├── runtime
│   │   ├── vision
│   │   └── vision.h
│   └── onnx
│       ├── backend
│       ├── bin
│       ├── checker.h
│       ├── common
│       ├── defs
│       ├── examples
│       ├── frontend
│       ├── ......
│       ├── test
│       ├── tools
│       └── version_converter
├── lib # fastdeploy動態(tài)庫【已編譯】
│   ├── libfastdeploy.so -> libfastdeploy.so.1.0.6
│   ├── libfastdeploy.so.1.0.6
│   └── libonnxifi.so
├── lib64
│   ├── cmake
│   │   └── ONNX
│   ├── libonnx.a
│   ├── libonnxifi_dummy.so
│   ├── libonnxifi_loader.a
│   └── libonnx_proto.a
├── LICENSE
├── openmp.cmake
├── summary.cmake
├── third_libs  # 第三方庫依賴【已編譯】
│   └── install
│       ├── fast_tokenizer
│       │   ├── commit.log
│       │   ├── FastTokenizer.cmake
│       │   ├── include
│       │   ├── lib
│       │   └── third_party
│       ├── onnxruntime     # 推理后端
│       │   ├── include
│       │   └── lib
│       ├── opencv
│       │   ├── bin
│       │   ├── include
│       │   ├── lib64
│       │   └── share
│       ├── openvino        # 推理后端
│       │   └── runtime
│       │       ├── 3rdparty
│       │       ├── cmake
│       │       ├── include
│       │       └── lib
│       ├── paddle_inference    # 用于paddle模型的服務(wù)器端推理
│       │   ├── CMakeCache.txt
│       │   ├── paddle
│       │   │   ├── extension.h
│       │   │   ├── include
│       │   │   │   ├── crypto
│       │   │   │   ├── paddle_api.h
│       │   │   │   ├── paddle_inference_api.h
│       │   │   │   ├── ......
│       │   │   └── lib
│       │   │       └── libpaddle_inference.so
│       │   ├── third_party # paddle_inference依賴的第三方庫【已編譯】
│       │   │   ├── externalError
│       │   │   │   └── data
│       │   │   ├── install
│       │   │   │   ├── cryptopp
│       │   │   │   ├── gflags
│       │   │   │   ├── glog
│       │   │   │   ├── mkldnn
│       │   │   │   ├── mklml
│       │   │   │   ├── protobuf
│       │   │   │   ├── utf8proc
│       │   │   │   └── xxhash
│       │   │   └── threadpool
│       │   │       └── ThreadPool.h
│       │   └── version.txt
│       └── tensorrt        # 推理后端
│           └── lib
├── ThirdPartyNotices.txt
├── utils
│   └── gflags.cmake
├── utils.cmake
└── VERSION_NUMBER

4)c++ sdk編譯安裝

# 前置依賴
- gcc/g++ >= 5.4(推薦8.2)
- cmake >= 3.18.0
- cuda >= 11.2
- cudnn >= 8.2

sudo apt-get install libopencv-dev

git clone https://github.com/PaddlePaddle/FastDeploy.git
cd FastDeploy
mkdir build && cd build
cmake .. -DENABLE_ORT_BACKEND=ON \
         -DENABLE_PADDLE_BACKEND=ON \
         -DENABLE_OPENVINO_BACKEND=ON \
         -DENABLE_TRT_BACKEND=ON \
         -DWITH_GPU=ON \
         -DTRT_DIRECTORY=/Paddle/TensorRT-8.4.1.5 \
         -DCUDA_DIRECTORY=/usr/local/cuda \
         -DCMAKE_INSTALL_PREFIX=${PWD}/compiled_fastdeploy_sdk \
         -DENABLE_VISION=ON \
         -DOPENCV_DIRECTORY=/usr/lib/x86_64-linux-gnu/cmake/opencv4 \
         -DENABLE_TEXT=ON
make -j12
make install

# Run cpack to generate a .deb package 【可選】
cpack -G DEB
# Install .deb package
dpkg -i xxx.deb

5)編譯選項(xiàng)說明

選項(xiàng) 說明
ENABLE_ORT_BACKEND 默認(rèn)OFF, 是否編譯集成ONNX Runtime后端(CPU/GPU上推薦打開)
ENABLE_PADDLE_BACKEND 默認(rèn)OFF镜豹,是否編譯集成Paddle Inference后端(CPU/GPU上推薦打開)
ENABLE_LITE_BACKEND 默認(rèn)OFF,是否編譯集成Paddle Lite后端(編譯Android庫時需要設(shè)置為ON)
ENABLE_RKNPU2_BACKEND 默認(rèn)OFF蓝牲,是否編譯集成RKNPU2后端(RK3588/RK3568/RK3566上推薦打開)
ENABLE_SOPHGO_BACKEND 默認(rèn)OFF趟脂,是否編譯集成SOPHGO后端, 當(dāng)在SOPHGO TPU上部署時,需要設(shè)置為ON
WITH_ASCEND 默認(rèn)OFF例衍,當(dāng)在華為昇騰NPU上部署時, 需要設(shè)置為ON
WITH_KUNLUNXIN 默認(rèn)OFF昔期,當(dāng)在昆侖芯XPU上部署時,需設(shè)置為ON
WITH_TIMVX 默認(rèn)OFF佛玄,需要在RV1126/RV1109/A311D上部署時硼一,需設(shè)置為ON
ENABLE_TRT_BACKEND 默認(rèn)OFF,是否編譯集成TensorRT后端(GPU上推薦打開)
ENABLE_OPENVINO_BACKEND 默認(rèn)OFF梦抢,是否編譯集成OpenVINO后端(CPU上推薦打開)
ENABLE_VISION 默認(rèn)OFF般贼,是否編譯集成視覺模型的部署模塊
ENABLE_TEXT 默認(rèn)OFF,是否編譯集成文本NLP模型的部署模塊
WITH_GPU 默認(rèn)OFF, 當(dāng)需要在GPU上部署時,需設(shè)置為ON
RKNN2_TARGET_SOC ENABLE_RKNPU2_BACKEND時才需要使用這個編譯選項(xiàng)哼蛆。無默認(rèn)值, 可輸入值為RK3588/RK356X, 必須填入蕊梧,否則 將編譯失敗
CUDA_DIRECTORY 默認(rèn)/usr/local/cuda, 當(dāng)需要在GPU上部署時,用于指定CUDA(>=11.2)的路徑
TRT_DIRECTORY 當(dāng)開啟TensorRT后端時腮介,必須通過此開關(guān)指定TensorRT(>=8.4)的路徑
ORT_DIRECTORY 當(dāng)開啟ONNX Runtime后端時肥矢,用于指定用戶本地的ONNX Runtime庫路徑;如果不指定叠洗,編譯過程會自動下載ONNX Runtime庫
OPENCV_DIRECTORY 當(dāng)ENABLE_VISION=ON時甘改,用于指定用戶本地的OpenCV庫路徑;如果不指定惕味,編譯過程會自動下載OpenCV庫
OPENVINO_DIRECTORY 當(dāng)開啟OpenVINO后端時, 用于指定用戶本地的OpenVINO庫路徑楼誓;如果不指定,編譯過程會自動下載OpenVINO庫

2.Python SDK使用

1)常用Python API

Python API文檔

# fastdeploy.RuntimeOption API 后端配置
    set_model_path
    
    use_ascend
    use_cpu
        set_cpu_thread_num
    use_gpu
    
    use_paddle_infer_backend
    use_openvino_backend
    use_ort_backend
    use_trt_backend                 # Use TensorRT inference
        enable_trt_fp16
        enable_paddle_to_trt    # Use Paddle-TensorRT inference
        set_trt_cache_file      # 通過加載保存的緩存名挥,可以快速完成模型加載初始化疟羹。

# fastdeploy.Runtime API 多后端推理引擎API
    get_input_info
    get_output_info
    num_inputs
    num_outputs
    infer
    
# Vision Processor (圖像預(yù)處理庫) 
    fastdeploy.vision.common.processors.ResizeByShort
    fastdeploy.vision.common.processors.Resize
    fastdeploy.vision.common.processors.CenterCrop
    fastdeploy.vision.common.processors.Cast
    fastdeploy.vision.common.processors.HWC2CHW
    fastdeploy.vision.common.processors.Normalize
    fastdeploy.vision.common.processors.NormalizeAndPermute
    fastdeploy.vision.common.processors.Pad
    fastdeploy.vision.common.processors.PadToSize
    fastdeploy.vision.common.processors.StridePad

# fastdeploy vision Model API  視覺任務(wù)模型API
    fastdeploy.vision.detection.PPYOLOE
    fastdeploy.vision.detection.YOLOv5
        preprocessor
        predict
        batch_predict
        postprocessor

2)Python 推理后端使用

Runtime Python使用示例

Deploy Paddle model with Paddle Inference(CPU/GPU)、TensorRT(GPU)禀倔、OpenVINO(CPU)榄融、ONNX Runtime(CPU/GPU)

Deploy ONNX model with TensorRT(GPU)、OpenVINO(CPU)救湖、ONNX Runtime(CPU/GPU)

示例1:

# Deploy Paddle model with Paddle Inference(CPU/GPU)
import fastdeploy as fd
import numpy as np

# 下載模型并解壓
model_url = "https://bj.bcebos.com/fastdeploy/models/mobilenetv2.tgz"
fd.download_and_decompress(model_url)

option = fd.RuntimeOption()
option.set_model_path("mobilenetv2/inference.pdmodel",
                      "mobilenetv2/inference.pdiparams")
# **** CPU 配置 ****
option.use_cpu()
option.use_paddle_infer_backend()
option.set_cpu_thread_num(12)
# **** GPU 配置 ***
# 如需使用GPU愧杯,使用如下注釋代碼
# option.use_gpu(0)
# **** IPU 配置 ***
# 如需使用IPU,使用如下注釋代碼
# option.use_ipu()

# 初始化構(gòu)造runtime
runtime = fd.Runtime(option)
# 獲取模型輸入名
input_name = runtime.get_input_info(0).name

# 構(gòu)造隨機(jī)數(shù)據(jù)進(jìn)行推理
results = runtime.infer({
    input_name: np.random.rand(1, 3, 224, 224).astype("float32")
})
print(results[0].shape)

示例2:

#   Deploy ONNX model with TensorRT(GPU)
import fastdeploy as fd
from fastdeploy import ModelFormat
import numpy as np

# 下載模型并解壓
model_url = "https://bj.bcebos.com/fastdeploy/models/mobilenetv2.onnx"
fd.download(model_url, path=".")

option = fd.RuntimeOption()
option.set_model_path("mobilenetv2.onnx", model_format=ModelFormat.ONNX)
# **** GPU 配置 ***
option.use_gpu(0)
option.use_trt_backend()

# 初始化構(gòu)造runtime
runtime = fd.Runtime(option)
# 獲取模型輸入名
input_name = runtime.get_input_info(0).name

# 構(gòu)造隨機(jī)數(shù)據(jù)進(jìn)行推理
results = runtime.infer({
    input_name: np.random.rand(1, 3, 224, 224).astype("float32")
})
print(results[0].shape)

3)使用預(yù)置視覺網(wǎng)絡(luò)推理

FastDeploy/examples/vision

示例1:yolov5

import fastdeploy as fd
import cv2

# 配置runtime鞋既,加載模型
option = fd.RuntimeOption()
option.use_trt_backend()
option.set_trt_input_shape("images", [1, 3, 640, 640])
model = fd.vision.detection.YOLOv5(
    "yolov5-model.pdmodel",
    "yolov5-model.pdiparams",
    runtime_option=option,
    model_format=fd.ModelFormat.PADDLE)

# 預(yù)測圖片檢測結(jié)果
im = cv2.imread(image)
result = model.predict(im)
print(result)

# 預(yù)測結(jié)果可視化
vis_im = fd.vision.vis_detection(im, result)
cv2.imwrite("visualized_result.jpg", vis_im)

3.C++ SDK使用

1)C++ API

C++ API文檔

2)C++ 推理后端使用

Runtime C++使用示例

示例1:Deploy Paddle model with Paddle Inference(CPU/GPU)

#include "fastdeploy/runtime.h"
#include <cassert>

namespace fd = fastdeploy;

int main(int argc, char* argv[]) {
  // Download from https://bj.bcebos.com/paddle2onnx/model_zoo/pplcnet.tar.gz
  std::string model_file = "pplcnet/inference.pdmodel";
  std::string params_file = "pplcnet/inference.pdiparams";

  // configure runtime
  // How to configure by RuntimeOption, refer its api doc for more information
  // https://baidu-paddle.github.io/fastdeploy-api/cpp/html/structfastdeploy_1_1RuntimeOption.html
  fd::RuntimeOption runtime_option;
  runtime_option.SetModelPath(model_file, params_file);
  runtime_option.UseCpu();
 
  // If need to configure Paddle Inference backend for more option, we can configure runtime_option.paddle_infer_option
  // refer https://baidu-paddle.github.io/fastdeploy-api/cpp/html/structfastdeploy_1_1PaddleBackendOption.html
  runtime_option.paddle_infer_option.enable_mkldnn = true;

  fd::Runtime runtime;
  assert(runtime.Init(runtime_option));

  // Get model's inputs information
  // API doc refer https://baidu-paddle.github.io/fastdeploy-api/cpp/html/structfastdeploy_1_1Runtime.html
  std::vector<fd::TensorInfo> inputs_info = runtime.GetInputInfos();

  // Create dummy data fill with 0.5
  std::vector<float> dummy_data(1 * 3 * 224 * 224, 0.5);

  // Create inputs/outputs tensors
  std::vector<fd::FDTensor> inputs(inputs_info.size());
  std::vector<fd::FDTensor> outputs;

  // Initialize input tensors
  // API doc refer https://baidu-paddle.github.io/fastdeploy-api/cpp/html/structfastdeploy_1_1FDTensor.html
  inputs[0].SetData({1, 3, 224, 224}, fd::FDDataType::FP32, dummy_data.data());
  inputs[0].name = inputs_info[0].name;

  // Inference
  assert(runtime.Infer(inputs, &outputs));
 
  // Print debug information of outputs 
  outputs[0].PrintInfo();

  // Get data pointer and print it's elements
  const float* data_ptr = reinterpret_cast<const float*>(outputs[0].GetData());
  for (size_t i = 0; i < 10 && i < outputs[0].Numel(); ++i) {
    std::cout << data_ptr[i] << " ";
  }
  std::cout << std::endl;
  return 0;
}

示例2:

#include "fastdeploy/runtime.h"
#include <cassert>

namespace fd = fastdeploy;

int main(int argc, char* argv[]) {
  // Download from https://bj.bcebos.com/paddle2onnx/model_zoo/pplcnet.onnx
  std::string model_file = "pplcnet.onnx";

  // configure runtime
  // How to configure by RuntimeOption, refer its api doc for more information
  // https://baidu-paddle.github.io/fastdeploy-api/cpp/html/structfastdeploy_1_1RuntimeOption.html
  fd::RuntimeOption runtime_option;
  runtime_option.SetModelPath(model_file, "", fd::ModelFormat::ONNX);
  runtime_option.UseTrtBackend();
  
  // Use NVIDIA GPU to inference
  // If need to configure TensorRT backend for more option, we can configure runtime_option.trt_option
  // refer https://baidu-paddle.github.io/fastdeploy-api/cpp/html/structfastdeploy_1_1TrtBackendOption.html
  runtime_option.UseGpu(0);
  // Use float16 inference to improve performance
  runtime_option.trt_option.enable_fp16 = true;
  // Cache trt engine to reduce time cost in model initialize
  runtime_option.trt_option.serialize_file = "./model.trt";

  fd::Runtime runtime;
  assert(runtime.Init(runtime_option));

  // Get model's inputs information
  // API doc refer https://baidu-paddle.github.io/fastdeploy-api/cpp/html/structfastdeploy_1_1Runtime.html
  std::vector<fd::TensorInfo> inputs_info = runtime.GetInputInfos();

  // Create dummy data fill with 0.5
  std::vector<float> dummy_data(1 * 3 * 224 * 224, 0.5);

  // Create inputs/outputs tensors
  std::vector<fd::FDTensor> inputs(inputs_info.size());
  std::vector<fd::FDTensor> outputs;

  // Initialize input tensors
  // API doc refer https://baidu-paddle.github.io/fastdeploy-api/cpp/html/structfastdeploy_1_1FDTensor.html
  inputs[0].SetData({1, 3, 224, 224}, fd::FDDataType::FP32, dummy_data.data());
  inputs[0].name = inputs_info[0].name;

  // Inference
  assert(runtime.Infer(inputs, &outputs));
 
  // Print debug information of outputs 
  outputs[0].PrintInfo();

  // Get data pointer and print it's elements
  const float* data_ptr = reinterpret_cast<const float*>(outputs[0].GetData());
  for (size_t i = 0; i < 10 && i < outputs[0].Numel(); ++i) {
    std::cout << data_ptr[i] << " ";
  }
  std::cout << std::endl;
  return 0;
}

3)使用預(yù)置視覺網(wǎng)絡(luò)推理

FastDeploy/examples/vision

示例1:yolov5 使用onnx模型

#include "fastdeploy/vision.h"

// onnxruntime cpu
void CpuInfer(const std::string& model_file, const std::string& image_file) {
  auto model = fastdeploy::vision::detection::YOLOv5(model_file);
  if (!model.Initialized()) {
    std::cerr << "Failed to initialize." << std::endl;
    return;
  }

  auto im = cv::imread(image_file);

  fastdeploy::vision::DetectionResult res;
  if (!model.Predict(&im, &res)) {
    std::cerr << "Failed to predict." << std::endl;
    return;
  }
  std::cout << res.Str() << std::endl;

  auto vis_im = fastdeploy::vision::VisDetection(im, res);
  cv::imwrite("vis_result.jpg", vis_im);
  std::cout << "Visualized result saved in ./vis_result.jpg" << std::endl;
}

// onnxruntime gpu
void GpuInfer(const std::string& model_file, const std::string& image_file) {
  auto option = fastdeploy::RuntimeOption();
  option.UseGpu();
  auto model = fastdeploy::vision::detection::YOLOv5(model_file, "", option);
  if (!model.Initialized()) {
    std::cerr << "Failed to initialize." << std::endl;
    return;
  }

  auto im = cv::imread(image_file);

  fastdeploy::vision::DetectionResult res;
  if (!model.Predict(&im, &res)) {
    std::cerr << "Failed to predict." << std::endl;
    return;
  }
  std::cout << res.Str() << std::endl;

  auto vis_im = fastdeploy::vision::VisDetection(im, res);
  cv::imwrite("vis_result.jpg", vis_im);
  std::cout << "Visualized result saved in ./vis_result.jpg" << std::endl;
}

void TrtInfer(const std::string& model_file, const std::string& image_file) {
  auto option = fastdeploy::RuntimeOption();
  option.UseGpu();
  option.UseTrtBackend();
  option.SetTrtInputShape("images", {1, 3, 640, 640});
  auto model = fastdeploy::vision::detection::YOLOv5(model_file, "", option);
  if (!model.Initialized()) {
    std::cerr << "Failed to initialize." << std::endl;
    return;
  }

  auto im = cv::imread(image_file);

  fastdeploy::vision::DetectionResult res;
  if (!model.Predict(&im, &res)) {
    std::cerr << "Failed to predict." << std::endl;
    return;
  }
  std::cout << res.Str() << std::endl;

  auto vis_im = fastdeploy::vision::VisDetection(im, res);
  cv::imwrite("vis_result.jpg", vis_im);
  std::cout << "Visualized result saved in ./vis_result.jpg" << std::endl;
}

int main(int argc, char* argv[]) {
  if (std::atoi(argv[3]) == 0) {
    CpuInfer(argv[1], argv[2]);
  } else if (std::atoi(argv[3]) == 1) {
    GpuInfer(argv[1], argv[2]);
  } else if (std::atoi(argv[3]) == 2) {
    TrtInfer(argv[1], argv[2]);
  }
  return 0;
}

4.FastDeploy 工具包

一鍵安裝

# 通過pip安裝fastdeploy-tools. 此工具包目前支持模型一鍵自動化壓縮和模型轉(zhuǎn)換的功能.
pip install fastdeploy-tools==0.0.1
  • FastDeploy的python包已包含此工具力九,不需重復(fù)安裝.

1)模型壓縮工具PaddleSlim

https://github.com/PaddlePaddle/PaddleSlim

PaddleSlim是一個專注于深度學(xué)習(xí)模型壓縮的工具庫,提供低比特量化邑闺、知識蒸餾跌前、稀疏化和模型結(jié)構(gòu)搜索等模型壓縮策略,幫助開發(fā)者快速實(shí)現(xiàn)模型的小型化陡舅。

python -m pip install paddlepaddle-gpu==2.4.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html

pip install paddleslim
  • 版本對齊:

    PaddleSlim PaddlePaddle PaddleLite
    2.0.0 2.0 2.8
    2.1.0 2.1.0 2.8
    2.1.1 2.1.1 >=2.8
    2.3.0 2.3.0 >=2.11
    2.4.0 2.4.0 >=2.11
    develop develop >=2.11

自動化壓縮

相比于傳統(tǒng)手工壓縮抵乓,自動化壓縮的“自動”主要體現(xiàn)在4個方面:解耦訓(xùn)練代碼、離線量化超參搜索靶衍、策略自動組合灾炭、硬件感知 (硬件延時預(yù)估)。

# 導(dǎo)入依賴包
import paddle
from PIL import Image
from paddle.vision.datasets import DatasetFolder
from paddle.vision.transforms import transforms
from paddleslim.auto_compression import AutoCompression
paddle.enable_static()
# 定義DataSet
class ImageNetDataset(DatasetFolder):
    def __init__(self, path, image_size=224):
        super(ImageNetDataset, self).__init__(path)
        normalize = transforms.Normalize(
            mean=[123.675, 116.28, 103.53], std=[58.395, 57.120, 57.375])
        self.transform = transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(image_size), transforms.Transpose(),
            normalize
        ])

    def __getitem__(self, idx):
        img_path, _ = self.samples[idx]
        return self.transform(Image.open(img_path).convert('RGB'))

    def __len__(self):
        return len(self.samples)

# 定義DataLoader
train_dataset = ImageNetDataset("./ILSVRC2012_data_demo/ILSVRC2012/train/")
image = paddle.static.data(
    name='inputs', shape=[None] + [3, 224, 224], dtype='float32')
train_loader = paddle.io.DataLoader(train_dataset, feed_list=[image], batch_size=32, return_list=False)
# 開始自動壓縮
ac = AutoCompression(
    model_dir="./MobileNetV1_infer",
    model_filename="inference.pdmodel",
    params_filename="inference.pdiparams",
    save_dir="MobileNetV1_quant",
    config={"QuantPost": {}, "HyperParameterOptimization": {'ptq_algo': ['avg'], 'max_quant_count': 3}},
    ### config={"QuantAware": {}, "Distillation": {}}, ### 如果您的系統(tǒng)為Windows系統(tǒng), 請使用當(dāng)前這一行配置
    train_dataloader=train_loader,
    eval_dataloader=train_loader)
ac.compress()

量化過程劃分:

  • 權(quán)重量化:對網(wǎng)絡(luò)中的權(quán)重執(zhí)行量化操作颅眶◎诔觯可以選擇逐層(layer-wise)或者逐通道(channel-wise)的量化粒度,也就是說每層或者每個通道選取一個量化scale帚呼。在PaddleSlim中所有權(quán)重量化都采用abs_max或者channel_wise_abs_max的方法掏缎。
  • 激活量化:即對網(wǎng)絡(luò)中不含權(quán)重的激活類OP進(jìn)行量化皱蹦。一般只能采用逐層(layer-wise)的量化粒度。在PaddleSlim的中默認(rèn)采用moving_average_abs_max的采樣策略眷蜈。

量化方式:

  • 靜態(tài)離線量化

    基于采樣數(shù)據(jù)沪哺,離線的使用KL散度、MSE等方法計(jì)算量化比例因子的方法酌儒。

    • 加載預(yù)訓(xùn)練的FP32模型辜妓,配置用于校準(zhǔn)的DataLoader;
    • 讀取小批量樣本數(shù)據(jù)忌怎,執(zhí)行模型的前向推理籍滴,保存更新待量化op的量化Scale等信息;
    • 將FP32模型轉(zhuǎn)成INT8模型榴啸,進(jìn)行保存孽惰。
  • 在線量化訓(xùn)練

    在模型訓(xùn)練前需要先對網(wǎng)絡(luò)計(jì)算圖進(jìn)行處理,先在需要量化的算子前插入量化-反量化節(jié)點(diǎn)鸥印,再經(jīng)過訓(xùn)練勋功,產(chǎn)出模擬量化的模型。

    • 構(gòu)建模型和數(shù)據(jù)集
    • 進(jìn)行浮點(diǎn)模型的訓(xùn)練
    • 加載預(yù)訓(xùn)練模型库说,進(jìn)行量化訓(xùn)練微調(diào)
    • 導(dǎo)出量化預(yù)測模型
  • 動態(tài)離線量化

    將模型中特定OP的權(quán)重從FP32類型量化成INT8等類型狂鞋,該方式的量化有兩種預(yù)測方式:

    • 第一種是反量化預(yù)測方式(Paddle Lite支持),即是首先將INT8/16類型的權(quán)重反量化成FP32類型潜的,然后再使用FP32浮運(yùn)算運(yùn)算進(jìn)行預(yù)測骚揍;
    • 第二種量化預(yù)測方式,即是預(yù)測中動態(tài)計(jì)算量化OP輸入的量化信息啰挪,基于量化的輸入和權(quán)重進(jìn)行INT8整形運(yùn)算信不。

2)模型轉(zhuǎn)換工具X2Paddle

https://github.com/PaddlePaddle/X2Paddle

X2Paddle用于將其它深度學(xué)習(xí)框架的模型遷移至飛槳框架。目前支持推理模型的框架轉(zhuǎn)換PyTorch訓(xùn)練代碼遷移亡呵。

  • 目前X2Paddle支持130+ PyTorch OP浑塞,90+ ONNX OP,90+ TensorFlow OP 以及 30+ Caffe OP政己,詳見 支持列表
# 環(huán)境依賴
python >= 3.5
paddlepaddle >= 2.2.2
tensorflow == 1.14 (如需轉(zhuǎn)換TensorFlow模型)
onnx >= 1.6.0 (如需轉(zhuǎn)換ONNX模型)
torch >= 1.5.0 (如需轉(zhuǎn)換PyTorch模型)
paddlelite >= 2.9.0 (如需一鍵轉(zhuǎn)換成Paddle-Lite支持格式,推薦最新版本)

# 安裝
pip install x2paddle

PyTorch模型轉(zhuǎn)換

from x2paddle.convert import pytorch2paddle
pytorch2paddle(module=torch_module,
               save_dir="./pd_model",
               jit_type="trace",
               input_examples=[torch_input])
# module (torch.nn.Module): PyTorch的Module掏愁。
# save_dir (str): 轉(zhuǎn)換后模型的保存路徑歇由。
# jit_type (str): 轉(zhuǎn)換方式。默認(rèn)為"trace"果港。
# input_examples (list[torch.tensor]): torch.nn.Module的輸入示例沦泌,list的長度必須與輸入的長度一致。默認(rèn)為None辛掠。

ONNX模型轉(zhuǎn)換

x2paddle --framework=onnx \
        --model=onnx_model.onnx \
        --save_dir=pd_model

3)模型轉(zhuǎn)換工具Paddle2ONNX

https://github.com/PaddlePaddle/Paddle2ONNX

Paddle2ONNX 支持將 PaddlePaddle 模型格式轉(zhuǎn)化到 ONNX 模型格式谢谦。

# 安裝
pip install paddle2onnx

# 命令行使用
paddle2onnx --model_dir saved_inference_model \
            --model_filename model.pdmodel \
            --params_filename model.pdiparams \
            --save_file model.onnx \
            --enable_dev_version True \
            --opset_version 11 \
            --enable_onnx_checker True

參數(shù)選項(xiàng)

參數(shù) 參數(shù)說明
--model_dir 配置包含 Paddle 模型的目錄路徑
--model_filename [可選] 配置位于 --model_dir 下存儲網(wǎng)絡(luò)結(jié)構(gòu)的文件名
--params_filename [可選] 配置位于 --model_dir 下存儲模型參數(shù)的文件名稱
--save_file 指定轉(zhuǎn)換后的模型保存目錄路徑
--opset_version [可選] 配置轉(zhuǎn)換為 ONNX 的 OpSet 版本释牺,目前支持 7~16 等多個版本,默認(rèn)為 9
--enable_dev_version [可選] 是否使用新版本 Paddle2ONNX(推薦使用)回挽,默認(rèn)為 True
--enable_onnx_checker [可選] 配置是否檢查導(dǎo)出為 ONNX 模型的正確性, 建議打開此開關(guān)没咙, 默認(rèn)為 False
--enable_auto_update_opset [可選] 是否開啟 opset version 自動升級功能,當(dāng)?shù)桶姹?opset 無法轉(zhuǎn)換時千劈,自動選擇更高版本的 opset進(jìn)行轉(zhuǎn)換祭刚, 默認(rèn)為 True
--deploy_backend [可選] 量化模型部署的推理引擎,支持 onnxruntime墙牌、tensorrt 或 others涡驮,當(dāng)選擇 others 時,所有的量化信息存儲于 max_range.txt 文件中喜滨,默認(rèn)為 onnxruntime
--save_calibration_file [可選] TensorRT 8.X版本部署量化模型需要讀取的 cache 文件的保存路徑捉捅,默認(rèn)為 calibration.cache
--version [可選] 查看 paddle2onnx 版本
--external_filename [可選] 當(dāng)導(dǎo)出的 ONNX 模型大于 2G 時,需要設(shè)置 external data 的存儲路徑虽风,推薦設(shè)置為:external_data
--export_fp16_model [可選] 是否將導(dǎo)出的 ONNX 的模型轉(zhuǎn)換為 FP16 格式棒口,并用 ONNXRuntime-GPU 加速推理,默認(rèn)為 False
--custom_ops [可選] 將 Paddle OP 導(dǎo)出為 ONNX 的 Custom OP焰情,例如:--custom_ops '{"paddle_op":"onnx_op"}陌凳,默認(rèn)為 {}

Paddle 訓(xùn)練模型導(dǎo)出為 ONNX

import paddle

# export to ONNX
save_path = 'onnx.save/lenet' # 需要保存的路徑
# 調(diào)用 paddle.static.InputSpec API 指定輸入的 shape,如果輸入中某一維為動態(tài)的内舟,可以將該維指定為 None
x_spec = paddle.static.InputSpec([None, 1, 28, 28], 'float32', 'x') 
# 調(diào)用 paddle.onnx.export 接口合敦,在指定的路徑下生成 ONNX 模型。
paddle.onnx.export(model, save_path, input_spec=[x_spec], opset_version=11)

驗(yàn)證 ONNX 模型

# 導(dǎo)入 ONNX 庫
import onnx
# 載入 ONNX 模型
onnx_model = onnx.load("model.onnx")
# 使用 ONNX 庫檢查 ONNX 模型是否合理
check = onnx.checker.check_model(onnx_model)
# 打印檢查結(jié)果
print('check: ', check)


# 隨機(jī)生成輸入验游,用于驗(yàn)證 Paddle 和 ONNX 的推理結(jié)果是否一致
x = np.random.random((1, 3, 224, 224)).astype('float32')

# predict by ONNXRuntime
ort_sess = onnxruntime.InferenceSession("model.onnx")
ort_inputs = {ort_sess.get_inputs()[0].name: x}
ort_outs = ort_sess.run(None, ort_inputs)

四充岛、精品模型部署

1.PP-YOLOE+

PP-YOLOE是基于PP-YOLOv2的卓越的單階段Anchor-free模型,超越了多種流行的YOLO模型耕蝉。PP-YOLOE+是PP-YOLOE的升級版本崔梗,從大規(guī)模的obj365目標(biāo)檢測預(yù)訓(xùn)練模型入手,在大幅提升收斂速度的同時垒在,提升了模型在COCO數(shù)據(jù)集上的速度蒜魄。同時,PP-YOLOE+大幅提升了包括數(shù)據(jù)預(yù)處理在內(nèi)的端到端的預(yù)測速度场躯。

  • 尺寸多樣:PP-YOLOE根據(jù)不同應(yīng)用場景設(shè)計(jì)了s/m/l/x谈为,4個尺寸的模型來支持不同算力水平的硬件,無論是哪個尺寸踢关,精度-速度的平衡都超越當(dāng)前所有同等計(jì)算量下的YOLO模型伞鲫!可以通過width multiplier和depth multiplier配置。
  • 性能卓越:PP-YOLOE-l在COCO test-dev上以精度51.4%签舞,TRT FP16推理速度149 FPS的優(yōu)異數(shù)據(jù)秕脓,相較YOLOX柒瓣,精度提升1.3%,加速25%吠架;相較YOLOv5芙贫,精度提升0.7%,加速26.8%诵肛。訓(xùn)練速度較PP-YOLOv2提高33%屹培,降低模型訓(xùn)練成本。
  • 部署友好:PP-YOLOE在結(jié)構(gòu)設(shè)計(jì)上避免使用如deformable convolution或者matrix NMS之類的特殊算子怔檩,使其能輕松適配更多硬件褪秀。當(dāng)前已經(jīng)完備支持NVIDIA V100、T4這樣的云端GPU架構(gòu)以及如Jetson系列等邊緣端GPU和FPGA開發(fā)板薛训。

1)環(huán)境及模型準(zhǔn)備

git clone https://github.com/PaddlePaddle/PaddleDetection.git
cd PaddleDetection
# 安裝PaddleDetection
pip install -r requirements.txt
python setup.py install

# 下載預(yù)訓(xùn)練模型
mkdir -p models/PP-YOLOE+_s && cd models/PP-YOLOE+_s
wget https://paddledet.bj.bcebos.com/models/ppyoloe_plus_crn_s_80e_coco.pdparams 
wget https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.6/configs/ppyoloe/ppyoloe_plus_crn_s_80e_coco.yml
cd -

2)paddle源模型推理

# 推理單張圖片
$ CUDA_VISIBLE_DEVICES=0 python tools/infer.py \
        -c configs/ppyoloe/ppyoloe_plus_crn_s_80e_coco.yml \
        -o weights=models/PP-YOLOE+_s/ppyoloe_plus_crn_s_80e_coco.pdparams \
        --infer_img=demo/000000014439_640x640.jpg

Detection bbox results save in output/000000014439_640x640.jpg

3)paddle模型轉(zhuǎn)onnx

由于tensorrt轉(zhuǎn)換時不支持nms相關(guān)算子媒吗,建議設(shè)置exclude_post_process為True,然后自行實(shí)現(xiàn)后處理(參考yolov8)乙埃。

# 模型微調(diào)闸英,不包含nms,其會在tensorrt轉(zhuǎn)換時因缺少TopK算子而報(bào)錯
$ python tools/export_model.py -c configs/ppyoloe/ppyoloe_plus_crn_s_80e_coco.yml \
        -o weights=models/PP-YOLOE+_s/ppyoloe_plus_crn_s_80e_coco.pdparams \
        exclude_post_process=True trt=True

# 默認(rèn)輸出到output_inference
$ ls output_inference/ppyoloe_plus_crn_s_80e_coco/
infer_cfg.yml  model.pdiparams  model.pdiparams.info  model.pdmodel

# 轉(zhuǎn)化成ONNX格式
$ paddle2onnx --model_dir output_inference/ppyoloe_plus_crn_s_80e_coco \
        --model_filename model.pdmodel \
        --params_filename model.pdiparams \
        --opset_version 11 \
        --enable_onnx_checker True \
        --save_file ppyoloe_plus_crn_s_80e_coco.onnx
  • export_model.py特殊參數(shù)說明

    參考PaddleDetection/ppdet/modeling/heads/ppyoloe_head.py文件介袜,可知有以下參數(shù)甫何。

    class PPYOLOEHead(nn.Layer):
        __shared__ = [
            'num_classes', 'eval_size', 'trt', 'exclude_nms',
            'exclude_post_process', 'use_shared_conv', 'for_distill'
        ]
        def __init__(self,
                     in_channels=[1024, 512, 256],
                     num_classes=80,
                     act='swish',
                     fpn_strides=(32, 16, 8),
                     grid_cell_scale=5.0,
                     grid_cell_offset=0.5,
                     reg_max=16,
                     reg_range=None,
                     static_assigner_epoch=4,
                     use_varifocal_loss=True,
                     static_assigner='ATSSAssigner',
                     assigner='TaskAlignedAssigner',
                     nms='MultiClassNMS',
                     eval_size=None,
                     loss_weight={
                         'class': 1.0,
                         'iou': 2.5,
                         'dfl': 0.5,
                     },
                     trt=False,
                     attn_conv='convbn',
                     exclude_nms=False,
                     exclude_post_process=False,
                     use_shared_conv=True,
                     for_distill=False):
    
    • MultiClassNMS算子說明

      該算子在Paddle2ONNX中實(shí)現(xiàn)。

  • infer_cfg.yml 配置文件說明

    mode: paddle
    draw_threshold: 0.5
    metric: COCO
    use_dynamic_shape: false
    arch: YOLO
    min_subgraph_size: 3
    Preprocess:       # 前處理參數(shù)
    - interp: 2
      keep_ratio: false
      target_size:
      - 640
      - 640
      type: Resize
    - mean:
      - 0.0
      - 0.0
      - 0.0
      norm_type: none
      std:
      - 1.0
      - 1.0
      - 1.0
      type: NormalizeImage
    - type: Permute
    label_list:       # 標(biāo)簽列表
    - person
    - bicycle
    - car
    - ......
    
  • onnx模型輸入輸出說明

    inputs:

    1. image: float32 [1, 3, 640, 640]遇伞, 輸入的預(yù)處理后的圖像數(shù)據(jù)
    2. scale_factor: float32 [1, 2]辙喂,width和height在預(yù)處理中被縮放的系數(shù)(當(dāng)exclude_post_process為True時不輸出)

    outputs參考代碼

    def post_process(self, head_outs, scale_factor):
        pred_scores, pred_dist, anchor_points, stride_tensor = head_outs
        pred_bboxes = batch_distance2bbox(anchor_points, pred_dist)
        pred_bboxes *= stride_tensor
        if self.exclude_post_process:
            return paddle.concat(
                [pred_bboxes, pred_scores.transpose([0, 2, 1])],
                axis=-1), None, None
        else:
            # scale bbox to origin
            scale_y, scale_x = paddle.split(scale_factor, 2, axis=-1)
            scale_factor = paddle.concat(
                [scale_x, scale_y, scale_x, scale_y],
                axis=-1).reshape([-1, 1, 4])
            pred_bboxes /= scale_factor
            if self.exclude_nms:
                # `exclude_nms=True` just use in benchmark
                return pred_bboxes, pred_scores, None
            else:
                bbox_pred, bbox_num, nms_keep_idx = self.nms(pred_bboxes, pred_scores)
                return bbox_pred, bbox_num, nms_keep_idx
    
    • 當(dāng)exclude_post_process==True時:
      • 輸出: [1, 8400, 84]
    • 當(dāng)exclude_post_process==False,exclude_nms==True時:
      • 輸出1 pred_bboxes:[1, 8400, 4]
      • 輸出2 pred_scores:[1, 80, 8400]
  • issues

    • 執(zhí)行deploy/python/infer.py鸠珠,報(bào)錯 ValueError: (InvalidArgument) Pass preln_embedding_eltwise_layernorm_fuse_pass has not been registered.
      • 檢測paddlepaddle-gpu cuda版本與tensorrt要求版本是否一致巍耗,鏈接

4)onnx轉(zhuǎn)tensorrt

trtexec="/usr/src/tensorrt/bin/trtexec"
$trtexec --onnx=./ppyoloe_plus_crn_s_80e_coco.onnx --saveEngine=./ppyoloe_s_bs1.engine  --fp16  --buildOnly --workspace=4096 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渐排,一起剝皮案震驚了整個濱河市炬太,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驯耻,老刑警劉巖亲族,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異可缚,居然都是意外死亡孽水,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門城看,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杏慰,你說我怎么就攤上這事测柠×毒希” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵轰胁,是天一觀的道長谒主。 經(jīng)常有香客問我,道長赃阀,這世上最難降的妖魔是什么霎肯? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮榛斯,結(jié)果婚禮上观游,老公的妹妹穿的比我還像新娘。我一直安慰自己驮俗,他們只是感情好懂缕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著王凑,像睡著了一般搪柑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上索烹,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天工碾,我揣著相機(jī)與錄音,去河邊找鬼百姓。 笑死渊额,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓣戚。 我是一名探鬼主播端圈,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼子库!你這毒婦竟也來了舱权?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤仑嗅,失蹤者是張志新(化名)和其女友劉穎宴倍,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仓技,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸵贬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脖捻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阔逼。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖地沮,靈堂內(nèi)的尸體忽然破棺而出嗜浮,到底是詐尸還是另有隱情羡亩,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布危融,位于F島的核電站畏铆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吉殃。R本人自食惡果不足惜辞居,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛋勺。 院中可真熱鬧瓦灶,春花似錦、人聲如沸迫卢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乾蛤。三九已至每界,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間家卖,已是汗流浹背眨层。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留上荡,地道東北人趴樱。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像酪捡,于是被迫代替她去往敵國和親叁征。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容