中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

專業(yè)網(wǎng)站建設(shè)品牌策劃方案惠州網(wǎng)站排名提升

專業(yè)網(wǎng)站建設(shè)品牌策劃方案,惠州網(wǎng)站排名提升,網(wǎng)站域名怎么過戶,nginx wordpress css文章目錄 一、數(shù)據(jù)類型1.1 整型1.2 定點(diǎn)數(shù)1.3 浮點(diǎn)數(shù)1.3.1 正規(guī)浮點(diǎn)數(shù)(fp32)1.3.2 非正規(guī)浮點(diǎn)數(shù)(fp32)1.3.3 其它數(shù)據(jù)類型1.3.4 浮點(diǎn)數(shù)誤差1.3.5 浮點(diǎn)數(shù)導(dǎo)致的模型訓(xùn)練問題 二、量化基本方法2.1 int8量化2.1.1 k-means 量化2.1.2 …

文章目錄

    • 一、數(shù)據(jù)類型
      • 1.1 整型
      • 1.2 定點(diǎn)數(shù)
      • 1.3 浮點(diǎn)數(shù)
        • 1.3.1 正規(guī)浮點(diǎn)數(shù)(fp32)
        • 1.3.2 非正規(guī)浮點(diǎn)數(shù)(fp32)
        • 1.3.3 其它數(shù)據(jù)類型
        • 1.3.4 浮點(diǎn)數(shù)誤差
        • 1.3.5 浮點(diǎn)數(shù)導(dǎo)致的模型訓(xùn)練問題
    • 二、量化基本方法
      • 2.1 int8量化
        • 2.1.1 k-means 量化
        • 2.1.2 線性量化
          • 2.1.2.1 零點(diǎn)量化(Zero-Point Quantization)
          • 2.1.2.2 絕對(duì)最大( absmax )量化
      • 2.2 INT4 和 FP4量化
      • 2.3 二值量化 (Binarization)
      • 2.4 三值量化 (Ternary Quantization)
      • 2.5 混合精度量化
    • 三、 訓(xùn)練后量化 (Post-Training Quantization)
      • 3.1 量化粒度
        • 3.1.1 逐張量量化(Per-Tensor Quantization)
        • 3.1.2 逐通道量化(Per Channel Quantization)
        • 3.1.3 組量化(Group Quantization)
      • 3.2 動(dòng)態(tài)量化參數(shù)的計(jì)算 ( Cliping )
        • 3.2.1 指數(shù)移動(dòng)平均(EMA)
        • 3.2.2 Min-Max
        • 3.2.3 KL 量化
        • 3.2.4 均方誤差(MSE)
      • 3.3 Rounding
    • 四、 量化感知訓(xùn)練(Quantization-Aware Training)
      • 4.1 前向傳播
      • 4.2 反向傳播

  • 《datawhale2411組隊(duì)學(xué)習(xí)之模型壓縮技術(shù)1:模型剪枝(上)》:介紹模型壓縮的幾種技術(shù);模型剪枝基本概念、分類方式、剪枝標(biāo)準(zhǔn)、剪枝頻次、剪枝后微調(diào)等內(nèi)容
  • 《datawhale11月組隊(duì)學(xué)習(xí) 模型壓縮技術(shù)2:PyTorch模型剪枝教程》:介紹PyTorch的prune模塊具體用法
  • 《datawhale11月組隊(duì)學(xué)習(xí) 模型壓縮技術(shù)3:2:4結(jié)構(gòu)稀疏化BERT模型》:介紹基于模式的剪枝——2:4結(jié)構(gòu)稀疏化及其在BERT模型上的測試效果
  • 項(xiàng)目地址:awesome-compression、在線閱讀
  • bilibli視頻《【精選課程】LLM大模型之精度問題(FP16,FP32,BF16)詳解》
  • 《Hugging Face高性能技術(shù)五:Transformer高效推斷(bitsandbytes、FlashAttention、 BetterTransformer)》

??語言模型一直在變大。例如PaLM 有 5400 億參數(shù),OPT、GPT-3 和 BLOOM 有大約 1760 億參數(shù),而且我們?nèi)栽诶^續(xù)朝著更大的模型發(fā)展。下圖總結(jié)了最近的一些語言模型的尺寸。
在這里插入圖片描述

??迄今為止,市面上顯存最大的 GPU 芯片是 80GB 顯存的 A100,因此這些模型無法在單個(gè)設(shè)備上運(yùn)行。舉個(gè)例子,如果我們使用 BLOOM-176B 模型的 Bfloat16 版本,其大小為 176 × 1 0 9 × 2 b y t e = 352 G B 176 \times 10^9 \times 2 byte=352GB 176×109×2byte=352GB。僅推理 BLOOM-176B 模型,就需要 8 個(gè) 80GB A100 。而如果要微調(diào)的話,則需要更多。

??移動(dòng)端的硬件資源是有限的,比如內(nèi)存和算力。而量化可以最直觀的減少模型的大小,從而減少內(nèi)存、硬盤和算力的占用。同時(shí),量化可以提高模型的推理速度。下圖為不同數(shù)據(jù)類型的加法和乘法操作的耗時(shí)對(duì)比。

在這里插入圖片描述
??以最常見的int8模型量化來說,其零花過程可以分為兩部分:將模型從 fp32 轉(zhuǎn)換為 int8 ;使用 int8 進(jìn)行推理,整個(gè)量化過程都和數(shù)據(jù)類型的轉(zhuǎn)換息息相關(guān),所以我們先講解最基礎(chǔ)的數(shù)據(jù)類型。

一、數(shù)據(jù)類型

1.1 整型

