如何在英特爾? 平臺上實現高效的大語言模型訓練后量化
作者:英特爾公司 陸彤、何欣、郭恒、程文華、王暢、王夢妮、沈海豪
本文介紹了可提升大語言模型的訓練后量化表現的增強型 SmoothQuant 技術,說明了這項技術的用法,并證明了其在準確率方面的優勢。此方法已整合至英特爾? Neural Compressor(1) 中。英特爾? Neural Compressor 是一個包含量化、剪枝(稀疏性)、蒸餾(知識提煉)和神經架構搜索等多種常用模型壓縮技術的開源 Python 庫。目前,諸如 TensorFlow、英特爾? Extension for TensorFlow(2) 、PyTorch、英特爾? Extension for PyTorch(3) 、ONNX Runtime 和 MXNet等主流框架,都能與之兼容。
英特爾? Neural Compressor 已經支持多款英特爾? 架構的硬件,比如英特爾? 至強? 可擴展處理器(4) 、英特爾? 至強? CPU Max 系列(5) 、英特爾? 數據中心 GPU Flex 系列(6) 和英特爾? 數據中心 GPU Max 系列(7) 。本文涉及的實驗基于第四代英特? 至強? 可擴展處理器(8) 進行。
大語言模型
大語言模型 (Large Language Model, LLM) 需基于海量數據集進行訓練,可能擁有數十億權重參數。其先進的網絡結構和龐大的參數量,使它們能夠很好地應對自然語言本身的復雜性。完成訓練后的大語言模型,可針對各種下游的自然語言處理 (NLP) 和自然語言生成 (NLG) 任務進行調優,讓其更適合對話式聊天機器人(如 ChatGPT)、機器翻譯、文本分類、欺詐檢測和情感分析等任務場景。
大語言模型部署面臨的挑戰
大語言模型在執行自然語言處理和自然語言生成任務方面表現出色,但其訓練和部署頗為復雜,主要面臨以下挑戰:
- AI 與內存墻(9) 瓶頸問題:算力每兩年提高 3.1 倍,內存帶寬卻只提高 1.4 倍;
- 網絡帶寬挑戰:訓練大語言模型需要采用分布式系統,這對網絡帶寬提出了較高要求;
- 系統資源有限:訓練后的模型往往會部署在算力和內存資源均有限的系統上。
因此,采用訓練后量化的方法來為大語言模型瘦身,對于實現低時延推理至關重要。
大語言模型的量化
量化是一種常見的壓縮操作,可以減少模型占用的內存空間,提高推理性能。采用量化方法可以降低大語言模型部署的難度。具體來說,量化是將浮點矩陣轉換為整數矩陣:
其中 X_fp32、S 和 Z 分別為輸入矩陣、比例因子和整數零點。
有關每通道 (per-channel) 量化策略雖然可能會減少量化損失,但不能用于激活值量化的原因,請參看 SmoothQuant 相關文檔(10) 。不過,激活值量化誤差損失卻是導致模型量化準確率下降的重要因素。為此,人們提出了很多方法來降低激活值量化損失,例如:SPIQ(11) 、Outlier Suppression(12) 和SmoothQuant(13) 。這三種方法思路相似,即把激活值量化的難度轉移到權重量化上,只是三者在轉移難度的多少上有所不同。
增強型 SmoothQuant
SmoothQuant 引入了一個超參數 α 作為平滑因子來計算每個通道的量化比例因子,并平衡激活值和權重的量化難度。
其中 j 是輸入通道索引。
對于OPT 和 BLOOM 等大多數模型來說,α=0.5 是一個能夠較好實現權重和激活值量化難度分割的平衡值。模型的激活異常值越大,就越需要使用更大的 α 值來將更多的量化難度轉移到權重上。
原始的 SmoothQuant 旨在通過針對整個模型使用一個固定值 α 來分割權重和激活值的量化難度。然而,由于激活異常值的分布不僅在不同模型之間存在差異,而且在同一模型的不同層之間也不盡相同,因此,本文推薦使用英特爾? Neural Compressor 的自動調優能力,逐層獲取最佳 α 值。
相關方法包括以下五個主要步驟(偽代碼如下所示):
- 通過特殊的回調函數 register_forward_hook 捕獲 (hook) 模型各層的輸入和輸出值。
- 根據用戶定義的 α 范圍和步長生成一個 α 值列表。
- 根據給定的 α 值重新計算平滑因子并調整參數(權重值和激活值)。
- 對權重執行每通道量化與反量化 (quantization_dequantization),對輸入值執行每張量 (per-tensor) 量化與反量化,以預測與給定 α 值對應的每層輸出值。
- 計算相對實際輸出值的均方損失,將調整后的參數恢復回來,并保存每層的最佳 α 值。
本文提出的方法支持用多個標準(如最小值、最大值和平均值)來確定 Transformer 塊的輸入層歸一化 (LayerNorm) 操作的 α 值。實驗發現,將 α 范圍設為 [0.3, 0.7],步長設為 0.05,對大多數模型來說都能達到很好的平衡。
這一方法有兩個顯著特點:一是全自動化,二是比原始方法支持的融合模式多。
下圖提供了在 BLOOM-1b7 模型上執行 SmoothQuant α 值自動調優的樣例代碼:
啟用增強型 SmoothQuant 的樣例代碼
用戶只需傳遞一個模型名稱 (model_name) 和一個數據加載器。值得注意的是,模型分析主要依靠的是 Torch JIT。用戶可以在加載 Hugging Face 模型(14) 時將 torchscript 設置為 True,或將 return_dict 設置為 False。更多信息請參閱英特爾? Neural Compressor 文檔(10) 。
結果
本文提出的增強型 SmoothQuant 的主要優勢在于提高了準確率。
經過對多種主流大語言模型的評估,具備自動調優能力的 INT8 SmoothQuant 最后一個詞元 (last-token) 的預測準確率要高于原始 INT8 SmoothQuant 和 FP32 基線方法。詳見下圖:
FP32 基線方法、INT8(啟用和不啟用 SmoothQuant)以及 INT8(啟用本文提出的增強型 SmoothQuant)的準確率對比
從上圖可以看出,在 OPT-1.3b 和 BLOOM-1b7 模型上,本文提出的增強型 SmoothQuant 的準確率比默認的 SmoothQuant 分別高 5.4% 和 1.6%。量化后的模型也縮小到 FP32 模型的四分之一,大大減少了內存占用空間,從而有效地提升大模型在英特爾? 平臺上的推理性能。
更全面的結果請見GitHub 存儲庫(10) 。同時,也歡迎您創建拉取請求或就GitHub 問題(15) 發表評論。期待聽到您的反饋意見和建議。
作者:
英特爾公司人工智能資深架構師沈海豪、英特爾公司人工智能資深軟件工程師程文華、英特爾公司人工智能軟件工程師陸彤、何欣、郭恒、王暢、王夢妮,他們都在從事模型量化及壓縮的研究與優化工作。
注釋:
1、英特爾? Neural Compressor
https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/neural-compressor.html
2、英特爾? Extension for TensorFlow
https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/optimization-for-tensorflow.html
3、英特爾? Extension for PyTorch
https://www.intel.cn/content/www/cn/zh/developer/tools/oneapi/optimization-for-pytorch.html
4、英特爾? 至強? 可擴展處理器
https://www.intel.cn/content/www/cn/zh/products/details/processors/xeon/scalable.html
5、英特爾? 至強? CPU Max 系列
https://www.intel.cn/content/www/cn/zh/products/details/processors/xeon/max-series.html
6、英特爾? 數據中心 GPU Flex 系列
https://www.intel.cn/content/www/cn/zh/products/details/discrete-gpus/data-center-gpu/flex-series.html
7、英特爾? 數據中心 GPU Max 系列
https://www.intel.com/content/www/us/en/products/details/discrete-gpus/data-center-gpu/max-series.html
8、第四代英特? 至強? 可擴展處理器
https://www.intel.cn/content/www/cn/zh/events/accelerate-with-xeon.html
9、AI 與內存墻
https://medium.com/riselab/ai-and-memory-wall-2cb4265cb0b8
10、SmoothQuant 相關文檔 / 英特爾? Neural Compressor 文檔 / GitHub 存儲庫
https://github.com/intel/neural-compressor/blob/master/docs/source/smooth_quant.md
11、SPIQ
https://arxiv.org/abs/2203.14642
12、Outlier Suppression
https://arxiv.org/abs/2209.13325
13、 SmoothQuant
https://arxiv.org/abs/2211.10438
14、Hugging Face 模型
https://huggingface.co/models
15、GitHub 問題
https://github.com/intel/neural-compressor/issues