大模型(LLM)的量化技術Quantization原理學習

在自然語言處理領域,大型語言模型(LLM)在自然語言處理領域的應用越來越廣泛。然而,隨著模型規模的增大,計算和存儲資源的需求也急劇增加。為了降低計算和存儲開銷,同時保持模型的性能,LLM大模型的量化技術應運而生

1. 量化的技術原理

LLM大模型的量化技術主要是通過對模型參數進行壓縮和量化,從而降低模型的存儲和計算復雜度。具體來說如下:

  • 參數壓縮
    通過將模型中的浮點數參數轉換為低精度的整數參數,量化技術可以實現參數的壓縮。這不僅可以減少模型所需的存儲空間,還可以降低模型加載的時間
  • 計算加速
    由于低精度整數運算的速度遠快于浮點數運算,量化技術還可以通過降低計算復雜度來實現計算加速。這可以在保證模型性能的同時,提高模型的推理速度

量化技術的三個主要目的:節省顯存加速計算降低通訊量。它們往往不會同時在場,不同的應用場景下應當對癥下藥

1.1. 神經網絡中的數據類型

在這里插入圖片描述

  • FP32:在深度學習中,單精度浮點數格式FP32是一種廣泛使用的數據格式,其可以表示很大的實數范圍,足夠深度學習訓練和推理中使用。這種格式使用4個bytes(32bits)表示。
  • Tensor Float 32: Tensor Float 32是Tensor Core支持新的數值類型,從NVIDIA A100中開始支持。A100的普通FP32的峰值計算速度為19.5TOPs,而TF32的峰值計算速度為156TOPs,提升了非常多
    在深度學習中,其實我們對浮點數的表示范圍比較看重,而有效數字不是那么重要。在這個前提下,TF直接就把FP32中23個分數值截短為10bits,而指數位仍為8bits,總長度為19(=1+8+10)bits。至于為什么是10bits 就夠了,那是因為FP16就只有10bits用來表示分數值。而在實際測試中,FP16的精度水平已經足夠應對深度學習負載,只是表示的范圍不夠廣而已
  • FP16: FP16是一種半精度浮點格式,深度學習有使用FP16而不是FP32的趨勢,因為較低精度的計算對于神經網絡來說似乎并不重要。額外的精度沒有任何作用,同時速度較慢,需要更多內存并降低通信速度。
  • BFLOAT16: 由Google開發的16位浮點格式稱為“Brain Floating Point Format”,簡稱“bfloat16”。這個名字來源于“Google Brain”,這是谷歌的一個人工智能研究小組。
    FP16設計時并未考慮深度學習應用,其動態范圍太窄。BFLOAT16解決了這個問題,提供與FP32相同的動態范圍。其可以認為是直接將FP32的前16位截取獲得的,現在似乎也有取代FP16的趨勢。

1.2. 量化是如何縮小模型的?

目前發現不使用4字節FP32精度轉而使用2字節BF16/FP16半精度可以獲得幾乎相同的推理結果,同時模型大小會減半。這促使開發者想進一步削減內存,如果再從2字節半精度轉成僅1字節的8bits數據類型,甚至4bits類型呢?實際上,對于大模型最常見的就是8bits量化(FP8/INT8)和4bits量化(FP4/NF4/INT4)。

量化通過減少每個模型權重所需的位數,顯著降低了模型的大小。模型一個典型的場景是將權重從FP16(16位浮點)減少到INT4(4位整數)。同時,在內存中傳輸時,也顯著降低了帶寬占用。這允許模型在更便宜的硬件上或以更高的速度運行。通過降低權重的精度,LLM的整體質量也會受到一些影響。

研究表明這種影響因所使用的技術而異,較大的模型受到精度變化的影響較小。更大的型號(超過70B)即使轉換為4bits也能保持其性能。一些技術,如NF4,表明對其性能沒有影響。因此,對于這些較大的型號,4bits似乎是性能和大小/速度之間的最佳折衷,而對于較小的型號,8bits量化可能更好。

  • 較大的模型(如超過70B)使用4bit量化其性能沒有影響
  • 較小的模型使用8bit量化可能更好

下面以Qwen-7B-Chat為例展示INT8和INT4量化的效果【模型效果的評估模型介紹參見附錄】
在這里插入圖片描述

2. LLM量化的使用場景

LLM量化技術在以下場景中非常有用:

  • 移動設備和邊緣計算:大型語言模型通常需要大量的存儲和計算資源。通過量化,可以將模型壓縮到適合移動設備和邊緣設備的大小,以便實現更高效的推理。
  • 云端部署:在云端部署大型語言模型時,存儲和計算成本也是一個重要考慮因素。量化可以幫助降低云端服務器的資源需求。