??如下圖所示,整型數(shù)據(jù)可以分為無符號(hào)整型(Unsigned Integer)和有符號(hào)整型(Signed Integer)。

  • 無符號(hào)整型:數(shù)據(jù)范圍為 0 到 2 n ? 1 2^{n-1} 2n?1,n 為數(shù)據(jù)位數(shù)。
  • 有符號(hào)整型:
    • 原碼表示(Sign-Magnitude Representation):其實(shí)現(xiàn)的原理是取二進(jìn)制數(shù)的最高位(左起第一位)為符號(hào)位,約定符號(hào)位為0時(shí)表示正數(shù),符號(hào)位為1時(shí)表示負(fù)數(shù),其余二進(jìn)制位則用于待表示數(shù)值的絕對(duì)值。數(shù)據(jù)范圍為 ? 2 n ? 1 ? 1 -2^{n-1}-1 ?2n?1?1 2 n ? 1 ? 1 2^{n-1}-1 2n?1?1,n 為數(shù)據(jù)位數(shù)。
    • 補(bǔ)碼表示(Two's Complement Representation):為了彌補(bǔ)原碼表示,有 +0 和 -0 兩種表示的缺點(diǎn),最高位除了具有符號(hào)表示的功能,也具有權(quán)重值。數(shù)據(jù)范圍為 ? 2 n ? 1 -2^{n-1} ?2n?1 2 n ? 1 ? 1 2^{n-1}-1 2n?1?1,n 為數(shù)據(jù)位數(shù)。
      在這里插入圖片描述

1.2 定點(diǎn)數(shù)

??定點(diǎn)數(shù),即在表示小數(shù)數(shù)據(jù)時(shí),把小數(shù)點(diǎn)的位置已經(jīng)約定好固定在某個(gè)位置。與之對(duì)應(yīng)的是浮點(diǎn)數(shù),其小數(shù)點(diǎn)的位置不是固定的。如下圖所示,指定藍(lán)色部分為符號(hào)位,綠色部分為整數(shù)位,橙色部分為小數(shù)位。
在這里插入圖片描述
??圖中,藍(lán)色格表示 ? 2 3 -2^3 ?23,綠色格依次表示 2 0 , 2 1 , 2 2 2^0,2^1,2^2 20,21,22,橙色格依次表示 2 ? 1 , 2 ? 2 , 2 ? 3 , 2 ? 4 2^{-1},2^{-2},2^{-3},2^{-4} 2?1,2?2,2?3,2?4。將每個(gè)格數(shù)字(0或1)乘以對(duì)應(yīng)scale就是最終結(jié)果。

1.3 浮點(diǎn)數(shù)

??定點(diǎn)數(shù)表示法采用固定的位數(shù)來表示整數(shù)和小數(shù)部分,這樣能很容易地進(jìn)行加減運(yùn)算,但范圍有限。而浮點(diǎn)數(shù)的計(jì)算方式不同于定點(diǎn)數(shù)中的簡單相加,它利用指數(shù)來擴(kuò)展數(shù)值的動(dòng)態(tài)范圍。這樣的計(jì)算方式允許浮點(diǎn)數(shù)在有限的位數(shù)下表示極大的數(shù)值范圍,例如從非常小的數(shù)(接近于零)到極大的數(shù)(如 1 0 38 10^{38} 1038 )。

1.3.1 正規(guī)浮點(diǎn)數(shù)(fp32)

在這里插入圖片描述

??在1EEE 754標(biāo)準(zhǔn)中,我們用fraction表示小數(shù)部分,exponent表示指數(shù)部分。二者的的位數(shù)分別決定了數(shù)據(jù)的精度表示范圍大小。對(duì)于FP32浮點(diǎn)數(shù)來說,其計(jì)算方式為:
f p 32 = ( ? 1 ) s i g n ? ( 1 + f r a c t i o n ) ? 2 e x p o n e n t ? 127 fp32 = (-1)^{sign}·(1+fraction)·2^{exponent-127} fp32=(?1)sign?(1+fraction)?2exponent?127

??如上圖所示,FP32格式使用8位來表示指數(shù),因此它的無符號(hào)整數(shù)范圍是0到255。如果我們希望指數(shù)可以表示負(fù)值,就需要一個(gè)偏置。通過設(shè)定偏置為127,指數(shù)范圍可以表示為:

指數(shù)實(shí)際值 = 存儲(chǔ)的指數(shù)值 ? 127 指數(shù)實(shí)際值 = 存儲(chǔ)的指數(shù)值 - 127 指數(shù)實(shí)際值=存儲(chǔ)的指數(shù)值?127

??選擇 2 ( 8 ? 1 ) ? 1 = 127 2^{(8-1)}-1=127 2(8?1)?1=127作為偏置的原因是為了確保實(shí)際指數(shù)范圍對(duì)稱。正規(guī)浮點(diǎn)數(shù)中,存儲(chǔ)的指數(shù)范圍是從 1 到 254(即存儲(chǔ)值從 00000001 到 11111110,全0和全1是特特殊情況),對(duì)應(yīng)的實(shí)際指數(shù)范圍是:?126到+127,可以均勻表示小于1的數(shù)和大于1的數(shù)。

?? 對(duì)于一個(gè)標(biāo)準(zhǔn)化(正規(guī))浮點(diǎn)數(shù),通常表示為:

value = ( ? 1 ) sign × 1. fraction × 2 exponent \text{value} = (-1)^{\text{sign}} \times 1.\text{fraction} \times 2^{\text{exponent}} value=(?1)sign×1.fraction×2exponent

?? 1. fraction 1.\text{fraction} 1.fraction 是尾數(shù)部分,其中 1 是隱含的,也就是說,雖然在存儲(chǔ)尾數(shù)時(shí),這個(gè)1并沒有明確存儲(chǔ)在內(nèi)存中,但它默認(rèn)存在,而 fraction 是實(shí)際存儲(chǔ)的尾數(shù)部分。

??例如對(duì)于數(shù)值 6.25,它可以表示為:

6.25 = 1.100 1 2 × 2 2 6.25 = 1.1001_2 \times 2^2 6.25=1.10012?×22

在內(nèi)存中,它會(huì)存儲(chǔ)為:

value = ( ? 1 ) 0 × 1.100 1 2 × 2 2 \text{value} = (-1)^{0} \times 1.1001_2 \times 2^2 value=(?1)0×1.10012?×22

但在內(nèi)存存儲(chǔ)時(shí),不會(huì)顯式存儲(chǔ)前面的 1,只存儲(chǔ) . 100 1 2 .1001_2 .10012?,這樣就省去了1位的存儲(chǔ)空間。

1.3.2 非正規(guī)浮點(diǎn)數(shù)(fp32)

??非正規(guī)浮點(diǎn)數(shù)是指數(shù)部分的值為最小值(即 0),但尾數(shù)部分不為零的浮點(diǎn)數(shù)。在這種情況下,尾數(shù)部分的表示不再以 1 開頭,而是以 0 開頭,所以叫非正規(guī)浮點(diǎn)數(shù)。數(shù)學(xué)表達(dá)式為:

( ? 1 ) sign × 0. fraction × 2 exponent ? bias (-1)^{\text{sign}} \times 0.\text{fraction} \times 2^{\text{exponent} - \text{bias}} (?1)sign×0.fraction×2exponent?bias

此時(shí),指數(shù)部分強(qiáng)制為 1-bias = -126 。此時(shí),非正規(guī)浮點(diǎn)數(shù)的有效數(shù)值范圍是非常小的。

在這里插入圖片描述

  • 正常浮點(diǎn)可表示的最小正值為 fraction = 0,exponent = 1,結(jié)果為 2 ? 126 2^{-126} 2?126
    ( 1 + 0 ) ? 2 1 ? 127 = 2 ? 126 (1+0)·2^{1-127} = 2^{-126} (1+0)?21?127=2?126
  • 正常浮點(diǎn)數(shù)可表示的最大值為 fraction = 2 ? 23 2^{-23} 2?23,結(jié)果為 ( 1 + 1 ? 2 ? 23 ) ? 2 127 (1+1-2^{-23})·2^{127} (1+1?2?23)?2127 。
  • 非正規(guī)浮點(diǎn)可表示的最小正值為 fraction = 2 ? 23 2^{-23} 2?23,結(jié)果為 2 ? 149 2^{-149} 2?149
    2 ? 23 ? 2 1 ? 127 = 2 ? 149 2^{-23}·2^{1-127} = 2^{-149} 2?23?21?127=2?149
  • 非正規(guī)浮點(diǎn)可表示的最大值為 fraction 部分全為1 ,結(jié)果為 2 ? 126 ? 2 ? 149 2^{-126}-2^{-149} 2?126?2?149。
  • 正規(guī)浮點(diǎn)數(shù)的小數(shù)部分全為0,指數(shù)部分全為1時(shí)分別表示正無窮和負(fù)無窮(inf-inf)。

??所以,非正規(guī)浮點(diǎn)數(shù)主要用于表示非常小的數(shù)值,確保在接近零時(shí),盡可能保持一定的精度,提高數(shù)值穩(wěn)定性和減少精度丟失問題。

1.3.3 其它數(shù)據(jù)類型

機(jī)器學(xué)習(xí)中常用的數(shù)據(jù)類型還有:

  • 當(dāng)expontent位數(shù)為5,fraction位數(shù)為11時(shí),為fp16。
    f p 16 = ( ? 1 ) s i g n ? ( 1 + f r a c t i o n ) ? 2 e x p o n e n t ? 15 fp16 = (-1)^{sign}·(1+fraction)·2^{exponent-15} fp16=(?1)sign?(1+fraction)?2exponent?15

指數(shù)的值從-14到15,共30個(gè)區(qū)間。能表示的最大數(shù)是 2 ( 30 ? 15 ) = 65504 2^{(30-15)}=65504 2(30?15)=65504,最小的非零數(shù)是 2 ? 14 2^{-14} 2?14。

  • 當(dāng)expontent位數(shù)為8,fraction位數(shù)為7時(shí),為bf16。
    b f 16 = ( ? 1 ) s i g n ? ( 1 + f r a c t i o n ) ? 2 e x p o n e n t ? 127 bf16 = (-1)^{sign}·(1+fraction)·2^{exponent-127} bf16=(?1)sign?(1+fraction)?2exponent?127
  • 當(dāng)expontent位數(shù)為4,fraction位數(shù)為3時(shí),為fp8(E4M3)。
    f p 8 = ( ? 1 ) s i g n ? ( 1 + f r a c t i o n ) ? 2 e x p o n e n t ? 7 fp8 = (-1)^{sign}·(1+fraction)·2^{exponent-7} fp8=(?1)sign?(1+fraction)?2exponent?7
  • 當(dāng)expontent位數(shù)為5,fraction位數(shù)為2時(shí),為fp8(E5M2)。
    f p 8 = ( ? 1 ) s i g n ? ( 1 + f r a c t i o n ) ? 2 e x p o n e n t ? 15 fp8 = (-1)^{sign}·(1+fraction)·2^{exponent-15} fp8=(?1)sign?(1+fraction)?2exponent?15

在這里插入圖片描述

1.3.4 浮點(diǎn)數(shù)誤差

??浮點(diǎn)數(shù)在計(jì)算機(jī)中的表示會(huì)涉及到精度誤差,原因在于其有限的表示方式。

??在計(jì)算機(jī)中,所有數(shù)字都通過二進(jìn)制表示。對(duì)于一個(gè)十進(jìn)制小數(shù)如9.23,計(jì)算機(jī)需要將其映射到二進(jìn)制表示中,并確定其所在的范圍和精確度。以fp16類型來說,正整數(shù)部分被劃分為多個(gè)區(qū)間:

[1,2)
[2,4)
[4,8)
[8,16)
...

??所以9.23被劃分在 [ 8 , 16 ) [8, 16) [8,16)區(qū)間內(nèi)(即 2 3 2^3 23 2 4 2^4 24之間)。這種區(qū)間劃分使得9.23可以通過以下方式表示:

  • 確定區(qū)間起點(diǎn)(8,即2的3次方)
  • 確定在此區(qū)間內(nèi)的相對(duì)位置(9.23比8多1.23)

??為了表示9.231.23部分,該區(qū)間被細(xì)分為1024個(gè)等份(fp16的尾數(shù)部分為10bit),每個(gè)等分大小為 s = 8 / 1024 = 0.0078125 s=8/1024=0.0078125 s=8/1024=0.0078125

??由于每個(gè)區(qū)間段的大小有限,計(jì)算機(jī)只能在這些細(xì)分點(diǎn)中找到最接近的數(shù)值,而1.23落在區(qū)間157s到158s之間,所以1.23只能被近似表示為 157 × s = 1.2265625 ≈ 1.2266 157\times s=1.2265625\approx 1.2266 157×s=1.22656251.2266,這意味著浮點(diǎn)數(shù)9.23在fp16中會(huì)被表示為8 + 1.2266 = 9.2266,這種近似導(dǎo)致精度損失??偨Y(jié)就是:

  • 二進(jìn)制無法精確表示某些十進(jìn)制小數(shù)(如1.23),因其需被轉(zhuǎn)化為有限的二進(jìn)制數(shù)。
  • 細(xì)分區(qū)間的有限分辨率帶來了約數(shù)值的逼近誤差。

??顯而易見的是, 隨著數(shù)值范圍的增大,精度的損失越嚴(yán)重,因?yàn)槲矓?shù)是固定劃分為1024個(gè)區(qū)間的。數(shù)學(xué)上來說,就是 f r a c t i o n ? 2 e x p o n e n t ? b i a s fraction·2^{exponent-bias} fraction?2exponent?bias擴(kuò)大了精度損失。

