性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise

2020-12-09 機器之心Pro

機器之心報導

機器之心編輯部

對於動輒上百 M 大小的神經網絡來說,模型壓縮能夠減少它們的內存佔用、通信帶寬和計算複雜度等,以便更好地進行應用部署。最近,來自 Facebook AI 的研究者提出了一種新的模型量化壓縮技術 Quant-Noise,讓神經網絡在不降低性能的前提下,內存佔用減少 90% 以上。

我們都知道,對於神經網絡來說,參數量越大、層數越多,就代表著輸出的結果越精細。當然,這也意味著許多性能優越的神經網絡體積會非常龐大。比如當前的標準機器翻譯架構 Transformer,一層就可能包含數百萬個參數。即使是一些優化過性能和參數效率的模型(比如 EfficientNet),也仍然需要幾十到幾百 MB。這就使得它們的應用範圍限制在機器人或者虛擬助手等領域。

所以我們在應用部署之前,必須面對一個問題:如何對模型進行壓縮?

剪枝和蒸餾是模型壓縮中常用的兩種方法,通過減少網絡權重的數量來刪減參數。還有一種方法就是「量化」,不同的是,它是通過減少每個權重的比特數來壓縮原始網絡。

標量量化(scalar quantization)等流行的後處理量化方法是讓訓練網絡的浮點權重以一個低精度表徵去表示,比如說定寬整數。這些後處理量化方法的好處在於壓縮效率很高,並且能夠加速支持硬體上的推理。但缺點在於,這些近似值造成的誤差會在前向傳播的計算過程中不斷累積,最終導致性能顯著下降。

現在,來自 Facebook 的研究者提出了一種新的模型量化壓縮技術 Quant-Noise,可對模型進行極致壓縮,同時在實際應用部署時保持高性能

論文地址:https://arxiv.org/abs/2004.07320項目地址:https://github.com/pytorch/fairseq/tree/master/examples/quant_noise在這項研究中,研究者提出了一種僅量化權重子集而非整個網絡的壓縮方案。在每次前向傳播時僅量化網絡的隨機部分,對大多數權重使用無偏梯度進行更新。

該方法可以在訓練過程中採用更簡單的量化方案,這對於具有可訓練參數的量化模塊來說是非常有用的,比如乘積量化(Product Quantizer,PQ)算法。

總體來說,該方法的亮點在於:

將名為「Quant-Noise」的量化噪聲應用到權重的隨機子集上,來學習更適用於 int4、 int8 和 PQ 算法等各種量化方法的網絡;在 PQ 算法上添加 Quant-Noise,實現準確率和模型大小綜合結果上的 SOTA 水平。使用該方法進行壓縮後,在自然語言處理方面,RoBERTa 在壓縮到 14MB 的前提下,在 MNLI 上實現了 82.5% 的準確率;在計算機視覺方面,EfficientNet-B3 在壓縮到 3.3 MB 的前提下,在 ImageNet 上實現了 80.0% 的 top-1 準確率。使用 Quant-Noise 訓練的網絡,通過結合 PQ 算法和 int8 來量化網絡的權重和 activation,獲得在固定精度計算條件下的極致壓縮效果,實現了 ImageNet 數據集上的 79.8% top-1 準確率和 WikiText-103 數據集上的 21.1 困惑度。

此外,使用 Quant-Noise 壓縮後的模型性能幾乎與原始模型一致,同時將內存佔用量減少至原來的十分之一甚至二十分之一。這大大超過了 PyTorch 和 Tensorflow 中所用的 int8 的 4 倍壓縮。目前,相關代碼也已經開源。

原理:量化神經網絡

在本章中,研究者介紹了量化原理以及幾種標準量化方法,並詳細解釋了如何將標量和乘積量化相結合。需要注意的是,為了定義清楚,研究者主要專注於固定實矩陣(fixed real matrix)W∈R ^ n×p 的示例,並假設此矩陣被拆分為 m×q 個塊(b_kl):

這些塊的屬性由量化方法來確定,而碼本(codebook)是包含 K 個向量的集合,即 C = {c [1], ..., c [K]}。此量化方法使用如下方法壓縮矩陣 W:向每個塊 b_kl 分配一個指向碼本 C 中「碼字 c」的索引,同時存儲碼本 C 以及結果索引(作為索引矩陣 I 的條目 I_kl), 而不是使用實際權重。在推理過程中,該方法重建原始矩陣 W 的近似值

,使得 b_kl = c [I_kl]。研究者將標量量化(如 int8,即每個塊 b_kl 由一個權重組成)與向量量化(將多個權重共同量化)區分開來。

上圖顯示了研究者在訓練過程中如何將量化噪聲應用於權重子集,從而改善量化模型的性能(完整視頻請參照連結)。

定點標量量化

定點(Fixed-point)標量量化方法用低精度定點表示代替了浮點表示。通過在能夠兼容的硬體上使用定點運算,實現減少模型內存佔用並加快推理速度的效果。

Quant-Noise 的具體實現方法

深度網絡訓練過程中不會接觸到 quantization drift 引起的噪聲,從而導致性能欠佳。如何使網絡對量化具有一定的魯棒性?解決方案就是在訓練期間引入量化噪聲

量化感知訓練(Quantization Aware Training,QAT)通過對前向傳播過程中的權重進行量化來實現這一點。這種轉換是不可微的,且使用直通估計器(straight through estimator,STE)來逼近梯度。STE 在梯度中引入了一個偏置,該偏置取決於權重的量化級別,因此也取決於壓縮率。

因此,研究者提出了一種簡單的修改方法 Quant-Noise,通過隨機改善 QAT 來控制該偏置。其思路是:量化權重中的隨機部分,而不是像 QAT 那樣量化整個網絡,使未經量化的權重使用無偏梯度。該方法的一般形式可以模擬訓練期間的量化和剪枝效果。

使用 Quant-Noise 訓練網絡

仍以實矩陣 W 為例。在訓練時,Quant-Noise 方法的運行方式如下:

首先,計算與目標量化方法相關的塊 b_kl;然後在每個前向傳播過程中,隨機選擇這些塊的子集,並添加一些失真;在反向傳播過程中,使用 STE 逼近失真的權重,進而計算所有權重的梯度值。換句話說,給定索引元組 J {(k, l)},其中 1≤k≤m,1≤l≤q,同時將失真或噪聲函數 作用在塊上,於是研究者定義算子 ψ (· | J),對於每個塊 b_kl 均應用以下轉換:

Quant-Noise 的效果怎麼樣?

Quant-Noise 對不同量化方法的影響

如下表 1 所示,研究者首先展示了在語言建模和圖像分類任務上,Quant-Noise 對 int4、int8 和 iPQ 三種不同量化方案的影響。結果表明,Quant-Noise 對 iPQ 等高性能量化方案表現出非常好的效果,而 QAT 一般導致性能下降,即使與量化作為後處理步驟的情況相比也會這樣。

表 1:在 QAT 和 Quant-Noise 兩種設置下,int4、int8 和 iPQ 三種量化方案在語言建模和圖像分類任務上的量化結果對比。對於語言建模任務,研究者在 Wikitext-103 基準上訓練 Transformer,得出了測試困惑度(PPL);對於圖像分類任務,研究者在 ImageNet-1k 基準上訓練了 EfficientNet-B3,得出了驗證 Top-1 準確率。

研究者分析得出,Quant-Noise 能夠與剪枝(pruning)和權重共享(weight sharing)方法兼容並相互補充。如下表 2 所示,研究者分別展示了 WikiText-103 上語言建模、MNLI 上預訓練句子表徵和 ImageNet-1k 上目標分類的結果,這些結果在不同的任務和基準上保持了高度一致:Quant-Noise 在強大的 iPQ 基線方法上實現了性能的大幅提升。

表 2:幾種不同的壓縮方法(權重共享、剪枝和 Quant-Noise)在語言建模、句子表徵和圖像分類任務上對未量化模型和量化模型性能的影響。

與 SOTA 方法的對比

研究者在相同任務上將 Quant-Noise 與當前 SOTA 方法進行對比。他們在有競爭力的模型上應用了最佳量化設置,在結合權重共享和剪枝方法時將這些模型的內存佔用縮小到原來的 1/94-1/20,從而為高性能模型提供了極致壓縮。

如下圖 2 所示,研究者得出了在語言建模、MNLI 和 ImageNet 上性能與模型大小的權衡情況。

圖 2:模型性能隨模型大小的變化情況。

控制變量測試

如下表 3 所示,研究者分別展示了在未利用 Quant-Noise 訓練、利用 Quant-Noise 微調以及利用 Quant-Noise 訓練三種不同的設置下,Adaptive Input 架構的困惑度和 RoBERTa 的準確率變化情況。可以看出,直接利用 Quant-Noise 訓練可以實現最低的困惑度和最高的準確率。

表 3:未利用 Quant-Noise 訓練、利用 Quant-Noise 微調和利用 Quant-Noise 訓練三種不同設置下的困惑度和準確率對比。

如下圖 3 所示,不同 Quant-Noise 值對語言建模模型 Transformer 性能的影響。對於 iPQ,高噪聲值對模型性能帶來較大影響;而對於 int8 量化及其噪聲函數而言,較高的噪聲值對模型性能造成輕微的負面影響,但不如前者那麼嚴重。

圖 3:量化參數的影響。

相關焦點

  • Switch模擬器Yuzu內存佔用減少50% 官方正準備大動作
    Switch模擬器中的佼佼者「Yuzu emulator」一直不間斷的更新,為模擬器改善性能、提高準確度、增加支持的遊戲數量等。 團隊在最近的一次更新中表示,已經通過重構內存管理器代碼,使得模擬器佔用的內存減少了50%之多。
  • Switch模擬器Yuzu代碼重構:內存佔用減少一半、8GB PC帶得動了
    過去幾年,Switch模擬器中的佼佼者Yuzu emulator不間斷地更新,以改善性能、提高準確度、增加支持的遊戲數量等。最近一次更新的變化非常值得一提,團隊稱通過重構內存管理器代碼,使得模擬器佔用的內存減少了50%之多。
  • 如何快速高效壓縮圖片大小不降畫質?
    日常生活中大家喜歡用手機拍攝一些風景視頻和遊玩圖片,在將這些好看的視頻和圖片發給家人或者朋友的時候,因為文件體積過大,發送需要很長的時間,再者也非常佔用手機內存。那麼有沒有可以減少視頻,圖片文件大小的體積工具,並且不降低圖片畫質呢,下面小編給大家分一種可以快速壓縮圖片小的方法,一起學習下。
  • 微信佔用內存太大了怎麼辦?五個方法幫你釋放大量內存!
    但是在使用一段時間的微信以後,很多小夥伴會發現微信佔用我們手機的內存實在是太大了,但是又不知道怎麼清理,也是很煩了。別擔心,今天就讓我們一起來看看微信佔用內存太大了怎麼辦?一、內存清理1.清理微信緩存相信有很多小夥伴都知道,我們在使用微信的時候,經常會產生非常多的緩存數據,這些數據累積起來的話,佔用的手機內存空間自然也是不少的,如果不及時進行清理的話,手機內存自然不夠用。
  • 各個瀏覽器佔用內存測試
    各個瀏覽器佔用內存測試 最近在使用遊覽器的過程中發現,不同遊覽器的內存佔用情況居然差異很大,目測是由於GC(垃圾回收機制)造成的。於是就選取了市面上比較熱門的遊覽器進行測試。
  • svchost佔用內存過高怎麼辦
    svchost佔用內存過高怎麼辦呢?svchost是電腦系統中的系統文件,在進程中經常會看到svchost文件,它佔據著大量內存,下面,我就將svchost佔用內存過高的解決方法分享給你們。svchost佔用內存過高怎麼辦1、右擊計算機,選擇菜單中的管理。2、展開服務和應用程式,選擇其中的服務選項。3、然後在右側找到「Superfetch」服務,然後雙擊它。
  • svchost佔用內存過高怎麼解決
    svchost佔用內存過高,會導致內存100%電腦卡住,CPU溫度升高,散熱風扇一直狂轉。那麼,當遇到svchost佔用內存過高怎麼辦,別著急,下面小編就給大家介紹一下win10系統svchost佔用內存過高的解決方法svchost佔用內存過高怎麼解決:1,右鍵點擊「此電腦」,菜單欄選擇「管理」。
  • 伺服器內存佔用高怎麼辦
    伺服器隨著運行時間的增加,佔用內存會逐漸增加。如果伺服器內存小,就很容易出現內存佔滿,系統變慢,甚至是卡死的情況。一個辦法是增加物理內存,但這涉及到費用、停機、開機箱等。這裡有一個處理方案,可供借鑑。效果好的話,可以不用買內存條了哈哈。
  • 如何讓手機內存變大?內存不足解決方法【詳解】
    在購買手機的時候,有些人就選擇了一些內存比較大的機型,避免日後自己因手機內存小而帶來不好的體驗。但是使用使用中人們就會發現,再多的手機內存也不夠用,隨著軟體不斷升級、手機中使用的垃圾增多等等,人們也開始發現手機中的內存越來越小了。手機內存一小對正常使用肯定是會造成麻煩的,那麼怎樣讓手機內存變大呢?
  • 微信數據佔用內存過大,但又不敢刪除,怎麼辦?解決方法很簡單! - 12...
    微信有小紅點你能夠忍受住不點開消除的誘惑嗎?相信很多人的回答肯定都是不知道,不能!頻繁的使用次數導致了微信佔用的手機內存越來越多,雖然可以選擇清除微信緩存,但是上邊有很多重要的聊天記錄以及工作相關的資料,輕易不敢刪除,但是不刪除又會導致手機越來越慢,簡直就是掉進了死循環,那麼面對這種情況我們應該怎麼辦呢?
  • 手機:微信內存佔用大?怎麼清理
    一般情況下,在使用時間過長後,會出現內存不足的提示,尤其是老年人,基本上只使用微信,這時候,我們該怎麼辦呢?下面小編來告訴你! 微信在手機中佔用的內存是非常大的,從最早的幾GB到現在基本上都是10GB左右,所以需要設置,並且定期進行清理。
  • 單雙通道內存性能差異對比
    前言:作為與CPU進行溝通的「橋梁」,內存對於系統的重要性不言而喻。隨著作業系統、應用軟體的不斷升級,使用時對於內存容量的佔用也是越來越大。現在,裝機使用2G內存已經是很普遍的選擇,如果是為了玩遊戲什麼的,裝4G內存也大有人在。
  • 微信佔用空間太大怎麼辦?這才是微信內存的正確清理方法!
    現在的智慧型手機內存越來越大、功能越來越多,同時出現的一個問題就是APP的體量越來越龐大,而微信就是其中的一個「空間佔用大戶」,動輒就能達到10GB以上的容量。小雨目前使用的微信7.0.14版本就已經佔用了12.45GB的存儲空間。
  • 如何在線壓縮圖片大小?教你快速壓縮圖片的方法
    如何在線壓縮圖片大小?在日常工作或生活中經常需要把圖片文件傳輸到一些平臺,但是平臺對上傳的文件大小通常是有限制的,這是我們就需要壓縮圖片大小以達到平臺的上傳要求。之前也介紹過使用軟體壓縮大小的方法,接下來就介紹另一種方法--在線壓縮圖片大小。
  • 2種免費方法讓手機圖片無損壓縮
    手機圖片如何壓縮到最小?如今手機像素越來越高,雖然拍出的照片越來越高清,但佔用內存也越來越大,特別是進行上傳或發送等操作時,經常因為圖片超出大小而失敗。是否有免費的方法能讓手機圖片無損壓縮呢?一、極速img1、打開手機百度直接搜索極速img,打開其網站首頁即可開始壓縮;2、點擊頁面「+」上傳圖片或將圖片直接拖到此頁面均可。
  • 性能優化測試中的相關名詞
    同時單幀耗時滿足大於兩倍電影幀耗時1000ms/24*2 (由於人眼低於24幀才能辨別畫面不連續性),則認為是一次真正卡頓。同時若單幀耗時大於3倍電影幀耗時,則認為是一次嚴重卡頓。 註解:為什麼是兩次vsync?GPU一般是3重緩衝buffer,當前幀已佔用一個buffer,即剩餘2緩衝buffer,人眼一般可容忍2幀延遲。為什麼是兩幀電影幀耗時?
  • 在Chrome瀏覽器播放視頻Windows內存佔用過高如何解決?
    一般一臺伺服器的運行內存會隨著我們打開程序而被佔用,運行的程序越多,則佔用的內存越高,當內存佔用到一定程度,就會造成電腦的卡頓。比如我們在運行EasyNVR視頻平臺時,視頻拉流播放的操作會造成伺服器的負責,這時內存佔用就會增加。
  • 為什麼手機內存老是不足 如何解決手機內存不足的狀況【圖解】
    很多親都喜歡大內存的手機,但眾所周知大內存的手機價格往往都比較高。所以有些親就買了相對較低內存的手機,買好之後就後悔了,根本不夠用嘛。尤其對於女同胞們,光光相冊就是滿滿的好幾個G的內存佔用量。再加上些雜七雜八的應用,不知不覺「手機內存不足」的提示就不停地跳出來。那麼手機內存老是不足該怎麼辦呢?小編在這裡給大家整理了一些方法,希望有用。
  • 威剛單條32GB DDR4筆記本內存評測:跟爆內存和卡頓說拜拜
    就以我目前使用的戴爾Insprion 5480筆記本來說,當初購買的時候選擇了丐版內存,只有區區4GB,雖然i5 8265U的性能並不弱,但實際使用中被這4GB內存拖了後腿,多開幾個程序就出現卡頓、遲緩,用了一段時間很不爽。趁著現在內存白菜價,乾脆買一根大容量內存擴容算了,什麼8G、16G對我這樣喜歡多開程序的人來說還是不夠用,乾脆直接一步到位買根32G的內存得了。
  • 實例分析壓縮比對大平方線束產品溫升性能的影響
    通過實際的案例分析,讓大家了解壓接標準上的壓縮比參數對於產品的溫升電氣性能的重要影響;關鍵詞:案例分析,壓縮比,溫升;眾所周知,壓接對於線束產品的機械,電氣和物理性能有很多直接或者間接性的影響。壓接的一個核心標準就是壓縮比。