---
# System prepended metadata

title: 模型壓縮的技術-量化(Quantization)
tags: [Model Compression for Large Language Model]

---

# 模型壓縮的技術

## 前言
在詳細介紹模型的壓縮之前，我想先用『圖片』來開場。

![higher-resolution-image](https://hackmd.io/_uploads/Hk6dpWGS6.jpg =90%x)

觀察上面這兩張照片，大家應該會毫不猶豫的說：
* 右邊照出來的向日葵比較清晰。
* 左邊照出來的向日葵很模糊。

1. 首先我們要知道圖片是由很多很多的小格子所組成的，而每一個小格子我們稱做像素或畫素(pixel)。
2. 如果想要圖片越清楚(不考慮每個格子的顏色)，我們要讓圖片用更多格子來呈現，也就是格子數越多越好。

:::info
所以假設問你上面哪一張圖片是由1600萬畫素的手機拍的？哪一張是由4800萬畫素的手機拍的？

* 很明顯右邊圖片比較清楚，也就是用比較多的小格子組成圖片，所以是由4800萬畫素的手機所拍攝，或者可以說圖片是由4800萬個小格子所構成。
* 而左邊模糊的照片是用比較少小格子所構成，所以是使用1600萬畫素所拍的。
:::

所以根據上面的結論，照片畫素越高越好是嗎？🧐
當然不是啊，最明顯的問題就是：
:::danger
高畫質的照片表示用了更多的小格子來呈現圖片，因此當要儲存圖片時，為了不要漏掉細節，所以每個格子的資訊都要儲存起來，那這樣不就造成：
* 存一張照片要佔用更多記憶體空間。
* 傳送圖片資料時，用更久的時間。
:::

:::success
所以從上面的問題我們開始思考是不是可以『用更少的儲存空間，但依舊保持圖片的高畫質』。

這個概念跟接下來要介紹的模型壓縮很有關係，先簡單讓大家有個感覺😗
:::

## 模型的量化(Quantization)
### 為什麼模型要量化呢？
我們知道一個模型裡面可能有很多層的神經網路。當模型在運作時，就表示內部的數值已經開始一層一層計算。

但是這裡的數值可不是簡單的整數而已，通常是很多bits的浮點數，例如32個bits浮點數的數值(FP32)。

所以要計算這麼多且這麼長位數的數值，在計算上除了很費力外也特別佔用記憶體空間。

:::info
因此是不是有方法可以減少數值的長度(也就是精準度)，但依舊能保持模型的精度呢？

還真有方法，這種方法就叫量化(Quantization)。也就是直接對模型進行壓縮使內部數值的運算都用整數來處理。

而量化又分成2種：
1. Post-training Quantization
2. Quantization aware training

:::warning
為什麼會想要轉成整數呢？
因為整數的儲存相較於浮點數使用更少的記憶體，而且整數的運算也比浮點數快很多。
:::

講到這裡好像很合理但又感覺怪怪的，沒錯我一開始讀到這裡也有這種感覺。怪怪的點是：
* 將浮點數直接轉成整數進行運算的話，例如原本是123.456789轉成整數123之後，在經過模型一層一層的運算後，誤差可能會隨之變大，進一步導致模型在預測結果時出現錯誤，儘管轉成整數後的誤差只有0.456789這麼小的數值。
:::success
也就是如何確保從浮點數轉成整數，使用整數進行運算，運算完後依然保持模型的精度。
:::

## Post-training Quantization
* Definition: 簡單說就是模型的權重(也就是上面說的『數值』)訓練好之後，直接將模型權重轉換成整數。
* [AI模型壓縮技術-量化(Quantization)](https://chih-sheng-huang821.medium.com/ai%E6%A8%A1%E5%9E%8B%E5%A3%93%E7%B8%AE%E6%8A%80%E8%A1%93-%E9%87%8F%E5%8C%96-quantization-966505128365)

## [Quantization aware training](https://arxiv.org/pdf/1712.05877.pdf)
* Definition: 簡單說就是模型的權重直接用整數來進行訓練，但通常在進行整數訓練前，模型會先用浮點數訓練後再用整數來進行Fine-tune訓練。
* 這種方式比Post-training Quantization又更複雜一點。

## Reference

* [A Survey of Model Compression and Acceleration for Deep Neural Networks](https://arxiv.org/pdf/1710.09282.pdf)
* [A Visual Guide to Quantization](https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-quantization)