1.3.5 浮點(diǎn)數(shù)導(dǎo)致的模型訓(xùn)練問題

??FP16在深度學(xué)習(xí)模型訓(xùn)練中是一種精度較低的表示方式,容易出現(xiàn)浮點(diǎn)數(shù)溢出與精度損失問題。

  1. 上溢出

??FP16的最大正數(shù)為65504。當(dāng)試圖表示超過這個(gè)數(shù)的值(如65505)時(shí),浮點(diǎn)數(shù)不會(huì)發(fā)生溢出,但會(huì)發(fā)生精度損失。當(dāng)浮點(diǎn)數(shù)超過fp16能表示的最大值才會(huì)發(fā)生上溢出,,通常表示為無窮大inf。

  1. 下溢出

??在softmax,sigmoid,attention等涉及指數(shù)運(yùn)算的過程中,容易導(dǎo)致上溢出問題。一個(gè)常見的優(yōu)化方法是在計(jì)算前先進(jìn)行歸一化,比如對(duì)輸入圖片(0-255的ndarray表示)歸一化到[-1,1];或者是訓(xùn)練時(shí)使用fp32類型。

??如果數(shù)值非常小,則可能發(fā)生下溢出,即數(shù)值被“舍入”到零,這對(duì)于一些非常小的數(shù)值表示時(shí)會(huì)有問題。比如模型后期梯度計(jì)算中梯度等于e-7,或者是在標(biāo)準(zhǔn)化(如Batch Normalization、Layer Normalization)操作中需要計(jì)算 x ′ = x ? μ σ 2 {x}'=\frac{x-\mu }{\sigma^{2} } x=σ2x?μ?,當(dāng)batch size很小或者數(shù)值都很接近時(shí),方差過小,也可能導(dǎo)致數(shù)值下溢出。

  1. nan
    指數(shù)計(jì)算和均值計(jì)算中,當(dāng)數(shù)值很大時(shí),都有可能出現(xiàn)nan
m1=torch.tensor(100000,dtype=torch.float16).cuda()
m2=torch.tensor(200000,dtype=torch.float16).cuda()
print(torch.exp(m1)/(torch.exp(m1)+torch.exp(m2)))
tensor(nan,device='cuda:0,dtype=torch.float16)

最簡單的避免方式是減去最大值,有嚴(yán)格的數(shù)學(xué)推導(dǎo):

print(torch.exp(m1-max(m1,m2))/(torch.exp(m1-max(m1,m2))+torch.exp(m2-max(m1,m2)))

均值計(jì)算中也容易出現(xiàn)nan,

s=torch.tensor(500000*[1000],dtype=torch.float16)
print(torch.mean(s))

??另外,模型輸入的異常值可能導(dǎo)致數(shù)值溢出或不穩(wěn)定,進(jìn)而導(dǎo)致模型計(jì)算產(chǎn)生NaN值;有時(shí),當(dāng)batch size過大時(shí),可能會(huì)導(dǎo)致計(jì)算過程中的溢出問題。

  1. 相加精度損失
    當(dāng)一個(gè)較小的數(shù)值加到一個(gè)較大的數(shù)值時(shí),可能會(huì)因?yàn)榫认拗茖?dǎo)致“加了等于沒加”的情況。
import torchpi_16=torch.tensor(3.141,dtype=torch.float16)
print("3.141的float16表示",pi_16)
pi_32=torch.tensor(3.141,dtype=torch.float32)
print("3.141的float32表示",pi_32)
print("3.141的float16轉(zhuǎn)float32表示",pi_16.float())
3.141的float16表示 tensor(3.1406, dtype=torch.float16)
3.141的float32表示 tensor(3.1410)
3.141的float16轉(zhuǎn)float32表示 tensor(3.1406)
s=torch.tensor(0.0005,dtype=torch.float16)
print(pi_16+s)
print(pi_32+s)
tensor(3.1406, dtype=torch.float16)
tensor(3.1415)

??在訓(xùn)練過程中,尤其是模型微調(diào)時(shí),更新的梯度通常會(huì)很小,學(xué)習(xí)率也很小。參數(shù)更新時(shí),由 W ( t + 1 ) = W ( t ) ? η ? g r a d i e n t W^{(t+1)} = W^{(t)} - \eta \cdot gradient W(t+1)=W(t)?η?gradient可知,可能會(huì)因?yàn)榫炔蛔銓?dǎo)致“加了等于沒加”的情況,從而無法更新參數(shù),訓(xùn)練過程停滯,即因?yàn)閿?shù)值精度丟失,導(dǎo)致模型無法有效更新。下圖為 SSD 網(wǎng)絡(luò)在訓(xùn)練過程中的梯度統(tǒng)計(jì),有67%的值下溢出變成 0。
在這里插入圖片描述
為了避免梯度消失(即“下溢出”),可以放大損失函數(shù)(Loss function):

  • 在損失計(jì)算后,使用FP32表示來存儲(chǔ)損失函數(shù),防止精度丟失。
  • 放大損失函數(shù)的數(shù)值,使其足夠大,從而避免下溢出。
  • 然后使用FP16表示的梯度進(jìn)行更新,并在更新后將結(jié)果縮小到原始范圍。

在這里插入圖片描述

二、量化基本方法

2.1 int8量化

??INT8量化 是一種常見的低位量化方法,它將浮點(diǎn)數(shù)(通常是32位浮點(diǎn)數(shù))映射到8位整數(shù)(INT8)表示。量化后的數(shù)值范圍通常是 [-128, 127],但不包括 -128,這有助于優(yōu)化推理。以下是 INT8 量化的基本步驟:

  • 計(jì)算量化步長(scale)和零點(diǎn)(zero-point)。
  • 將浮點(diǎn)數(shù)值映射到整數(shù),通常使用線性公式: q ( x ) = round ( x ? zero_point scale ) q(x) = \text{round}\left(\frac{x - \text{zero\_point}}{\text{scale}}\right) q(x)=round(scalex?zero_point?) 這樣可以將浮動(dòng)值轉(zhuǎn)化為低精度整數(shù)表示,減少計(jì)算資源消耗。

模型量化對(duì)象主要包括以下幾個(gè)方面:

  • 權(quán)重(Weights):量化權(quán)重是最常見和流行的方法,它可以減少模型大小、內(nèi)存使用和空間占用。
  • 激活(Activations):在實(shí)踐中,激活通常占內(nèi)存使用的大部分。因此,量化激活不僅可以大大減少內(nèi)存使用,而且與權(quán)重量化結(jié)合時(shí),可以充分利用整數(shù)計(jì)算來實(shí)現(xiàn)性能提升。
  • KV緩存(KV cache):量化KV緩存對(duì)于提高長序列生成的吞吐量至關(guān)重要。
  • 梯度(Gradients):與上面相比,梯度稍微不常見,因?yàn)樗鼈冎饕糜谟?xùn)練。訓(xùn)練深度學(xué)習(xí)模型時(shí),梯度通常是浮點(diǎn)數(shù)。量化梯度主要用于減少分布式計(jì)算中的通信開銷,也可以減少后向傳遞過程中的成本。
