作者:許哲豪 博士
英特爾邊緣計算創(chuàng)新大使
1989年科幻電影《親愛的,我把孩子縮小了》,2015年《蟻人》,2017年《縮小人生》,以及我們從小看到大的多啦A夢 “縮小燈”、“縮小隧道”,都不約而同的提到一個概念,就是可以透過一種神奇的機器,就能把人的體積大幅縮小但生理機能完全不減。這里姑且不論是否符合物理定律,但如果真的能實現(xiàn),就會像《縮小人生》中所提到的,可大幅減少地球資源的浪費,大幅改善人類的生存環(huán)境。雖然以上提及的技術(shù)可能我們這輩子都難以看到實現(xiàn)的一天,但把超巨大的 AI 模型縮小但仍保持推論精度不變,還是有很多方法可以達到的。接下來我們就來幫大家簡單介紹一下幾種常見技術(shù)。
AI 模型組成元素
回顧一下本專欄三月份文章[1]第 1 小節(jié)提及的神經(jīng)網(wǎng)絡(luò)架構(gòu),其組成內(nèi)容主要包括神經(jīng)元內(nèi)容(包含數(shù)量)、網(wǎng)絡(luò)結(jié)構(gòu)(神經(jīng)元連接拓撲)及每個連結(jié)的權(quán)重值,如圖 2 所示。簡單的卷積神經(jīng)網(wǎng)絡(luò) (CNN) 如 LeNet-5,就有約 6 萬個權(quán)重,而大型模型 VGG16 則有約 1.38 億個權(quán)重,到了現(xiàn)在流行的大型語言模型 GPT-3 已經(jīng)激增到 1750 億個權(quán)重,更不要說像 GPT-4 已有超過一兆個權(quán)重。
通常在訓(xùn)練模型時為了精度,權(quán)重值大多會使用32 位元浮點數(shù) (FP32) 表示法[2],這就代表了每個權(quán)重占用了 4 個 Byte (32bit) 的儲存 (硬碟) 和計算(隨機記憶體)空間。這還不包括在推論計算過程中額外所需的臨時隨機記憶體需求。
為了讓運行時減少資料(網(wǎng)路結(jié)構(gòu)描述及權(quán)重值)在 CPU 和 AI 加速計算單元(如 GPU, NPU 等)間搬移的次數(shù),所以通常會一口氣把所有資料都都載入專用記憶體中,但一般配置的記憶體數(shù)量都不會太多,大約 1GB 到 16GB 不等,所以如果沒有經(jīng)過一些減量或壓縮處理,則很難一口氣全部載入。
圖 1 AI 模型主要元素示意圖
常見壓縮及減量作法
如同前面提到的,我們希望將一個強大復(fù)雜的 AI 模型減量、壓縮后,得到一個迷你、簡單的模型,但仍要能維持原有的推論精度或者只有些許(0% 到指定 %)的下降,就像我們平常看到的 JPG 影像、MP4 影片,雖然采大幅度破壞性壓縮,但人眼是很難分辨其品質(zhì)差異的。這樣可以得到幾項好處,包括大幅減少儲存空間和計算用記憶體推論速度加快,耗能降低,同時更有機會使用較低計算能力的硬體(如 GPU 變成 CPU)來完成推論工作。以下就把常見的四種方式簡單介紹給大家。
2.1 權(quán)重值量化 (Quantization)
通常在訓(xùn)練模型時,為求權(quán)重有較寬廣的數(shù)值動態(tài)范圍,所以大部分會采用 32 位元浮點數(shù) ( FP32,符號 1 bit ,指數(shù) 8 bit,小數(shù) 23 bit,共 4 Byte,數(shù)值表示范圍 ±1.18e-38 ~±3.40e38 )[2]。而經(jīng)許多資料科學(xué)家實驗后,發(fā)現(xiàn)在推論時將數(shù)值精度降至 16 位元浮點數(shù)(FP16, 2 Byte, -32,768 ~ +32767),甚至 8 位元整數(shù) (INT8, 1 Byte, -128 ~ +127)、8 位元浮點數(shù)(FP8, e5m2, e4m3, 1 Byte) 在推論時其精度下降幅度可控制在一定程度內(nèi),同時可讓儲存空間和記憶體使用量減少 1/2 到 3/4,若加上有支持 SIMD 或平行運算指令集[1]還可讓運算量提升 1.x ~ 3.x 倍,一舉多得。
以 FP32 量化為 INT8 為例,一般最簡單的作法就是把所有空間等比對稱分割再映射,不過當遇到權(quán)重值分配往單邊靠或集中在某個區(qū)間時就很難分別出細部差異。于是就有以最大值與最小值非對稱方式來重新映射,以解決上述問題。
這樣的量化減量的方式最為簡單,但也常遇到模型所有層用同一數(shù)值精度后推論精度下降太多,于是開始有人采取合精度,即不同層的權(quán)重可能采不同數(shù)值精度(如 FP32, FP16, INT8 等)來進行量化。不過這樣的處理方式較為復(fù)雜,通常需要一些自動化工具來協(xié)助。
圖 2 權(quán)重值量化示意圖[3]
2.2 模型剪枝 (Pruning)
所謂樹大必有枯枝,模型大了自然有很多連結(jié)(權(quán)重)是沒有存在必要的或者是刪除后只產(chǎn)生非常輕微的影響。如果要透過人為方式來調(diào)整(刪除、合并)數(shù)以百萬到千萬的連結(jié)勢必不可能,此時就只能透過相關(guān)程序(如英特爾 OpenVINO, Nvidia TensorRT, Google TensorFlow Lite 等)使用復(fù)雜的數(shù)學(xué)來協(xié)助完成。
經(jīng)過剪枝后,計算量會明顯下降,但可以減少多少則會根據(jù)模型復(fù)雜度及訓(xùn)練的權(quán)重值分布狀況會有很大差異,可能從數(shù)個 percent 到數(shù)十個 percent 不等,甚至運氣好有可能達到減量 90% 以上。
另外由于剪枝后會造成模型結(jié)構(gòu)(拓撲)變成很不完整,無法連續(xù)讀取,所以需要另外增加一些描述信息。不過相對權(quán)重值占用的儲存空間,這些多出來的部分只不過是九牛一毛,不需要太過在意。
圖 3模型剪枝示意圖[3]
2.3權(quán)重共享 (Weight Share)
由于權(quán)重值大多是由浮點數(shù)表示,所以若能將近似值進行群聚(合并),用較少的數(shù)量來表達,再使用查表法來映射,如此也是一個不錯的作法。但缺點是這樣的作法會增加一些對照表,增加推論時額外的查表工作,且由于和原數(shù)值有些微差異,因此會損失一些推論精度。
如圖 4 所示,即是將 16 個權(quán)重先聚類成 4 個權(quán)重(索引值),再將原本的權(quán)重值變成索引號,等要計算時再取回權(quán)重值,這樣儲存空間就降到原本的 1/4。
圖 4 權(quán)重共享壓縮示意圖[3]
2.4知識蒸餾 (Knowledge Distillation)
知識蒸餾基本上不是直接壓縮模型,而是利用一個小模型去學(xué)習(xí)大模型輸出的結(jié)果,間接減少模型的復(fù)雜度、權(quán)重數(shù)量及計算量。大模型就像老師,學(xué)富五車,經(jīng)過巨量資料集的訓(xùn)練,擁有數(shù)百萬甚至千億個權(quán)重來幫忙記住各種特征。而小模型就學(xué)生,上課時間有限,只能把老師教過的習(xí)題熟練于心,但若遇到老師沒教過的,此時若不能舉一反三,順利答題就很難保證了。
如圖 5 所示,訓(xùn)練學(xué)生模型時,將同一筆資料輸入到老師模型和學(xué)生模型中,再將老師的輸出變成學(xué)生的標準答案,學(xué)生模型再以此調(diào)整所有權(quán)重,使輸出推論結(jié)果和老師一樣即可。當給予足夠多量及多樣的樣本訓(xùn)練后,學(xué)生就能結(jié)束課程,獨當一面了。
圖 5 知識蒸餾示意圖[3]
小結(jié)
以上只是簡單介紹了部分減量及壓縮模型的方式,還不包含模型減量、壓縮后造成的精度下降如何調(diào)整。這些工作相當復(fù)雜,只能交給專業(yè)的工具來辦,其中英特爾OpenVINO Toolkit就有提供許多模型優(yōu)化(Model Optimization)[4] 及神經(jīng)網(wǎng)絡(luò)壓縮工具NNCF (Neural Network Compression Framework)[5],有興趣的朋友可以自行了解一下,下次有機會再為大家做更進一步介紹。
審核編輯:湯梓紅
-
英特爾
+關(guān)注
關(guān)注
61文章
10019瀏覽量
172441 -
cpu
+關(guān)注
關(guān)注
68文章
10918瀏覽量
213172 -
AI
+關(guān)注
關(guān)注
87文章
31770瀏覽量
270552 -
模型
+關(guān)注
關(guān)注
1文章
3358瀏覽量
49282
原文標題:親愛的,我把 AI 模型縮小了—— 模型減量與壓縮技術(shù)簡介 | 開發(fā)者實戰(zhàn)
文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
騰訊 AI Lab 開源世界首款自動化模型壓縮框架PocketFlow
模型壓縮技術(shù),加速AI大模型在終端側(cè)的應(yīng)用
使用cube-AI分析模型時報錯的原因有哪些?
STM CUBE AI錯誤導(dǎo)入onnx模型報錯的原因?
![](https://file1.elecfans.com/web2/M00/BA/5D/wKgZomWTtniAVT9oAAmGs-W8Ecc058.png)
![](https://file1.elecfans.com/web2/M00/BB/24/wKgaomWTvjKAfPpDAAWrpACxLMQ967.png)
【AI學(xué)習(xí)】AI概論:(Part-A)與AI智慧交流
壓縮模型會加速推理嗎?
訓(xùn)練好的ai模型導(dǎo)入cubemx不成功怎么解決?
邊緣AI的模型壓縮技術(shù)
![邊緣<b class='flag-5'>AI</b>的<b class='flag-5'>模型</b><b class='flag-5'>壓縮</b>技術(shù)](https://file.elecfans.com/web2/M00/71/C7/pYYBAGNPl6-AZ2uZAAGw_oTIvEs500.png)
將數(shù)據(jù)預(yù)處理嵌入AI模型的常見技巧
邊緣AI的模型壓縮技術(shù)
![邊緣<b class='flag-5'>AI</b>的<b class='flag-5'>模型</b><b class='flag-5'>壓縮</b>技術(shù)](https://file.elecfans.com/web2/M00/A2/E0/poYBAGRUYc-ASdtTAAGyRWCNOCM104.png)
評論