layout: post
title: 2D_Detection-模型加速(工程篇)
date: 2021-09-20 18:18:48.000000000 +09:00
categories: [演算法篇]
tags: [CV, 綜述]
- 前言
- 詳細介紹
- 工程加速
- Distillation
- MultiTask
- 量化
- 算子/圖融合
- 工程加速
更多內容可訪問個人博客:2D_detection檢測綜述
前言
深度學習網路的加速問題包含兩部分內容:網路結構側的加速和工程側的加速,工程層面的加速,網路結構基本是不變的,更多從網路推理角度探討如何在不損失精度(或者損失較小)的前提下,提高模型的推理速度(吞吐率),
詳細介紹
工程加速
Distillation
Distillation是一項常用于模型加速的技術,Ditillation通常包含兩個模型:Teacher Model/Student Model, 其中Student Model的模型結構通常更加簡單,速度更快,但是通過Distillation可以利用Teacher Model的中間輸出結果來“指導”Student Model的訓練,從而能夠使得在Student Model的高速度的前提保持和Teacher Model基本一致的精度,
Distillation的基礎原理在于提取Teacher model的高維度的輸出作為Student model的訓練輸入,能夠讓Student model更好的學習,其中高維度的輸出包括logits(soft-label)和hint feature(softmax前的feature),同時通過控制T來實作不同平滑程度的分布(softmax前除以T),Distillation的開山之作為:Distilling the Knowledge in a Nerural Network,文章第一次定義了Distillation,并且提出了基于神經網路的訓練方方法,典型的Distillation框架如下:

Distillation在一些簡單的任務上通常有不錯的效果:如分類;但是對于一些比較復雜的任務,如檢測任務Distillation則不一定生效,因為Distillation的核心是通過Teacher Model的中間Feature來指導Studentnt Model的訓練,使其能夠更容易學習到一些高維特征,但是對于檢測任務來說,其比較注重區域目標物體(bbox/class),特征更難學習,
MultiTask
MultiTask顧名思義是將多個Task合并為一個Task,是一項實踐程序中較為常用的技巧,通常對于一些關聯性較強的任務(如檢測人體的多個部位),可以通過MultiTask的方案進行合并,即基本的網路設計如下:

個人理解,MultiTask的核心在于共享前置層的基本特征,通過采用不同branch的方式實作不同Task的實作(不同Task屬于較為接近的Task),對于分類Task來說,最簡單可以采用不同的fc層來實作不同task的分離,對于檢測,因為只對backbone進行引數共享,所以需要對后置的anchor generator以及Det-head進行不同的配置,細節層面,在訓練時需要解決不同型別資料只對對應的branch引數進行梯度回傳,通常task越多,性能下降越多,往往需要進行task的combine操作(即減少總的branch,而增加單個branch的Task數目),
量化
模型的量化一般是真實模型部署場景不可獲取的一個環節:通常模型訓練的時候為了減少精度損失,通常基于FP32精度(或者混合精度)訓練,但是基于FP32精度的模型通常占用存盤,運行效率也偏低,在移動端的部署上就會顯得力不從心, 該需求背景下,量化便應運而生了,量化意義在于能將FP32資料轉化為低精度資料(常見如INT8),因為模型推理程序中,模型的權重都是固定的,且對于收斂較好的模型INT8資料型別通常能夠表達FP32資料的大部分輸出范圍,從而保持比較好的精度, 目前業界最常用的便是NVIDIA TensorRT的量化方案:8-bit Inference with TensorRT,其核心原理是將原始FP32的各層的激活值通過INT8進行表達:轉換為基于 KL-divergence 的最優化問題,當然大部分情況是無法無損映射的,通常會有一定的精度損失(尤其是邊界值),

TenRT會通過校驗集來優化上述環節,校驗集可以認為是真實場景的一個子集,可以基于此維持在真實場景盡可能高的精度,其基本流程如下:
- 基于校驗集資料得到各層的激活值直方圖
- 基于不同閾值產生不同的量化分布
- 基于每個分布和原始分布的相對熵,然后選擇熵最少的量化閾值
算子/圖融合
深度模型的推理通常是基于計算圖來實作網路結構的表達,即算子和網路結構通過計算圖中的節點和圖關系來進行表達,通常來說,算子復合度對模型的計算性能影響是正相關的,即算子的復合度越高,其模型的計算性能也是越高的;但是算子復合度越高,其表達能力越差,簡單來說,原本很多小算子可以通過不同的組合構建復雜多變的網路結構,但是當這些小算子合并為幾個大算子,那其表達能力就會下降,
所以,通常來說,構建模型以及模型訓練程序中,通常都是基于復合度低的算子來實作多樣的模型的,但是在實際推理的程序中,由于模型的結構和權重都是固定的,那么就可以通過提高算子的復合度來提高模型的性能,即算子/圖融合, 算子/圖融合通常和底層硬體相關,如GPU的CUDA算子庫中便集成了大量的圖算融合的邏輯來加速模型的推理;另外其他硬體如NPU(如HUAWEI的Ascend系列)也各自開發適應其自身的圖算融合演算法, 圖算融合的核心是將一些可以連續/并行計算的算子通過融合算子或者優化底層計算邏輯來實作性能優化,最常見的算子融合的樣例便是Conv+BN的合并,其合并原理為:訓練后的BN引數是固定的,相當于對輸出資料進行線性運算,而該線性運算是可以在卷積操作中實作,
當前一些流行的AI編譯器(如TVM)便會基于各種硬體后端生成優化規則,對模型進行優化操作,TVM主要通過支配樹(Dominator Tree)來實作算子融合,其基本策略是從各節點出發,確認其和支配點Node是否符合融合規則(pattern),如果符合則將這些節點替換為融合算子,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302043.html
標籤:其他