2.1.1 k-means 量化

??K-means 量化是一種用于壓縮和加速神經(jīng)網(wǎng)絡(luò)模型的技術(shù),通過對(duì)權(quán)重進(jìn)行聚類到不同的簇,將其近似為一組有限的中心值(質(zhì)心),從而降低存儲(chǔ)和計(jì)算復(fù)雜度。下圖展示了整個(gè)過程:

在這里插入圖片描述

  1. weights (32-bit float):神經(jīng)網(wǎng)絡(luò)中的原始權(quán)重矩陣,數(shù)據(jù)以32位浮點(diǎn)數(shù)存儲(chǔ)。不同顏色的方塊代表分到不同的簇。

  2. cluster index (2-bit int):權(quán)重經(jīng)過 k-means 聚類,被分配到不同的簇,得到每個(gè)權(quán)重的簇索引矩陣。這樣權(quán)重只需要使用2位整型就可以進(jìn)行表示,顯著減少存儲(chǔ)所需的位數(shù)。

  3. centroids:計(jì)算每個(gè)簇的質(zhì)心,這些質(zhì)心是簇內(nèi)權(quán)重的平均值。此時(shí),每個(gè)簇內(nèi)的權(quán)重都可以用一個(gè)質(zhì)心來近似表示。例如:
    c l u s t e r 0 = m e a n ( ? 0.98 , ? 1.08 , ? 0.91 , ? 1.03 ) = ? 1 cluster_0=mean(-0.98, -1.08, -0.91, -1.03)=-1 cluster0?=mean(?0.98,?1.08,?0.91,?1.03)=?1

  4. gradient:原始的梯度值

  5. group by和reduce:根據(jù) cluster index 將梯度矩陣中的梯度值按所屬簇分組。每個(gè)簇內(nèi)的梯度被視為一組。對(duì)每個(gè)簇內(nèi)的梯度進(jìn)行匯總求和,得到簇的梯度更新值。

  6. fine-tuned centroids:利用 reduce 得到的簇梯度更新值和學(xué)習(xí)率,更新每個(gè)簇的質(zhì)心。新的質(zhì)心用于更新權(quán)重,使其在量化后仍能接近最佳解。
    c i ′ = c i ? η ? g i c_i' = c_i - \eta \cdot g_i ci?=ci??η?gi?

??最終,存儲(chǔ)占用從 32bit x 16 = 512 bit = 64 B => 2bit x 16 + 32 bit x 4 = 32 bit + 128 bit = 160 bit = 20 B。當(dāng)weight矩陣更大時(shí),壓縮比例將會(huì)更大。

  • 推理時(shí),我們讀取轉(zhuǎn)換表,根據(jù)索引值獲取對(duì)應(yīng)的值。
  • 訓(xùn)練時(shí),我們將gradient按照weights的聚類方式進(jìn)行聚類相加,反向傳播到轉(zhuǎn)換表,更新轉(zhuǎn)換表的值。

以下是將上一節(jié)的剪枝和k-means 量化結(jié)合起來的壓縮流程。

  • 循環(huán)進(jìn)行微調(diào)和剪枝,得到最優(yōu)的剪枝模型。
  • k-means 量化將剪枝后的參數(shù)進(jìn)行聚類,將聚類的索引值存儲(chǔ)在模型中,并構(gòu)建相應(yīng)的索引表,并使用哈夫曼編碼進(jìn)一步壓縮。
    在這里插入圖片描述
2.1.2 線性量化

??線性量化是將原始浮點(diǎn)數(shù)據(jù)和量化后的定點(diǎn)數(shù)據(jù)之間建立一個(gè)簡單的線性變換關(guān)系,因?yàn)榫矸e、全連接等網(wǎng)絡(luò)層本身只是簡單的線性計(jì)算,因此線性量化中可以直接用量化后的數(shù)據(jù)進(jìn)行直接計(jì)算。

2.1.2.1 零點(diǎn)量化(Zero-Point Quantization)

??我們用 r r r 表示浮點(diǎn)實(shí)數(shù), q q q 表示量化后的定點(diǎn)整數(shù)。浮點(diǎn)和整型之間的換算公式為:

r = S ( q ? Z ) r = S(q - Z) r=S(q?Z)

q = r o u n d ( r / S + Z ) q = round(r / S + Z) q=round(r/S+Z)
??其中, S S S 是量化放縮的尺度,表示實(shí)數(shù)和整數(shù)之間的比例關(guān)系, Z Z Z 是偏移量,表示浮點(diǎn)數(shù)中的 0 經(jīng)過量化后對(duì)應(yīng)的數(shù)(量化偏移),根據(jù)偏移量 Z Z Z是否為0,可以將浮點(diǎn)數(shù)的線性量化分為對(duì)稱量化( Z Z Z=0)和非對(duì)稱量化( Z Z Z≠0)。大多數(shù)情況下量化是選用無符號(hào)整數(shù),比如INT8的值域?yàn)閇0,255],這種情況下需要要用非對(duì)稱量化。 S S S Z Z Z的計(jì)算方法為:
S = r m a x ? r m i n q m a x ? q m i n S = \frac{r_{max} - r_{min}}{q_{max} - q_{min}} S=qmax??qmin?rmax??rmin??
Z = r o u n d ( q m a x ? r m a x S ) Z = round(q_{max}-\frac{r_{max}}{S}) Z=round(qmax??Srmax??)
在這里插入圖片描述

??其中, r m a x r_{max} rmax? r m a x r_{max} rmax?分別表示浮點(diǎn)數(shù)中的最小值和最大值, q m a x q_{max} qmax? q m i n q_{min} qmin?分別表示定點(diǎn)數(shù)中的最小值和最大值。

下面舉一個(gè)例子來詳細(xì)說明。如下圖所示,給定一個(gè)矩陣,可以通過上面的公式計(jì)算出Z和S。
在這里插入圖片描述

可進(jìn)一步利用上面的公式計(jì)算出量化后的矩陣。
在這里插入圖片描述

2.1.2.2 絕對(duì)最大( absmax )量化

??absmax 量化通過找到輸入數(shù)據(jù)或權(quán)重的絕對(duì)值最大值來計(jì)算縮放因子,將數(shù)據(jù)映射到指定的整數(shù)范圍內(nèi)。在絕對(duì)最大量化(absmax 量化)中,整個(gè)計(jì)算過程可以用以下公式來描述:

  1. 確定縮放因子 S S S: 計(jì)算輸入矩陣 X X X 的絕對(duì)最大值:

    S = absmax ( X ) Q max S = \frac{\text{absmax}(X)}{Q_{\text{max}}} S=Qmax?absmax(X)?

    其中, absmax ( X ) = max ? ( ∣ X i , j ∣ ) \text{absmax}(X) = \max(|X_{i,j}|) absmax(X)=max(Xi,j?) 表示 X X X 中的絕對(duì)值最大元素, Q max Q_{\text{max}} Qmax? 是量化整數(shù)的最大絕對(duì)值。例如,對(duì)于 8 位量化, Q max = 127 Q_{\text{max}} = 127 Qmax?=127。

  2. 量化映射公式: 將原始輸入矩陣 X X X 轉(zhuǎn)換為量化后的矩陣 X quant X_{\text{quant}} Xquant?

    X quant = round ( X S ) X_{\text{quant}} = \text{round}\left(\frac{X}{S}\right) Xquant?=round(SX?)

    這里, round \text{round} round 表示對(duì)結(jié)果進(jìn)行四舍五入,以確保 X quant X_{\text{quant}} Xquant? 是整數(shù)。

  3. 反量化公式(從量化值恢復(fù)原始浮點(diǎn)值):

    X dequant = r o u n d ( X quant × S ) X_{\text{dequant}} = round(X_{\text{quant}} \times S) Xdequant?=round(Xquant?×S)

假設(shè)輸入矩陣 X X X 為:

X = [ 0.5 ? 1.2 2.4 ? 0.7 ] X = \begin{bmatrix} 0.5 & -1.2 \\ 2.4 & -0.7 \end{bmatrix} X=[0.52.4??1.2?0.7?]

步驟 1:計(jì)算 S S S

absmax ( X ) = 2.4 , S = 2.4 127 ≈ 0.0189 \text{absmax}(X) = 2.4, \quad S = \frac{2.4}{127} \approx 0.0189 absmax(X)=2.4,S=1272.4?0.0189

步驟 2:計(jì)算 X quant X_{\text{quant}} Xquant?