3. 為什么需要量化

  • 存儲空間優化:大型語言模型的參數數量龐大,存儲這些參數需要大量的顯存。通過量化可以顯著減小模型的存儲空間。
  • 計算速度優化:低精度的整數運算比浮點數運算更快。量化可以加速模型的推理過程。

4. 如何量化?

4.1. 量化的分類

根據量化后的目標區間

可以分為四類:

  • 二值量化(1, -1)、
  • 三值量化(-1, 0, 1)、
  • 定點數量化(INT4, INT8),最常見的量化方式
  • 2 的指數量化。
    在這里插入圖片描述

根據量化節點的分布

可以分為均勻量化非均勻量化
非均勻量化可以根據待量化參數的概率分布計算量化節點。如果某一個區域參數取值較為密集,就多分配一些量化節點,其余部分少一些。這樣量化精度較高,但計算復雜度也高。

在這里插入圖片描述
現在 LLM 主要采用的是均勻量化,它又可以分為對稱量化、非對稱量化。前者是后者的一種特殊情況
量化,就是要選擇合適的量化系數,平衡截斷誤差和舍入誤差

非對稱量化

在這里插入圖片描述

對稱量化

在這里插入圖片描述

4.2 量化算法

根據量化的時機,有量化感知訓練和訓練后量化兩條路徑。

訓練后量化 PTQ

將已經訓練好的模型的權重轉換為較低的精度,而無需任何再訓練。盡管PTQ簡單易實現,但由于權重值的精度損失,它可能會略微降低模型的性能。

  • 目前針對 LLM 的量化研究都集中在 Post-training quantization (PTQ)。像是 LLM.int8(), SmoothQuant, GPT-Q 都屬于這一范疇
    對于權重而言,我們可以在推理前事先計算好量化系數,完成量化。但是對于激活(即各層的輸入),它們事先是未知的,取決于具體的推理輸入,會更加棘手。根據對激活的量化,分為動態與靜態量化。
    • 動態量化:顧名思義,這是 on-the-fly 的方式:推理過程中,實時計算激活的量化系數,對激活進行量化。
    • 靜態量化:與動態量化相反,靜態量化在推理前就計算好激活的量化系數,在推理過程中應用即可。

量化感知訓練

與PTQ不同,QAT在訓練階段集成了權重轉換過程。這通常不會明顯降低模型性能,但對計算的要求更高。QLoRA就是一種高度使用QAT的技術。
Quantization Aware Training (QAT) 量化感知訓練:首先正常預訓練模型,然后在模型中插入“偽量化節點”,繼續微調。所謂“偽量化節點”,就是對權重和激活先量化,再反量化。這樣引入了量化誤差,讓模型在訓練過程中“感知”到量化操作,在優化 training loss 的同時兼顧 quantization error.
- 通過 QAT,可以減小量化誤差,嘗試用更低的位寬去量化模型。
- QAT 雖好,但插入“偽量化節點”后微調大大增加了計算成本,尤其是面對超大規模的 LLM。

4.3 量化粒度

量化,必然有相應的量化系數 。量化粒度指的是計算 時范圍大小——用到了多少個待量化參數。這個范圍越小,說明有更少的待量化參數共享同一個 ,量化誤差自然也越小。

  • per-tensor: (one scale factor) per-tensor,這是最簡單的一種方式,也是范圍最大的粒度——整個激活矩陣對應一個量化系數 ;對于權重矩陣也是如此。
  • per-token & per-channel
    在這里插入圖片描述
  • Group-wise
    在這里插入圖片描述
    注意:權重和激活可以選擇不同的量化粒度。譬如權重用 per-tensor,激活用 per-token。并且對于激活還有動態量化與靜態量化之分。

5. 量化的影響

  • 精度損失:量化技術會引入一定的精度損失,這可能導致模型性能的下降。因此,如何在保證性能的同時實現高效的量化是亟待解決的問題。
  • 計算速度提升:低精度的整數運算速度更快,可以加速模型的推理過程。
  • 可移植性:由于不同的硬件平臺對量化技術的支持程度不同,因此模型的移植性可能會受到影響。在實際應用中,需要考慮不同硬件平臺的兼容性和優化。

附錄

MMLU

MMLU(Massive Multitask Language Understanding)【大規模多任務語言理解能力】是一個新的基準,用于衡量在零樣本(zero-shot)和少樣本(few-shot)情形下,大模型在預訓練期間獲得的世界知識。
這使得該基準測試更具挑戰性,也更類似于我們評估人類的方式。

  • 該基準涵蓋 STEM、人文(humanities)、社會科學(social sciences)等領域的 57 個學科(subject)
  • 學科范圍從數學和歷史等傳統領域到法律和倫理等更為專業的領域。

它的難度從初級到高級,既考驗世界知識,又考驗解決問題的能力。 學科的粒度和廣度使該基準成為識別模型盲點的理想選擇。

