137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

深度學習模型壓縮,又有利器問世。

最新消息,歷經一年四個版本打磨之後,百度推出最新深度學習模型壓縮工具

PaddleSlim1.0

不僅囊括了深度學習模型壓縮中常用的量化、剪裁、蒸餾、模型結構搜索、模型硬件搜索等方法。

還應用到百度人臉SDK中,能夠實現在嵌入式設備上,0.3秒內完成人臉檢測、跟蹤、活體檢測、識別等全流程操作。

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

對於將功能強大的深度神經網絡部署到移動嵌入式設備端上,以及各種工業場景來說,如此特性都提供了極大的助益,也是當前工業界應用深度學習算法核心需求。

但對於PaddleSlim1.0來說,這只是其最新特性之一。

與2019年第一季度初次發佈相比,PaddleSlim在易用性、模型適配、端側部署、性能提升等方面都有了顯著提升。

最核心的體現,在於以下的十個特性。

飛槳PaddleSlimV1.0項目地址:https://github.com/PaddlePaddle/PaddleSlim

一、定製YOLO蒸餾方案,刷新COCO檢測任務精度

模型蒸餾是將複雜網絡中的有用信息提取出來,遷移到一個更小的網絡中去,從而達到節省計算資源的目的。PaddleSlim1.0在支持傳統蒸餾方法和基於 FSP(Flow of Solution Procedure)蒸餾方法的同時,還支持針對不同的任務,自定義Loss的蒸餾策略。

在ImageNet分類任務上,將MobileNetV2精度進一步提升了2.1%,此外PaddleSlim1.0還聯合Paddle Detection開發了針對YOLO系列模型的蒸餾方案,在COCO目標檢測數據集上精度提高2%以上。

表 1 蒸餾策略部分實驗結果

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

二、基於敏感度無損剪裁目標檢測模型,裁剪後精度不降反增

為了最大化模型剪枝效果,PaddleSlim在之前的版本中實現了基於網絡結構敏感度進行剪枝的方案,PaddleSlim1.0支持模型敏感度的多機、多線程並行加速計算。用戶可以根據計算結果繪製要裁剪模型的敏感度折線圖,然後從中選取一組合適的剪裁率,或者直接調用PaddleSlim提供的接口自動生成一組合適的剪裁率。

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

圖2 卷積層敏感度折線圖

模型裁剪最大的難題是準確找出網絡中所有與被剪卷積相關的節點,通常做法是以全局視角進行遍歷,但可擴展性不強。PaddleSlim1.0採用以網絡節點為視角進行遍歷,找出所有與被剪卷積相關的節點,相當於把複雜網絡的遍歷任務分攤給了各個類型的網絡節點,從而提升了可擴展性,在理論上可以支持任意複雜的網絡。

在目標檢測任務中,可以在不降低模型精度的情況下,進行大比例的剪枝,個別任務剪枝後精度反而有所提升。

表2 基於敏感度的剪裁方法部分實驗結果

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

三、支持網絡可配置量化,新增離線量化,模型預測速度成倍數提升

定點量化的目的是將神經網絡前向過程中浮點數運算(float32)量化為整數(int8)運算,以達到計算加速的目的。PaddleSlim1.0在定點量化的功能上,還支持了網絡可配置量化,可以對用戶指定的局部網絡進行量化,即敏感層繼續用浮點數進行計算,以減小精度損失。

為了減少量化訓練的開銷,PaddleSlim1.0還新增了離線量化功能,大部分任務在不進行re-train的情況下也能達到較高的量化的精度。

PaddleSlim1.0支持對卷積層、全連接層、激活層、BIAS層和其它無權重的層量化。實驗證明,定點量化最高可以使模型減小到原來的約1/4,基於Paddle Lite預測部署框架,不同模型可實現1.7倍~2.2倍的加速。

表 3 int8部分定點量化訓練實驗結果

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

四、全新的NAS架構,搜索更快速、結構更靈活

PaddleSlim1.0開放了更加靈活的NAS API,預定義了更豐富的搜索策略和搜索空間。將搜索空間和搜索策略完全解耦,方便用戶擴展搜索策略和搜索空間。

在搜索策略層面,之前版本已經支持模擬退火(Simulated Annealing, 簡稱SA)算法,相比傳統RL算法,收斂速度更快,迭代步驟更少。支持分佈式SA搜索策略,確保40GPU卡以內搜索速度線性加速。

本次升級新增了目前熱門的基於超網絡(HyperNet)的One-Shot NAS自動搜索方法,One-Shot NAS將超網絡訓練與搜索完全解耦,可以靈活的適用於不同的約束條件,超網絡訓練過程中顯存佔用低,所有結構共享超網絡權重,搜索耗時加速顯著,同時還研發了基於自監督的排序一致性算法,以確保超網絡性能與模型最終性能的一致性。

在搜索空間層面,新增對MobileNet、ResNet、Inception等多種類型的搜索空間,同時還支持多個不同類型的搜索空間堆疊進行搜索,用戶也可自定義搜索空間。

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

圖3 One-Shot網絡結構搜索原理


表 4 ImageNet任務上One-Shot搜索加速收益


137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

實驗結果表明,對比單卡SA搜索策略,單卡One-Shot策略實現搜索速度加快10倍以上。

五、創新的硬件搜索技術,為不同硬件自動匹配最優模型