X quant = round ( X S ) = round ( [ 0.5 0.0189 ? 1.2 0.0189 2.4 0.0189 ? 0.7 0.0189 ] ) = round ( [ 26.5 ? 63.5 127 ? 37 ] ) X_{\text{quant}} = \text{round}\left(\frac{X}{S}\right) = \text{round}\left(\begin{bmatrix} \frac{0.5}{0.0189} & \frac{-1.2}{0.0189} \\ \frac{2.4}{0.0189} & \frac{-0.7}{0.0189} \end{bmatrix}\right) = \text{round}\left(\begin{bmatrix} 26.5 & -63.5 \\ 127 & -37 \end{bmatrix}\right) Xquant?=round(SX?)=round([0.01890.5?0.01892.4??0.0189?1.2?0.0189?0.7??])=round([26.5127??63.5?37?]) X quant = [ 27 ? 64 127 ? 37 ] X_{\text{quant}} = \begin{bmatrix} 27 & -64 \\ 127 & -37 \end{bmatrix} Xquant?=[27127??64?37?]

步驟 3:反量化 X dequant X_{\text{dequant}} Xdequant?

X dequant = X quant × S = [ 27 ? 64 127 ? 37 ] × 0.0189 ≈ [ 0.51 ? 1.21 2.4 ? 0.7 ] X_{\text{dequant}} = X_{\text{quant}} \times S = \begin{bmatrix} 27 & -64 \\ 127 & -37 \end{bmatrix} \times 0.0189 \approx \begin{bmatrix} 0.51 & -1.21 \\ 2.4 & -0.7 \end{bmatrix} Xdequant?=Xquant?×S=[27127??64?37?]×0.0189[0.512.4??1.21?0.7?]

區(qū)別絕對(duì)最大量化(Absmax 量化)零點(diǎn)量化(Zero-point 量化)
核心思想基于絕對(duì)最大值進(jìn)行量化引入零點(diǎn),使數(shù)據(jù)能更好適應(yīng)非對(duì)稱分布
縮放因子計(jì)算 S = absmax ( X ) Q max S = \frac{\text{absmax}(X)}{Q_{\text{max}}} S=Qmax?absmax(X)? S = max ( X ) ? min ( X ) Q max ? Q min S = \frac{\text{max}(X) - \text{min}(X)}{Q_{\text{max}} - Q_{\text{min}}} S=Qmax??Qmin?max(X)?min(X)?
零點(diǎn)計(jì)算無需計(jì)算零點(diǎn) Z = Q max ? max ( X ) S Z = Q_{\text{max}} - \frac{\text{max}(X)}{S} Z=Qmax??Smax(X)?
量化公式 X quant = round ( X S ) X_{\text{quant}} = \text{round}\left(\frac{X}{S}\right) Xquant?=round(SX?) X quant = round ( X S ) + Z X_{\text{quant}} = \text{round}\left(\frac{X}{S}\right) + Z Xquant?=round(SX?)+Z
反量化公式 X dequant = X quant × S X_{\text{dequant}} = X_{\text{quant}} \times S Xdequant?=Xquant?×S X dequant = ( X quant ? Z ) × S X_{\text{dequant}} = (X_{\text{quant}} - Z) \times S Xdequant?=(Xquant??Z)×S
實(shí)現(xiàn)復(fù)雜度簡單,計(jì)算和存儲(chǔ)開銷小較復(fù)雜,需要額外計(jì)算零點(diǎn)
適用場景由于這種方法使用對(duì)稱量化(即數(shù)據(jù)在正負(fù)區(qū)間使用相同的范圍),它適用于輸入數(shù)據(jù)中零點(diǎn)(即數(shù)據(jù)中心)接近 0 的情況數(shù)據(jù)偏移明顯,需更高精度的動(dòng)態(tài)推理任務(wù),比如量化神經(jīng)網(wǎng)絡(luò)的中間激活值或在輸入數(shù)據(jù)非對(duì)稱的情況下,提升模型的表達(dá)能力。

在這里插入圖片描述

2.2 INT4 和 FP4量化

  • INT4量化將權(quán)重和激活值從高位寬(如INT8或FP32)壓縮到4位整數(shù)(INT4,表示范圍為 -8 到 7)
  • FP4量化是將浮點(diǎn)數(shù)(例如FP32)壓縮為4位浮點(diǎn)數(shù)表示的方法,其表示的范圍根據(jù)不同的指數(shù)位和小數(shù)位而有所不同。這是一個(gè)相對(duì)較新的量化策略,保留了浮點(diǎn)數(shù)的結(jié)構(gòu),包括符號(hào)位、指數(shù)位和尾數(shù)位。

在這里插入圖片描述

2.3 二值量化 (Binarization)

??在二值量化中,模型的權(quán)重或激活值被限制為兩個(gè)離散值,通常是 -1 和 1 。這樣可以大幅減少模型的存儲(chǔ)需求,因?yàn)槊總€(gè)參數(shù)只需要一位 bit 來表示。二值神經(jīng)網(wǎng)絡(luò)的計(jì)算也可以大幅加速,因?yàn)槎颠\(yùn)算比浮點(diǎn)運(yùn)算要簡單得多。

??二值化(Binarization)的具體實(shí)現(xiàn)有兩種方法:確定性二值化(Deterministic Binarization)隨機(jī)二值化(Stochastic Binarization)。

  1. 確定性二值化(Deterministic Binarization)

    • 直接根據(jù)一個(gè)閾值(通常是0)計(jì)算位值,結(jié)果為符號(hào)函數(shù):
      q = sign ( r ) = { + 1 , r ≥ 0 ? 1 , r < 0 q = \text{sign}(r) = \begin{cases} +1, & r \geq 0 \\ -1, & r < 0 \end{cases} q=sign(r)={+1,?1,?r0r<0?
    • 即,如果輸入大于等于0,則輸出1;否則輸出-1。
  2. 隨機(jī)二值化(Stochastic Binarization)

    • 使用全局統(tǒng)計(jì)或輸入數(shù)據(jù)的值來確定輸出為 -1 或 +1 的概率。例如,在 Binary Connect (BC) 方法中,概率由 sigmoid 函數(shù) σ ( r ) \sigma(r) σ(r) 確定:
      q = { + 1 , with?probability? p = σ ( r ) ? 1 , with?probability? 1 ? p q = \begin{cases} +1, & \text{with probability } p = \sigma(r) \\ -1, & \text{with probability } 1 - p \end{cases} q={+1,?1,?with?probability?p=σ(r)with?probability?1?p?
      其中, σ ( r ) = min ? ( max ? ( r + 1 2 , 0 ) , 1 ) \sigma(r) = \min(\max(\frac{r+1}{2}, 0), 1) σ(r)=min(max(2r+1?,0),1)
    • 這種方法的實(shí)現(xiàn)較為困難,因?yàn)榱炕瘯r(shí)需要硬件生成隨機(jī)比特。

在這里插入圖片描述

??上圖展示了在二值化中最小化量化誤差的方法。為了更好地逼近原始權(quán)重,二值權(quán)重 W B W^\mathbb{B} WB 乘以一個(gè)縮放因子 α \alpha α,計(jì)算后得到縮放后的二值權(quán)重 α W B \alpha W^\mathbb{B} αWB,其中 n 為矩陣中元素的個(gè)數(shù)。
α = 1 n ∥ W ∥ 1 \alpha = \frac{1}{n} \| W \|_1 α=n1?W1?
??通過引入縮放因子,誤差從9.28減少到9.24,顯示出縮放對(duì)減小誤差的效果。

2.4 三值量化 (Ternary Quantization)

??在三值量化中,模型的權(quán)重或激活值被限制為三個(gè)離散值,通常是 -1 、 0 和 1 。相比二值量化,三值量化允許模型擁有一個(gè)額外的零值,這可以壓縮模型參數(shù)的同時(shí)保留模型的精度。

??三值量化的具體規(guī)則如下:
q = { r t , r > Δ 0 , ∣ r ∣ ≤ Δ ? r t , r < ? Δ q = \begin{cases} r_t, & r > \Delta \\ 0, & |r| \leq \Delta \\ -r_t, & r < -\Delta \end{cases} q=? ? ??rt?,0,?rt?,?r>ΔrΔr<?Δ?
其中, Δ = 0.7 × E ( ∣ r ∣ ) \Delta = 0.7 \times \mathbb{E}(|r|) Δ=0.7×E(r) r t = E ∣ r ∣ > Δ ( ∣ r ∣ ) r_t = \mathbb{E}_{|r|>\Delta}(|r|) rt?=Er>Δ?(r)

在這里插入圖片描述

??如上圖所示為三值量化的具體示例,展示了一個(gè)權(quán)重矩陣 $ W $ 如何被量化為三值權(quán)重矩陣。

  • 量化的閾值 Δ \Delta Δ 被計(jì)算為:
    Δ = 0.7 × 1 16 ∥ W ∥ 1 = 0.73 \Delta = 0.7 \times \frac{1}{16} \|W\|_1 = 0.73 Δ=0.7×161?W1?=0.73
    其中, ∥ W ∥ 1 \|W\|_1 W1? 是原始權(quán)重矩陣 W W W 的 L1 范數(shù),即所有元素絕對(duì)值的平均值。

  • 確定非零權(quán)重的值 r t r_t rt?
    r t = 1 11 ∥ W W T ≠ 0 ∥ 1 = 1.5 r_t = \frac{1}{11} \|W_{W^T \neq 0}\|_1 = 1.5 rt?=111?WWT=0?1?=1.5
    其中, ∥ W W T ≠ 0 ∥ 1 \|W_{W^T \neq 0}\|_1 WWT=0?1? 是非零權(quán)重的 L1 范數(shù)。

??二值量化和三值量化可以顯著減小模型的尺寸和加速推理速度,但通常也會(huì)導(dǎo)致模型精度的下降。因此,這些方法常用于對(duì)精度要求不太高的應(yīng)用場景或需要在低計(jì)算資源環(huán)境下運(yùn)行的場景中。

2.5 混合精度量化

??混合精度量化是結(jié)合多種量化方法的技術(shù),例如在不同的層或不同的模型部分使用不同精度的量化方法。例如,某些計(jì)算密集型的層可能使用 INT8 量化,而其他層使用 INT16 或 FP16 量化,以達(dá)到精度和效率之間的平衡。

三、 訓(xùn)練后量化 (Post-Training Quantization)

??訓(xùn)練后量化是指在訓(xùn)練完成后,對(duì)模型進(jìn)行量化,因此也叫做離線量化,可分為對(duì)稱量化和非對(duì)稱量化(量化零點(diǎn)是否為 0)。根據(jù)量化粒度區(qū)分,訓(xùn)練后量化又分為逐張量量化和逐通道量化以及組量化。

??量化誤差來自兩方面,一個(gè)是clip操作,一個(gè)是round操作。如何選取量化時(shí)所用參數(shù)(如scaling factor,zero point)可以盡可能地減少對(duì)準(zhǔn)確率的影響呢?這也是我們需要關(guān)注的地方。

3.1 量化粒度

量化通常會(huì)導(dǎo)致模型精度下降,不同的量化粒度下降程度不一樣。

3.1.1 逐張量量化(Per-Tensor Quantization)

??逐張量量化(Per-Tensor Quantization)是指對(duì)整個(gè)張量使用相同的量化參數(shù)(縮放因子和零點(diǎn))來進(jìn)行量化。但是在張量之間應(yīng)用相同的參數(shù)會(huì)導(dǎo)致精度下降,因?yàn)閺埩績?nèi)參數(shù)值的范圍可能會(huì)有所不同。如下圖的紅框所示,3個(gè)channel共享一個(gè)量化參數(shù)。但是我們可以看到不同channel的數(shù)據(jù)范圍是不同的。因此當(dāng) Layer-wise 量化效果不好時(shí),需要對(duì)每個(gè)channel進(jìn)行分別量化。
在這里插入圖片描述

逐張量量化

3.1.2 逐通道量化(Per Channel Quantization)

??逐通道量化是將數(shù)據(jù)按照通道維度進(jìn)行拆分,分別對(duì)每一通道的數(shù)據(jù)進(jìn)行量化。由于現(xiàn)階段模型越來越大,每個(gè)通道的參數(shù)也原來越多,參數(shù)的數(shù)值范圍也越來越大,因此我們需要更細(xì)粒度的量化方式。逐通道量化可以更準(zhǔn)確地捕獲不同通道中的變化,比起逐張量量化,精度損失更少,但需要更多的存儲(chǔ)空間(存儲(chǔ)多個(gè)r和S)。

??下圖演示了逐張量量化和逐通道量化過程。最終對(duì)比原始矩陣 W 與量化之后重建矩陣之間的誤差 ∥ W ? W ′ ∥ F = ∑ i , j ( W i , j ? W i , j ′ ) 2 \|W - W'\|_F = \sqrt{\sum_{i,j} (W_{i,j} - W'_{i,j})^2} W?WF?=i,j?(Wi,j??Wi,j?)2 ?可以看出,逐通道量化量化損失更小,但需要的存儲(chǔ)空間更大。