C-Eval

C-Eval 是一個全面的中文基礎模型評估套件。它包含了13948個多項選擇題,涵蓋了52個不同的學科和四個難度級別,如下所示。您可以在 探索 中查看我們的數據集示例,或查看我們的論文了解更多細節。

在這里插入圖片描述

GSM8K

GSM8K 數據集是由 OpenAI 發布的小學數學題數據集,項目地址

GSM8K 由 8.5K 高質量的小學數學問題組成,這些問題都是由人類寫手創造的。我們將這些問題分為 7.5K 訓練問題和 1K 測試問題。這些問題需要 2 到 8 個步驟來解決,解決方法主要是使用基本的算術運算(+ - / *)進行一連串的基本計算,以得出最終答案。一個聰明的中學生應該能夠解決每個問題

HumanEval

HumanEval: Hand-Written Evaluation Set,是《Evaluating Large Language Models Trained on Code》中提到的一個代碼評測基準。

HumanEval的評估邏輯
每一個測試問題重復實驗n次,然后通過單元測試,計算平均通過率。我們可以在源碼地址中看到起執行邏輯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715581.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024最新算法:鸚鵡優化算法(Parrot optimizer,PO)求解23個基準函數(提供MATLAB代碼)

一、鸚鵡優化算法 鸚鵡優化算法(Parrot optimizer,PO)由Junbo Lian等人于2024年提出的一種高效的元啟發式算法,該算法從馴養的鸚鵡中觀察到的覓食、停留、交流和對陌生人行為的恐懼中汲取靈感。這些行為被封裝在四個不同的公式中…

c語言--qsort函數(詳解)

目錄 一、定義二、用qsort函數排序整型數據三、用qsort排序結構數據四、qsort函數的模擬實現 一、定義 二、用qsort函數排序整型數據 #include<stdio.h> scanf_S(int *arr,int sz) {for (int i 0; i < sz; i){scanf("%d", &arr[i]);} } int int_cmp(c…

消息隊列kafka

消息隊列解決的問題 1. 解耦&#xff0c;通過消息隊列實現應用之間解耦&#xff0c;模塊兒之間解耦 2. 跨線程/進程通信&#xff0c;通過消息隊列傳遞數據&#xff0c;實現不同線程/進程間通信 3. 提升系統穩定性&#xff0c;在高并發場景通過消息隊列緩沖&#xff0c;可以實…

哈啰Java 春招 24屆

時長 1h 3. 為什么使用分布式ID&#xff0c;解決了什么問題 4. Leaf算法了解嗎&#xff1f;講一下原理和工作流程以及優缺點 5. 有沒有可能導致id重復&#xff1f;該如何解決&#xff1f; 6. 項目中redis是如何運用的&#xff1f; 7. 項目中分布式鎖是如何實現的&#xff1f; 8…

解決在 Mac 上安裝 Adobe 軟件彈出提示:安裝包已經被損壞并且不能被打開。

問題&#xff1a; “INSTALLER” is damaged and can’t be opened. You should eject the disk image. 解決方法和步驟&#xff1a; 打開安裝包&#xff1b;將安裝包 “INSTALLER” 拖動復制到某個文件夾&#xff0c;復制后的文件路徑例如像這樣&#xff1a;/Users/michael…

LLC諧振變換器變頻移相混合控制MATLAB仿真

微?關注“電氣仔推送”獲得資料&#xff08;專享優惠&#xff09; 基本控制原理 為了實現變換器較小的電壓增益&#xff0c;同時又有較 高的效率&#xff0c;文中在變頻控制的基礎上加入移相控制&#xff0c; 在這種控制策略下&#xff0c;變換器通過調節一次側開關管 的開關…

leetcode 熱題 100_盛最多水的容器

題解一&#xff1a; 雙指針遍歷&#xff1a;容量計算公式為min(左高度&#xff0c;右高度)*底部距離&#xff0c;我們可以令底部距離逐步遞減&#xff08;左右兩邊的指針向中部移動&#xff09;。此時對于min(左高度&#xff0c;右高度)&#xff0c;假設較高的線向中部移動&…

帶你玩轉數據結構-單鏈表(適合初學者的文章,講解的很仔細哦)

前言: &#x1f388;個人主頁:&#x1f388; :???初階牛??? &#x1f43b;推薦專欄: &#x1f354;&#x1f35f;&#x1f32f; C語言進階 &#x1f511;個人信條: &#x1f335;知行合一 &#x1f349;本篇簡介:>:講解數據結構中鏈表的知識,;鏈表的分類,c語言實現單鏈…

重學Springboot3-@import注解的作用

