Yolo系列模型的部署、精度對齊與int8量化加速
大家好,我是海濱。寫這篇文章的目的是為宣傳我在23年初到現在完成的一項工作---Yolo系列模型在TensorRT上的部署與量化加速,目前以通過視頻的形式在B站發布(不收費,只圖一個一劍三連)。
麻雀雖小但五臟俱全,本項目系統介紹了YOLO系列模型在TensorRT上的量化方案,工程型較強,我們給出的工具可以實現不同量化方案在Yolo系列模型的量化部署,無論是工程實踐還是學術實驗,相信都會對你帶來一定的幫助。
B站地址(求關注和三連):https://www.bilibili.com/video/BV1Ds4y1k7yr/
Github開源地址(求star):https://github.com/thb1314/mmyolo_tensorrt/
當時想做這個的目的是是為了總結一下目標檢測模型的量化加速到底會遇到什么坑,只是沒想到不量化坑都會很多。
比如即使是以FP32形式推理,由于TensorRT算子參數的一些限制和TRT和torch內部實現的不同,導致torch推理結果會和TensorRT推理結果天然的不統一,至于為什么不統一這里賣個關子大家感興趣可以看下視頻。
下面說一下我們這個項目做了哪些事情
YOLO系列模型在tensorrt上的部署與精度對齊
該項目詳細介紹了Yolo系列模型在TensorRT上的FP32的精度部署,基于mmyolo框架導出各種yolo模型的onnx,在coco val數據集上對齊torch版本與TensorRT版本的精度。
在此過程中我們發現,由于TopK算子限制和NMS算子實現上的不同,我們無法完全對齊torch和yolo模型的精度,不過這種風險是可解釋且可控的。
詳解TensorRT量化的三種實現方式
TensorRT量化的三種實現方式包括trt7自帶量化、dynamic range api,trt8引入的QDQ算子。
Dynamic range api會在采用基于MQbench框架做PTQ時講解。
TensorRT引入的QDQ算子方式在針對Yolo模型的PTQ和QAT方式時都有詳細的闡述,當然這個過程也沒有那么順利。
在基于PytorchQuantization導出的含有QDQ節點的onnx時,我們發現盡管量化版本的torch模型精度很高,但是在TensorRT部署時精度卻很低,TRT部署收精度損失很嚴重,通過可視化其他量化形式的engine和問題engine進行對比,我們發現是一些層的int8量化會出問題,由此找出問題量化節點解決。
詳解MQbench量化工具包在TensorRT上的應用
我們研究了基于MQbench框架的普通PTQ算法和包括Adaround高階PTQ算法,且啟發于Adaround高階PTQ算法。
我們將torch版本中的HistogramObserver引入到MQBench中,activation采用HistogramObserverweight采用MinMaxObserver,在PTQ過程中,weight的校準前向傳播一次,activation的校準需要多次因此我們將weight的PTQ過程和activation的PTQ過程分開進行,加速PTQ量化。實踐證明,我們采用上述配置的分離PTQ量化在yolov8上可以取得基本不掉點的int8量化精度。
針對YoloV6這種難量化模型,分別采用部分量化和QAT來彌補量化精度損失
在部分量化階段,我們采用量化敏感層分析技術來判斷哪些層最需要恢復原始精度,給出各種metric的量化敏感層實現。
在QAT階段,不同于原始Yolov6論文中蒸餾+RepOPT的方式,我們直接采用上述部分量化后的模型做出初始模型進行finetune,結果發現finetune后的模型依然取得不錯效果。
針對旋轉目標檢測,我們同樣給出一種端到端方案,最后的輸出就是NMS后的結果。通過將TensorRT中的EfficientNMS Plugin和mmcv中旋轉框iou計算的cuda實現相結合,給出EfficientNMS for rotated box版本,經過簡單驗證我們的TRT版本與Torch版本模型輸出基本對齊。
以上就是我們這個項目做的事情,歡迎各位看官關注b站和一劍三連。同時,如果各位有更好的想法也歡迎給我們的git倉庫提PR。
-
算法
+關注
關注
23文章
4599瀏覽量
92639 -
模型
+關注
關注
1文章
3171瀏覽量
48711 -
精度
+關注
關注
0文章
257瀏覽量
19998
原文標題:Yolo系列模型的部署、精度對齊與int8量化加速
文章出處:【微信號:GiantPandaCV,微信公眾號:GiantPandaCV】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論