在這里插入圖片描述

逐張量量化與逐通道量化對(duì)比

3.1.3 組量化(Group Quantization)

??與逐通道量化或逐張量量化不同,組量化將一個(gè)通道內(nèi)的數(shù)據(jù)拆分為多個(gè)較小的向量組,然后進(jìn)行兩級(jí)量化:

  • 先對(duì)較小粒度的組(如向量)使用較簡單的整數(shù)縮放因子 S q S_q Sq?進(jìn)行縮放:
    r 向量 = S q ? ( q ? Z ) r_{\text{向量}} = S_q \cdot (q - Z) r向量?=Sq??(q?Z)

  • 再對(duì)較大粒度的整體(如通道)使用更復(fù)雜的浮點(diǎn)數(shù)縮放因子 γ \gamma γ進(jìn)行縮放:
    r = γ ? r 向量 = γ ? S q ? ( q ? Z ) r = \gamma \cdot r_{\text{向量}} = \gamma \cdot S_q \cdot (q - Z) r=γ?r向量?=γ?Sq??(q?Z)

??第一步目的是在較細(xì)粒度的范圍內(nèi)進(jìn)行初步量化,適應(yīng)不同的向量分布特性,減少量化誤差;第二步將先前量化的結(jié)果進(jìn)行全局調(diào)整。這種方法通過結(jié)合不同粒度的縮放因子,實(shí)現(xiàn)了精度和硬件效率的平衡。

??存儲(chǔ)開銷分析:假設(shè)我們使用 4-bit 量化,即每個(gè)元素都被量化為一個(gè) 4-bit 整數(shù)。組量化中,為了更高的精度,每 16 個(gè)元素(即一個(gè)組)共享一個(gè) 4-bit 的向量縮放因子 S q S_q Sq?。這個(gè)縮放因子需要額外存儲(chǔ),但它是每個(gè)組共享的,因此只需為每組存儲(chǔ)一次。下面計(jì)算有效位寬(元素本身的位寬和每個(gè)向量縮放因子帶來的額外存儲(chǔ)):
4 bits + 4 bits 16 個(gè)元素 = 4.25 bits 4 \text{ bits} + \frac{4 \text{ bits}}{16 \text{ 個(gè)元素}} = 4.25 \text{ bits} 4?bits+16?個(gè)元素4?bits?=4.25?bits
通過適當(dāng)分配粒度和縮放因子,存儲(chǔ)開銷得到了優(yōu)化。

??Microscaling(MX) 是一種具體實(shí)現(xiàn)兩級(jí)縮放因子的方案,從微軟的浮點(diǎn)(MSFP)數(shù)據(jù)類型演化而來。MX 系列(如 MX4、MX6、MX9)在不同的數(shù)據(jù)類型、縮放因子設(shè)計(jì)和組大小上有所區(qū)別,以便根據(jù)不同應(yīng)用優(yōu)化性能。每個(gè)向量的浮點(diǎn)比例因子被分成整數(shù)和浮點(diǎn)逐通道的分量,進(jìn)一步提高量化的靈活性和精度。

3.2 動(dòng)態(tài)量化參數(shù)的計(jì)算 ( Cliping )

??上面介紹的都是靜態(tài)量化,即使用固定的量化參數(shù)進(jìn)行量化。動(dòng)態(tài)量化參數(shù)是指在量化過程中,隨著輸入數(shù)據(jù)或模型運(yùn)行情況的變化而實(shí)時(shí)更新的量化參數(shù)(例如,量化的范圍或縮放因子)。這種動(dòng)態(tài)更新使得量化更能適應(yīng)不同的數(shù)據(jù)分布,減少精度損失,提高模型在推理過程中的性能。

??動(dòng)態(tài)量化一般應(yīng)用于已經(jīng)訓(xùn)練好的模型,用來優(yōu)化推理過程中的速度和內(nèi)存占用。它通過將模型的權(quán)重和激活值(在推理時(shí))轉(zhuǎn)換為低精度的整數(shù)(如8位),減少了存儲(chǔ)需求和計(jì)算負(fù)擔(dān),從而提高推理效率,特別適用于推理設(shè)備(如移動(dòng)設(shè)備、嵌入式系統(tǒng))對(duì)存儲(chǔ)和計(jì)算資源有限制的場景,也適合在生產(chǎn)環(huán)境中快速部署模型進(jìn)行推理。

3.2.1 指數(shù)移動(dòng)平均(EMA)

??指數(shù)移動(dòng)平均(Exponential Moving Average, EMA)是一種常用的統(tǒng)計(jì)方法,用于計(jì)算數(shù)據(jù)的指數(shù)移動(dòng)平均值。