重學Springboot3-import注解的作用 1. 引言2. Import 注解的基本用法3. 導入多個配置類4. 使用 Import 導入組件5. 使用 ImportSelector 和 ImportBeanDefinitionRegistrar6. 總結 1. 引言 在 Spring Framework 中&#xff0c;Import 注解是一個重要的元注解&#xff0c;它允許…

Linux 定時備份文件到另一臺服務器

1. 需求 用戶要求將 Tomcat 的日志文件定時備份到另一臺服務器。同事給我提供了一個寫好的 java 框架&#xff0c;但實在不想給用戶再維護另一個服務了&#xff0c;所以另尋他法。 2. 問題 使用 scp 等跨服務器傳輸命令時需要手動輸入用戶名的密碼才可進行文件傳輸&#xff…

騰訊云幻獸帕魯服務器使用Linux和Windows操作系統的具體性能比較是什么?

騰訊云幻獸帕魯服務器使用Linux和Windows操作系統的具體性能比較是什么&#xff1f; 首先&#xff0c;從內核效率來看&#xff0c;Linux在同等硬件條件下的性能優于Windows。這是因為Linux內核設計簡潔&#xff0c;對服務器工作負載進行了優化&#xff0c;能夠更好地利用系統資…

機器學習:從理論到實踐

機器學習&#xff1a;從理論到實踐 摘要 機器學習是人工智能的一個核心領域&#xff0c;它使計算機能夠通過經驗來改進性能。本文將介紹機器學習的基本概念、主要算法以及如何在實際項目中應用這些算法。我們將通過Python代碼示例來演示如何使用機器學習庫scikit-learn進行數…

Python學習 day07(JSON)

JSON 各種編程語言存儲數據的容器不盡相同&#xff0c;在Python中有字典dict這樣的數據類型&#xff0c;而其他語言可能沒有對應的字典&#xff0c;為了讓不同的語言都能夠相互通用的傳遞數據&#xff0c;JSON就是一種非常良好的中轉數據格式&#xff0c;如下&#xff1a; JSON…

mTSL: netty單向/雙向TLS連接

創建證書 不管是單向tls還是雙向tls(mTLS)&#xff0c;都需要創建證書。 創建證書可以使用openssl或者keytool&#xff0c;openssl 參考 mTLS: openssl創建CA證書 單向/雙向tls需要使用到的相關文件: 文件單向tls雙向tlsServer端Client端備注ca.key----需要保管好&#xff0…

MySQL知識點歸納總結(二)

10、MVCC實現原理&#xff1f; 事務ID&#xff08;Transaction ID&#xff09;&#xff1a;每個事務在執行時都會被分配一個唯一的事務ID&#xff0c;用于標識該事務的開始時間順序。事務ID是一個遞增的整數&#xff0c;隨著每個新事務的開始而遞增。 Undo日志&#xff08;Un…

【Web安全靶場】sqli-labs-master 38-53 Stacked-Injections

sqli-labs-master 38-53 Stacked-Injections 其他關卡和靶場看專欄… 文章目錄 sqli-labs-master 38-53 Stacked-Injections第三十八關-報錯注入第三十九關-報錯注入第四十關-盲注第四十一關-盲注第四十二關-聯合報錯雙查詢注入第四十三關-報錯注入第四十四關-盲注第四十五關-…

「爬蟲職海錄」三鎮爬蟲

HI&#xff0c;朋友們好 「爬蟲職海錄」第三期更新啦&#xff01; 本欄目的內容方向會以爬蟲相關的“崗位分析”和“職場訪談”為主&#xff0c;方便大家了解一下當下的市場行情。 本欄目持續更新&#xff0c;暫定收集國內主要城市的爬蟲崗位相關招聘信息&#xff0c;有求職…

【高級數據結構】Trie樹

原理 介紹 高效地存儲和查詢字符串的數據結構。所以其重點在于&#xff1a;存儲、查詢兩個操作。 存儲操作 示例和圖片來自&#xff1a;https://blog.csdn.net/qq_42024195/article/details/88364485 假設有這么幾個字符串&#xff1a;b&#xff0c;abc&#xff0c;abd&…

Vue中如何實現條件渲染?

在Vue中實現條件渲染非常簡單且靈活&#xff0c;主要通過Vue的指令來實現。在Vue中&#xff0c;我們可以使用v-if和v-else指令來根據條件來渲染不同的內容。下面就讓我們通過一個簡單的示例來演示如何在Vue中實現條件渲染&#xff1a; <!DOCTYPE html> <html lang&qu…

GO泛型相關

通過引入 類型形參 和 類型實參 這兩個概念&#xff0c;我們讓一個函數獲得了處理多種不同類型數據的能力&#xff0c;這種編程方式被稱為 泛型編程。 2. Go的泛型 類型形參 (Type parameter)類型實參(Type argument)類型形參列表( Type parameter list)類型約束(Type constr…