摘要:CANN作為釋放昇騰硬體算力的關鍵平臺,通過深耕先進的模型壓縮技術,聚力打造AMCT模型壓縮工具,在保證模型精度前提下,不遺餘力地降低模型的儲存空間和計算量。
隨著深度學習的發展,推理模型巨大的引數量和計算量,需要耗費越來越多的硬體資源,也給模型在移動端的部署帶來了新的挑戰。
能不能像哆啦A夢一樣,變出一條縮小隧道,不管再大的模型,塞進去後就能變小變輕,在寸土寸金的AI硬體資源上身輕如燕…
答案是:當然可以!
通常來說,想要構建深度學習領域的模型縮小隧道,加速模型推理部署,一般需要藉助量化、剪枝、低秩分解、知識蒸餾等模型壓縮技術,降低模型引數量、計算量。
但是,模型壓縮通常不是無失真壓縮,是犧牲一定精度為代價來獲取計算效能的提升。而作為衡量AI推理應用成效的雙重標準,精度和效能同等重要,模型壓縮演算法的落地自然也需要同時兼顧精度損失和效能提升的均衡。
AMCT:模型縮小隧道
昇騰異構計算架構CANN,作為連線AI框架和AI硬體的橋樑,提升昇騰AI計算效率的關鍵平臺,通過AMCT模型壓縮工具(Ascend Model Compression Toolkit),構築了一條現實版的模型縮小隧道。
AMCT是一個python工具包,有效適配Caffe/TensorFlow/ 昇思MindSpore/PyTorch/ONNX等主流深度學習框架,提供包含量化、張量分解、通道稀疏在內的多種模型壓縮功能。在保證模型精度前提下,可有效降低模型的儲存空間和計算量,提升模型推理效能。
相比於其他同類平臺,AMCT支援的模型壓縮特性更加完備,通過多種壓縮演算法以及硬體親和模型優化最大化使用者模型部署推理效能;AMCT支援的訓練框架也更加豐富,適配不同領域不同使用者人群開發使用;除此之外,AMCT還致力於通過自動調優、自動補齊等高階特性來提升工具的易用性,讓使用者可以付出極低代價就可以獲取儘可能大的收益。
量化:低位元壓縮,減少資料bit位寬
顧名思義,模型量化是一種將浮點計算轉成低位元定點計算的技術(例如32bit的浮點模型轉換為8bit的定點模型),可有效降低模型的儲存開銷和計算複雜度,從而提升模型推理效能。
常見的量化演算法有二值化、對數量化和線性量化。
二值化量化,,由於模型壓縮太過激進,對於模型效能提升較大但是相應的精度損失也較大,適用範圍較小;
對數量化,
由於依賴專用的硬體計算單元且效能提升有限,也未能獲得大規模應用;
AMCT採用線性量化方式,
支援8bit、4bit位寬量化。一般而言,網路做8bit量化的精度風險小,可通過訓練後量化的方式實現;對於4bit量化的精度損失風險較大,當前AMCT僅支援通過量化感知訓練的方式實現。
訓練後量化(Post-Training Quantization, 簡稱PTQ),是指將訓練後模型中的權重由浮點數量化到低位元整數,並通過少量校準資料基於推理過程進行校準量化。對於8bit量化,一般網路通過訓練後量化即可達到較低的量化精度損失。
量化感知訓練(Quantization-Aware Training, 簡稱QAT),是指藉助使用者完整訓練資料集,在重訓練過程中引入量化操作,在訓練前向計算中對資料和權重進行偽量化(量化反量化),引入量化誤差損失,從而在訓練過程中提高模型對量化效應的適應能力,提高最終的量化模型精度。對於4bit以及更低bit位寬的量化,一般需要通過量化感知訓練來降低量化精度損失。
我們在昇騰AI處理器上分別測試了ResNet-50和YOLOV3網路在8bit PTQ和4bit QAT下的效能及精度表現。
精度方面,可以看到不同網路對量化的敏感度不同,在經典CV網路,8bit量化量化精度損失可保持在1%以內,4bit量化量化精度損失可保持2%以內。
效能方面,不同模型由於其模型結構及網路規格的差異,量化所獲取的效能提升也各不相同,其中ResNet-50 INT8相較於FP16,INT4相較於INT8而言平均約有40%左右的效能提升;YOLOV3則都在30%左右。
使用方面,開發者呼叫AMCT提供的API即可輕鬆完成模型量化。AMCT預設會對整網所有可量化運算元(主要為卷積類和矩陣乘類運算元)進行量化,開發者也可自行指定具體量化哪些層、每一層的量化bit位寬。如果量化後精度損失大於預期,可以通過跳過一些關鍵層的量化來恢復精度。例如,我們通常認為網路的首尾層對網路的業務精度影響較大,則需要優先進行量化回退。
稀疏:權重剪枝,縮減模型引數量
許多實驗證明,神經網路模型都是過引數化的(over-parameterized),許多引數都是冗餘的,恰當剔除這些相對“不重要”的引數對模型最終的結果幾乎沒有影響。
模型稀疏就是對模型的引數進行刪減,從而降低模型的儲存和計算開銷。而模型稀疏按照稀疏顆粒度,從最小的element-wise到channel-wise甚至更大,稀疏顆粒度從小到大,對模型的精度影響越大,但是相應能夠獲取到的效能收益也越大。
以上稀疏顆粒度示意圖,從左到右顆粒度依次增加。但是對於單個權重、權重向量、單個卷積核kernel的稀疏都需要硬體特殊適配才能夠拿到對應的效能或者儲存收益。
而通道稀疏(filter-level sparsity)由於裁剪了輸出資料通道,等價於縮小了模型的規格,不需要特定的硬體支援就可以拿到對應的效能收益,是一個比較理想的選擇。但是如前所述,通道稀疏的顆粒度較大,對於網路的精度風險也較大,一般需要進行Fine-tune。
AMCT目前主要支援基於重訓練的通道稀疏模型壓縮特性。
通道稀疏主要是通過裁剪網路通道數,在保持網路功能的前提下縮減模型引數量。通道稀疏的實現通常包括兩個步驟:首先是通道選擇,需要選擇合適的通道組合以保留豐富的資訊;然後是重建,需要使用選擇的通道對下一層的輸出進行重建。
在昇騰AI處理器上分別測試了ResNet-50網路進行30%稀疏的精度和效能表現。
精度方面,可以看到不同網路對通道稀疏的敏感度不同,ResNet50做30%比例的通道稀疏後精度損失仍能保持在1%以內。
效能方面,主要測試了ResNet-50在不同batch-size情況下的效能情況,在batch-size=32場景下通道稀疏約提升了40%的推理速度。
使用方面,開發者同樣只需要呼叫AMCT提供的API,配置你期望的全域性稀疏率或者每一層的稀疏率即可,工具能自動判定可稀疏通道,輕鬆完成稀疏工作。
張量分解:低秩近似,降低模型計算量
對於卷積神經網路來說,卷積層的運算量是佔網路總運算量的大頭,並且卷積核越大,引數量和計算量越龐大。
而張量分解,正是採用數學方法,將一個大卷積核通過低秩近似分解為多個小卷積核,構造計算量更小的卷積運算元,從而達到壓縮模型與計算量的目的。
以1個64*64*3*3的卷積分解為32*64*3*1和64*32*1*3的級聯卷積為例,可以減少1 - (32*64*3*1 + 64*32*1*3) / 64*64*3*3 = 66.7%的計算量,在計算結果近似的情況下帶來更具價效比的效能收益。
AMCT中的張量分解則充分考慮昇騰AI處理器硬體特性,選擇能夠充分發揮硬體算力的卷積形式,儘可能減小搬運開銷對運算元效能的影響。
實驗表明,張量分解在昇騰AI處理器的推理速度以及模型大小的優化上都起到了非常顯著的效果。
經測試,13張經典CV網路經過張量分解後,推理時間平均減少24.4%,模型大小平均減少38.8%,而finetune後的精度幾乎與分解前相當(最大損失不超過0.5%)。
使用方面,通過AMCT提供的API,開發者僅需呼叫1或2個介面(取決於框架),即可完成對原始模型的分解,並對分解後的模型進行finetune。
寫在最後
CANN作為釋放昇騰硬體算力的關鍵平臺,面對既要保精度又要提效能的尷尬問題,堅持“精度和效能兩手抓,兩手都要硬”,始終站在開發者視角,想開發者所想,及開發者所及。通過深耕先進的模型壓縮技術,聚力打造AMCT模型壓縮工具,在保證模型精度前提下,不遺餘力地降低模型的儲存空間和計算量。
輕裝前行,放得遠方!面對人工智慧的蓬勃發展,相信通過CANN構築的模型縮小隧道,定將給大引數量、大計算量的AI模型帶來更加廣闊的應用場景,和更加巨大的想象空間!
歡迎登陸昇騰社群網站https://www.hiascend.com/瞭解更多資訊。