??EMA 收集了訓(xùn)練過程中激活函數(shù)的取值范圍 r m i n r_{min} rmin? r m a x r_{max} rmax?,然后在每個(gè) epoch 對(duì)這些取值范圍進(jìn)行平滑處理。EMA的計(jì)算公式如下:
r m i n , m a x t + 1 = α r m i n , m a x t + ( 1 ? α ) r m i n , m a x t + 1 r^{t+1}_{min,max} = \alpha r^{t}_{min,max} + (1-\alpha) r^{t+1}_{min,max} rmin,maxt+1?=αrmin,maxt?+(1?α)rmin,maxt+1?

其中, r m i n , m a x t r^{t}_{min,max} rmin,maxt? 表示第 t t t 步的取值范圍, α \alpha α 表示平滑系數(shù)。

3.2.2 Min-Max

??Min-Max 是一種常用的校準(zhǔn)方法,通過在訓(xùn)練好的 fp32 模型上跑少量的校準(zhǔn)數(shù)據(jù)。統(tǒng)計(jì)校準(zhǔn)數(shù)據(jù)的 r m i n , m a x r_{min,max} rmin,max? 并取平均值作為量化參數(shù)。

3.2.3 KL 量化

??KL 量化是用 KL 散度來衡量數(shù)據(jù)和量化后的數(shù)據(jù)之間的相似性;這種方法不是直接將 [ m i n , m a x ] [min, max] [min,max]v映射到 [ ? 127 , 128 ] [-127,128] [?127,128],而是去尋找一個(gè)閾值 ∣ T ∣ < m a x ( ∣ m a x ∣ , ∣ m i n ∣ ) |T| < max(|max|, |min|) T<max(max,min) ,將 [ ? T , T ] [-T, T] [?T,T] 映射到 [ ? 127 , 128 ] [-127, 128] [?127,128] 。并假設(shè)只要閾值選取得當(dāng),使得兩個(gè)數(shù)據(jù)之間的分布相似,就不會(huì)對(duì)精度損失造成影響。

D K L ( P ∣ ∣ Q ) = ∑ i = 1 n P ( x i ) log ? P ( x i ) Q ( x i ) D_{KL}(P||Q) = \sum_{i=1}^nP(x_i)\log\frac{P(x_i)}{Q(x_i)} DKL?(P∣∣Q)=i=1n?P(xi?)logQ(xi?)P(xi?)?

3.2.4 均方誤差(MSE)

??均方誤差量化是指通過最小化輸入數(shù)據(jù) X X X 和量化后的數(shù)據(jù) Q ( X ) Q(X) Q(X) 之間的均方誤差,計(jì)算得到最合適的量化參數(shù)。

m i n ∣ r ∣ m a x E ∣ ( X ? Q ( X ) ) 2 ∣ min_{|r|_{max}}E|(X-Q(X))^2| minrmax??E(X?Q(X))2

??通過動(dòng)態(tài)調(diào)整 | r | m a x |r|_{max} rmax? 來最小化均方誤差。

  • EMA方法能適應(yīng)變化的數(shù)據(jù)分布,適用于實(shí)時(shí)或在線推理任務(wù)。
  • Min-Max方法通過簡單的最大最小值計(jì)算,速度快,適合較為穩(wěn)定的數(shù)據(jù)分布,常見于硬件加速支持的低精度推理中,如嵌入式設(shè)備。
  • KL量化側(cè)重于保留數(shù)據(jù)的原始分布信息,適用于需要對(duì)數(shù)據(jù)分布高度保真、精度要求高的任務(wù),比如文本生成或圖像生成等任務(wù)中。
  • MSE量化則關(guān)注量化后的誤差最小化,適合科學(xué)計(jì)算等對(duì)誤差控制嚴(yán)格的應(yīng)用。

3.3 Rounding

??在量化過程中,通常會(huì)將浮點(diǎn)數(shù)值(如32位浮點(diǎn)數(shù))轉(zhuǎn)化為整數(shù)(如8位整數(shù)),然而,舍入過程會(huì)引入誤差,影響模型的預(yù)測準(zhǔn)確性。傳統(tǒng)的舍入方法(如向最近整數(shù)舍入)并不會(huì)考慮多個(gè)權(quán)重之間的舍入影響,可能導(dǎo)致某些權(quán)重在量化后與真實(shí)值的差異較大,影響最終輸出的精度。

在這里插入圖片描述
比如上圖中,對(duì)每個(gè)權(quán)重的最近舍入不一定是對(duì)整個(gè)張量的最好舍入。

??AdaRound 是一種改進(jìn)的舍入策略,會(huì)根據(jù)量化誤差的積累情況來動(dòng)態(tài)調(diào)整舍入策略,從而減少累計(jì)的誤差。簡單來說就是在舍入時(shí)引入了一個(gè) 偏差項(xiàng) σ \sigma σ ,會(huì)根據(jù)之前的舍入結(jié)果來調(diào)整下一次舍入的方向,而不是單純地對(duì)每個(gè)權(quán)重進(jìn)行四舍五入,用數(shù)學(xué)表示就是:
W ^ = ? ? W ? + σ ? \hat{W} = \lfloor \lfloor W \rfloor + \sigma \rceil W^=??W?+σ?

其中:

  • W W W 是原始的浮動(dòng)權(quán)重。
  • ? W ? \lfloor W \rfloor ?W? 是權(quán)重 W W W 向下取整后的值。
  • σ ∈ [ 0 , 1 ] \sigma \in [0, 1] σ[0,1] 是一個(gè)在 [ 0 , 1 ] [0, 1] [0,1] 區(qū)間內(nèi)的偏差項(xiàng),用來決定是向上舍入還是向下舍入。具體而言, σ \sigma σ 會(huì)影響最終舍入的方向,優(yōu)化量化后誤差的大小。

四、 量化感知訓(xùn)練(Quantization-Aware Training)

論文《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》

??傳統(tǒng)的量化模型做法,是先用浮點(diǎn)數(shù)訓(xùn)練網(wǎng)絡(luò),然后進(jìn)行量化。這種方法對(duì)于大規(guī)模模型有效,但對(duì)于小型模型常常會(huì)導(dǎo)致顯著的精度下降。常見的失敗模式包括:

  • 權(quán)重范圍差異過大:某些輸出通道的權(quán)重范圍差異超過100倍,導(dǎo)致量化時(shí),范圍較小的通道會(huì)有較大的相對(duì)誤差。
  • 異常權(quán)重值:某些權(quán)重值異常,影響量化后的精度。

??量化感知訓(xùn)練(QAT)通過在訓(xùn)練的前向傳播中模擬量化效果(對(duì)模型的權(quán)重和激活值進(jìn)行量化),來讓模型更適應(yīng)低精度計(jì)算,避免直接的后期量化帶來的問題,從而提高了最終量化后的模型精度。

??量化操作(特別是低精度量化)會(huì)導(dǎo)致數(shù)據(jù)精度損失,這會(huì)影響模型的性能。如果在訓(xùn)練時(shí)不考慮這些量化帶來的誤差,訓(xùn)練出的模型可能在量化后表現(xiàn)不佳。因此,模擬量化的目的就是讓模型在訓(xùn)練過程中感知到量化的影響,從而讓模型調(diào)整參數(shù),使得它可以更好地適應(yīng)低精度計(jì)算環(huán)境。這樣,訓(xùn)練得到的模型會(huì)在量化后保留較好的精度。

4.1 前向傳播

??QAT訓(xùn)練時(shí)所有計(jì)算是在高精度下完成的(FP32),但是在前向傳播過程中加入了偽量化節(jié)點(diǎn)(quantization+dequantization),用于模擬模型量化時(shí)引起的誤差。以INT8量化為例,QAT處理流程為:

  1. 在數(shù)據(jù)集上以FP32精度進(jìn)行模型訓(xùn)練,得到訓(xùn)練好的baseline模型;

  2. 在baseline模型中插入偽量化節(jié)點(diǎn)(fake quantization),以便在訓(xùn)練期間模擬推理時(shí)的量化效果,其前向過程為:

    • 輸入量化 L a y e r N ? 1 Layer_{N-1} LayerN?1? 層的輸出 Q ( X ) Q(X) Q(X) 作為下一層( L a y e r N Layer_{N} LayerN?)的輸入。 Q ( X ) Q(X) Q(X) 表示已經(jīng)過量化和反量化的輸入數(shù)據(jù)。
    • 權(quán)重量化:在與輸入進(jìn)行卷積前,先對(duì)權(quán)重進(jìn)行量化。當(dāng)前層的權(quán)重 W W W 會(huì)通過量化反量化操作得到 Q ( W ) Q(W) Q(W),然后使用 Q ( W ) Q(W) Q(W) 計(jì)算得到輸出 Y Y Y。
    • 輸出量化/激活值量化:在激活函數(shù)應(yīng)用后,或者在像ResNet這樣的跳躍連接中,量化激活值(輸出 Y Y Y 經(jīng)過量化反量化,得到 Q ( Y ) Q(Y) Q(Y)),作為下一層 L a y e r N + 1 Layer_{N+1} LayerN+1? 的輸入。
      在這里插入圖片描述
  3. 在模擬量化模式下訓(xùn)練直到收斂(即微調(diào)量化模型)。這一過程會(huì)考慮量化誤差的影響,從而讓模型適應(yīng)低位寬(例如8位)表示。

  4. 訓(xùn)練完成后,模型的權(quán)重將被真正量化,并且在實(shí)際硬件上進(jìn)行推理。

Tips:訓(xùn)練過程中,偏置不需要進(jìn)行量化,它的量化參數(shù)是根據(jù)權(quán)重和激活的量化參數(shù)推斷出來的。

??論文中是在weights輸入conv之前(weight quantization)以及activation之后(activation quantizaion)插入了偽量化節(jié)點(diǎn),偽量化節(jié)點(diǎn)插入位置就是需要進(jìn)行量化操作的位置。在這里插入圖片描述
量化過程通過以下函數(shù)實(shí)現(xiàn):

  1. 將輸入值 r 限制在區(qū)間 [a, b] 內(nèi):
    clamp ( r ; a , b ) = min ? ( max ? ( r , a ) , b ) \text{clamp}(r; a, b) = \min(\max(r, a), b) clamp(r;a,b)=min(max(r,a),b)
  2. 計(jì)算量化步長,即在給定的量化范圍 [a, b] 和量化級(jí)數(shù) n 下(8bit量化時(shí),n=256),量化的間隔:
    s ( a , b , n ) = b ? a n ? 1 s(a, b, n) = \frac{b - a}{n - 1} s(a,b,n)=n?1b?a?
  3. 將實(shí)數(shù)值 r 量化到 [a, b] 范圍內(nèi)的離散級(jí)別。首先使用 clamp 限制 r[a, b] 范圍內(nèi),然后根據(jù)步長 s(a, b, n) 將其映射到 n 個(gè)量化級(jí)別中的一個(gè),并進(jìn)行四舍五入。其公式為:
    q ( r ; a , b , n ) = ( ? clamp ( r ; a , b ) ? a s ( a , b , n ) ? ) ? s ( a , b , n ) + a q(r; a, b, n) = \left( \left\lfloor \frac{\text{clamp}(r; a, b) - a}{s(a, b, n)} \right\rceil \right) \cdot s(a, b, n) + a q(r;a,b,n)=(?s(a,b,n)clamp(r;a,b)?a??)?s(a,b,n)+a

其中, ? ? ? \left\lfloor \cdot \right\rceil ???表示四舍五入到最近的整數(shù)。

  • 對(duì)于權(quán)重量化,通常通過取權(quán)重的最小值和最大值來確定量化范圍,并對(duì)這些范圍進(jìn)行微調(diào),確保零點(diǎn)值能夠精確表示。
  • 對(duì)于激活量化,通過在訓(xùn)練過程中使用指數(shù)加權(quán)平均(EMA)平滑激活范圍。另外為了避免訓(xùn)練初期激活量化范圍不穩(wěn)定,通常在訓(xùn)練的前50,000到200萬步內(nèi)禁用激活量化。

??量化過程中的學(xué)習(xí)會(huì)調(diào)整量化的邊界[a, b],確保在量化后能精確表示零值。最終,學(xué)習(xí)到的量化參數(shù)會(huì)映射到公式中的比例因子S和零點(diǎn)Z,公式為:

S = s ( a , b , n ) , Z = z ( a , b , n ) S = s(a, b, n),Z = z(a, b, n) S=s(a,b,n),Z=z(a,b,n)

4.2 反向傳播

??量化感知訓(xùn)練的損失函數(shù)與普通訓(xùn)練的損失函數(shù)類似,但是量化后的權(quán)重是離散值。如圖所示為 W W W Q ( W ) Q(W) Q(W) 的關(guān)系。

在這里插入圖片描述

??由于 Q ( W ) Q(W) Q(W)是離散值,故:
? Q ( W ) ? W = 0 \frac{\partial Q(\mathbf{W})}{\partial \mathbf{W}}=0 ?W?Q(W)?=0

??梯度計(jì)算公式為:

g W = ? L ? W = ? L ? Q ( W ) ? ? Q ( W ) ? W = 0 g_{\mathbf{W}}=\frac{\partial L}{\partial \mathbf{W}}=\frac{\partial L}{\partial Q(\mathbf{W})} \cdot \frac{\partial Q(\mathbf{W})}{\partial \mathbf{W}}=0 gW?=?W?L?=?Q(W)?L???W?Q(W)?=0

??如果按照上述式子進(jìn)行梯度計(jì)算,這樣的話梯度就永遠(yuǎn)為 0,無法進(jìn)行梯度更新。因此人們提出了一個(gè)修正的方式,被稱為直通估計(jì)器(Straight-Through Estimator,STE)。在STE中,在STE中,假設(shè)量化和反量化操作不會(huì)改變權(quán)重,此時(shí) W = Q ( W ) W = Q(W) W=Q(W) ? Q ( W ) ? W = 1 \frac{\partial{Q(W)}}{\partial{W}}=1 ?W?Q(W)?=1 ,梯度公式可以轉(zhuǎn)換為如下式子:

g W = ? L ? W = ? L ? Q ( W ) g_{\mathbf{W}}=\frac{\partial L}{\partial \mathbf{W}}=\frac{\partial L}{\partial Q(\mathbf{W})} gW?=?W?L?=?Q(W)?L?

??這樣,量化感知訓(xùn)練就能夠順利地進(jìn)行反向傳播,進(jìn)行權(quán)重更新。

http://m.risenshineclean.com/news/62020.html

相關(guān)文章:

  • 蘇州做網(wǎng)站套路騙寧波網(wǎng)絡(luò)推廣平臺(tái)
  • 大型網(wǎng)站建設(shè)制作平臺(tái)seo推廣的公司
  • 章瑩穎被賣做性奴網(wǎng)站深圳百度seo整站
  • 濰坊大型做網(wǎng)站建設(shè)的公司網(wǎng)站收錄提交入口
  • 保定網(wǎng)站設(shè)計(jì)網(wǎng)站app開發(fā)軟件
  • 為什么不建議去代賬公司廣州網(wǎng)站優(yōu)化系統(tǒng)
  • dede 手機(jī)網(wǎng)站模板徐州網(wǎng)站設(shè)計(jì)
  • 網(wǎng)站建設(shè)套餐寧波關(guān)鍵詞優(yōu)化平臺(tái)
  • table做的電腦端網(wǎng)站改成手機(jī)板純注冊(cè)app拉新掙錢
  • 國內(nèi)一家做國外酒店團(tuán)購的網(wǎng)站域名是什么
  • 靜態(tài)網(wǎng)站模板源碼下載免費(fèi)男女打撲克的軟件
  • 做網(wǎng)站和網(wǎng)站頁面設(shè)計(jì)公司網(wǎng)站建設(shè)開發(fā)
  • 北京網(wǎng)站制作公司清遠(yuǎn)semen是什么意思
  • 營銷型企業(yè)、公司網(wǎng)站案例深圳網(wǎng)站設(shè)計(jì)專家樂云seo
  • 上饒做網(wǎng)站多少錢廣州網(wǎng)站排名優(yōu)化公司
  • 阿里云服務(wù)器上做淘寶客網(wǎng)站濟(jì)南網(wǎng)站建設(shè)方案
  • 杭州做網(wǎng)站 做小程序網(wǎng)站seo優(yōu)化案例
  • 演示網(wǎng)站怎么做在線網(wǎng)頁制作網(wǎng)站
  • 自己可以做裝修效果圖的網(wǎng)站互聯(lián)網(wǎng)推廣工作好做嗎
  • java開發(fā)的手機(jī)網(wǎng)站建設(shè)站長工具日本
  • 福建八大員建設(shè)廳延續(xù)的網(wǎng)站seo索引擎優(yōu)化
  • 做網(wǎng)站需要云數(shù)據(jù)庫嗎企業(yè)網(wǎng)站建設(shè)需要多少錢
  • 開公司 專做網(wǎng)站北京軟件開發(fā)公司
  • 網(wǎng)站怎么做視頻教程百度關(guān)鍵詞快速優(yōu)化
  • 做門的網(wǎng)站建設(shè)百度競價(jià)排名技巧
  • 網(wǎng)站制作 深圳百度賬號(hào)安全中心官網(wǎng)
  • 國外有什么做網(wǎng)站的軟件嗎濟(jì)寧seo公司
  • dw網(wǎng)站根目錄怎么做百度一下你就知道了官網(wǎng)
  • qq手機(jī)版排名優(yōu)化是怎么做的
  • 鄭州建網(wǎng)站多少新聞營銷發(fā)稿平臺(tái)