由於不同硬件架構的差異,需要人工進行繁瑣的硬件適配工作,硬件搜索就是要解決在硬件適配過程中,為特定硬件定製最優模型結構的問題。

在搜索最優模型結構的過程中,如何快速獲得模型在硬件上的實際性能是首先需要解決的問題,傳統的FLOPs無法準確表示模型在真實硬件環境上的性能,PaddleSlim1.0支持基於Operator查表進行網絡延時預估的方法。

用戶只需在硬件上建立Operator延時表,並在網絡生成後基於Operator延時表、網絡延時評估器、網絡結構即可快速獲得網絡在硬件上的延時情況。

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

圖4 SANAS硬件搜索原理及過程

表5 各硬件平臺使用硬件搜索加速後收益(ImageNet任務上相比MobileNetV2)

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

六、新增大規模可擴展知識蒸餾框架Pantheon

支持分佈式蒸餾,實現teacher和student在不同GPU或不同機器上進行蒸餾。避免當teacher和student過大,出現無法運行的情況。在單機圖像分類蒸餾任務上,該方法能降低蒸餾耗時約50%。

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

圖5 大規模蒸餾原理圖

七、支持分類、檢測、分割多個場景,多種策略自由組合

PaddleSlim1.0支持多種壓縮策略組合使用,以達到最高的壓縮比。在分類任務上,實現了模型大小減小70%,準確提升1%。

表6 ImageNet分類任務的部分模型壓縮效果

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

在目標檢測任務上,實現了COCO任務提升0.6%,FLOPs減小43%。

表7 目標檢測模型部分模型壓縮效果

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

八、實現從“模型訓練->模型壓縮->預測部署”全流程應用,壓縮後的模型可無縫部署到各種硬件場景

PaddleSlim基於飛槳完善的技術生態,實現了從“模型訓練->模型壓縮->預測部署”的全流程應用,壓縮後的模型可無縫落地各種硬件環境。

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

圖6 壓縮與部署流程

表8 目標檢測模型部署在服務端和移動端的耗時數據

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

測試數據表明,MobileNetv1-YOLOv3在移動端不同設備上提速約127%~137%。

表9 ImageNet分類模型部署在服務端和移動端的部分性能

137% YOLOv3加速、10倍搜索性能提升!百度飛槳推出模型壓縮神器

九、輕量級接口設計,實現各策略解耦,大大縮短編碼耗時

PaddleSlim1.0實現了全新接口設計,通過算法獨立實現不同壓縮方法之間的代碼解耦,每個方法既可獨立使用,又可混合使用,大大縮短了編碼耗時。此外接口設計更加簡單,用戶只需要在原有工程上添加如下幾行代碼,即可快速實現模型壓縮。

下面我們構造一個MobileNetV1圖像分類模型,並剪裁其中兩個卷積層,觀察剪裁後的FLOPs,代碼示意如下:

<code># 構建網絡
import paddle
import paddle.fluid as fluid
import paddleslim as slim
exe, train_program, val_program, inputs, outputs =  
      slim.models.image_classification("MobileNet", [1, 28, 28], 10, use_gpu=False)
print(“FLOPs before pruning: {}”.format(slim.analysis.flops(train_program)))

# 聲明剪裁器
pruner = slim.prune.Pruner()

# 剪裁網絡
pruned_program, _, _ = pruner.prune(train_program
fluid.global_scope(),
params=["conv2_1_sep_weights", "conv2_2_sep_weights"], 
ratios=[0.33] * 2,
place=fluid.CPUPlace())

# 查看FLOPs
print(“FLOPs before pruning: {}”.format(paddleslim.analysis.flops(train_program)))/<code>

如果想了解和使用完整代碼,請打開下方鏈接查看圖像分類模型通道剪完整代碼示例:https://aistudio.baidu.com/aistudio/projectdetail/309947

如果您想了解更多的關於裁剪的代碼示例,請打開下方鏈接查看高級剪裁教程:https://aistudio.baidu.com/aistudio/projectdetail/308077

如上完整代碼在百度開發實訓平臺AI Studio上可在線運行,進入鏈接的地址後,選擇 “登錄AI Stuido -> 單擊Fork ->啟動項目”即可。

十、完善的中英文文檔,為全球開發者和合作夥伴提供了更友好的支持

同步開發者建議,完善了中文文檔,並新增英文文檔,為全球PaddleSlim開發者和合作夥伴提供了更友好的支持。

當前,PaddleSlim已經在業內領先的壁虎人臉識別套件、AI測溫等系列產品上成功商用。在第15屆百度之星開發者大賽中,PaddleSlim作為模型小型化賽題中的重要工具,被來自全國90%雙一流高校和相關研究的1800多支參賽隊使用。

(百度之星開發者大賽更多內容打開下方鏈接:http://astar2019.baidu.com/index.html)

未來,飛槳PaddleSlim願與廣大AI開發者、愛好者和合作夥伴攜手,共同探索模型小型化的領先技術,為AI在工業領域中的廣泛應用,持續貢獻力量。

如果您想詳細瞭解更多飛槳的相關內容,請參閱以下文檔:

官網地址:https://www.paddlepaddle.org.cn飛槳PaddleSlim項目地址:https://github.com/PaddlePaddle/PaddleSlim

— 完 —

量子位 QbitAI · 頭條號簽約

關注我們,第一時間獲知前沿科技動態


分享到:


相關文章: