深度網絡數據編碼新突破,上交大SPARK登上計算機體系結構頂會
隨著深度神經網絡(DNNs)模型在規模和復雜性上的迅速增長,傳統的神經網絡處理方法面臨著嚴峻的挑戰?,F有的神經網絡壓縮技術在處理參數規模大、精度要求高的神經網絡模型時效率低下,無法滿足現有應用的需求。
數值量化是神經網絡模型壓縮的一種有效手段。在模型推理過程中,低位寬(比特)數據的存取和計算可以大幅度節省存儲空間、訪存帶寬與計算負載,從而降低推理延遲和能耗。當前,大多數量化技術的位寬在 8bit。更為激進的量化算法,必須要修改硬件的操作粒度與數據流特征,才能在真實推理時獲得接近理論的收益。比如混合精度量化,激活數據的量化等方案。一方面,這些方案會顯式增加 book-keeping 存儲開銷和硬件邏輯,使得實際收益下降 [1,2,3]。另一方面,一些方案利用分布特征對量化范圍和粒度做約束,來減小上述硬件開銷 [4,5]。但其精度損失也受到不同模型和參數分布的影響,無法滿足現有應用的需求。
為此,本文的研究者提出了 SPARK 技術,一種可擴展細粒度混合精度編碼的軟硬件協同設計。
其核心優勢如下:
- 固有比特冗余:SPARK 不對模型進行壓縮,而是剔除數據表示中固有的比特冗余,與現有的壓縮方案正交,可以協同使用。
- 變長編碼方案:SPARK 創新了變長數據表示格式,有效壓縮模型大小,不需要增加額外的 book-keeping(如 index 等)代價(如硬件,訪問與更新延遲)。該編碼方案對模型參數與激活值同樣適用。
- 硬件兼容性:SPARK 不需要修改硬件加速器微架構(如:脈動陣列),不會引入額外的設計復雜性,可行性較高。
- 平衡精度與效率:在大型模型中,SPARK 通過其高效的編碼機制,不僅提升了處理速度,還精確地保持了模型的準確性。與其他同類型加速器相比平均獲得了 4.65 倍的加速,降低了 74.7% 的能耗。
研究動機
本工作源于對模型參數與激活值分布的觀察分析:由于權重和激活的分布成長尾型,量化后的數據仍會保持該分布,呈現高位稀疏的特性。具體的,按 INT8 精度量化后的模型參數中,80% 左右的數據都可以用 INT4 表示,只有一小部分較重要的值需要高位寬存儲,如圖 1 所示。
圖 1 不同網絡中 INT4 范圍內數據和 INT8 范圍內數據的比例
為了利用數據表示中固有的比特冗余,作者提出了 SPARK—— 一種可變長度的編碼方案,通過引入一位指示符和新穎的編解碼模式來支持混合精度。這種編碼方案電路設計簡單,而且維持存儲對齊。
主要方法
在 SPARK 中,本工作只簡單地用最高位作為指示符區分高 / 低精度數據,而不同于其他分離尾數域和指數域的復雜編碼策略。同時,模型訓練時就可以模擬該編碼行為,而不用進行訓練后微調來補償由量化帶來的精度損失。
編碼方案及電路設計
該工作以 INT8 量化為例,每個數據為 8bit unsigned 整型。原始數據的編碼表示為(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7),具體的編碼原則如圖 2 所示。
1. 當原編碼中只有b4 - b7 這低 4 位包含非零有效位時,直接進行低精度無損編碼,縮短為 4bit,其中最高位 C4 是指示符位,設為 0。
2. 當原編碼中 b0-b3 這高 4 位也包含非零有效位時,進行高精度編碼。其中,最高位 c0 為指示符位,設為 1。之后,視 b0 異或 b3 的結果,決定是否進行有損近似編碼或無損編碼。
a) 當原數值范圍在 [8, 127],即 b3-b1 位包含非零有效位時,最高位的指示符位不作為數值位計算。當 b3 位為 1 時,在編碼階段將 b3 位設為 0 并將低 4 位 C4-C7 補償為 1111。雖然,這一步是有損的,但由于補償效應、損失精度較小。
b) 當原數值范圍在 [128, 255],即 b7-b0 位這 8 位都包含非零有效位時,最高位的指示符位作為數值位計算。當 b3 位為 0 時,在編碼階段將 b3 位設為 1 并將低 4 位 C4-C7 補償為 0000。
當然,該工作也可以更激進地舍棄這些 fixed bit 進一步壓縮存儲容量與帶寬,但需要在解碼階段把 fixed bit 填補后再將 8bit 數據送入計算單元。這會增加一些解碼器的硬件開銷。
圖 2 SPARK 編碼對于不同范圍的原數據的應用
硬件上實現該編碼器只需要用到零檢測器,多路選擇器和異或門等熟知的硬件模塊,具體電路設計如圖 3 所示:輸入 8bit 的原始數據,b0 ~ b4 先經過一個 5bit 的零檢測器,判定該輸入編碼為高 / 低精度,如果編碼為低精度則直接輸出 b4 , b5 , b6 , b7,若編碼為高精度,則根據公式 1 和公式 2 分情況編碼。
圖 3 SPARK 方案的編碼器電路設計
解碼方案及電路設計
本工作設計了一個硬件友好的解碼方案,下面將闡述如何將編碼轉換為十進制值。首先,本工作假定大端序存儲(Big Endian),解碼時輸入位寬為 4bit,使能信號 1 位。
解碼器電路需要的硬件模塊為熟知的多路選擇器,或門和非門。具體實現如圖 4 所示,解碼器每個周期讀入 4bit 數據和使能信號。
當使能信號為 1,則指該輸入是高精度值得后半部分編碼;當使能信號為 0 時,若 c0 = 0,則判定輸入是低精度值直接輸出 c0c1c2c3 為解碼值,若 c0 = 1 則根據 c3 判定將指示符位作為數值位計算。公式 3 闡述了具體的判定規則,圖 4 是解碼器的電路設計圖。
圖 4 SPARK 方案的解碼器設計
整體架構
SPARK 可以與常用的張量運算核心(脈動陣列,乘加樹等)很好的兼容。如圖 5 所示,解碼器放置在 weight buffer 與 PE 之間,在參數灌入 PE 陣列之前解碼;同樣也放置在 Activation Buffer 與 PE 之間,在激活值灌入 PE 陣列之前解碼。編碼則分為兩部分。對于參數的編碼可以離線進行,在 DRAM 中直接存儲已經編碼壓縮后的參數。在線硬件編碼器則放置在 PE 計算完產生 Activation 之后。
若要進一步挖掘計算效率上的提升,則可以設計一個常見的混合位寬運算單元(SPARK PE Unit),支持兩個 8bit 操作數的 MAC 操作,或者 2 對 4 個 4bit 操作數的 MAC 操作。
圖 5 SPARK 整體架構圖
實驗結果
文章使用 CNN-based 和 attention-based 的模型簇進行實驗,在 ImageNet 數據集上測試了 VGG-16,ResNet-18,ResNet-50 網絡,在 GLUE 數據集上測試 BERT-based 模型,以及 ViT 模型。與 SPARK 進行對比的 baseline 架構有:Eyeriss [6], BitFusion [7], OLAccel [1], ANT [8], Olive [9]。
模型準確性評估
在 ImageNet 數據集上,和原始的 FP32 模型相比,SPARK 上的平均準確率損失大約為 0.1%,對于 attention-based 的模型,SPARK 獲得了更好的準確性(+0.6%)。表 1 和表 2 展示了準確性評估的結果。
表 1 SPARK 和其他沒有微調的架構在精度損失和平均存儲位寬上的比較
表 2 SPARK 和其他架構在 SST-2 數據集上測試 BERT 的精度損失和位寬比較
性能和能耗評估
執行效率上,圖 5 展示了不同加速器在六個網絡上的執行效率對比。和其他架構相比,SPARK 最多獲得了 4.65 倍的加速,在 ResNet-50 網絡上,SPARK 有 80.1% 的明顯性能提升。
圖 5 不同架構設計的延遲比較
能耗上,圖 6 展示了不同架構的 DRAM,BUFFER,CORE 的能耗貢獻在 5 個網絡上的比較結果。對于 ResNet-50,SPARK 最多下降了 74.7%。
圖 6 不同架構設計的能耗比較
結語
SPARK 利用數據表示中的比特冗余,結合高效的編解碼方案,使得 AI 模型在保證精度需求的情況下,利用本就存在的比特稀疏,這對于計算、存儲、傳輸都帶來了巨大的開銷節省。在處理越來越大的模型時,SPARK 展現出了其獨特的優勢。它不僅能夠處理大規模數據,還能在精度極其敏感的場景下保持高效率。這一點對于現在 AI 應用尤為關鍵,如自動駕駛、醫學診斷和語言處理等。
在未來,這套編碼方法還可以進一步擴展到交換芯片,存儲盤控芯片等關鍵位置,用于優化 AI 數據中心的通信瓶頸。
這一工作由上海交大先進計算機體系結構實驗室蔣力教授課題組(IMPACT)完成,同時也獲得了上海期智研究院的支持。第一作者是劉方鑫教授與博士生楊寧。